• C:复习


    C语言程序设计基础知识

    C语言特点

    1、是一种兼有高级语言和汇编语言优点的语言

    2、是一种结构化程序设计语言

    3、数据类型丰富

    4、具有丰富的运算符

    5、具有预处理功能

    合理算法的特点

    1、有输入

    2、有输出

    3、有穷性

    4、确定性

    5、高效性

    C语言程序的特点

    1、对大小写是有区分的

    2、不存在行概念

    3、充分利用注解

    4、把程序中的语句根据其功能和嵌套关系进行缩进编排,使程序的模块和复合关系都变得明显

    5、一对花括号标志一个程序功能模块的开始与结束

    6、在程序适当使用空格和空行会是程序变得更加清晰

    程序结构

    C语言程序为函数模块结构,每一个C语言程序都是由一个或多个函数组成,其中至少一个main函数,程序从main函数开始执行,在执行过程中可以调出有编译系统提供的各种彼岸准库函数和自定义函数

    基本形式:

    类型定义符 函数名(形式参数)
    {
           数据说明部分;
           语句部分;      
    }

    基本语法单位

    1、字符集

    2、标识符 :只能由数字、下划线和数字组成,且第一个字符必须是字母或下划线

    3、关键字

    存储类型关键字:auto、extern、register、static

    4、运算符和分隔符

    5、常量和变量

    基本数据类型及运算

    数据类型

    基本数据类型

    整型、字符型、单精度浮点型、双精度浮点型

    常量

    1、整型常量:十进制整常量、八进制整常量、十六进制整常量、无符号型后缀(U)、长型后缀(L)

    2、浮点型常量:十进制数形式、指数形式

    3、字符型常量:【单括号括起】 简单转义字符、八进制转义字符、十六进制转义字符

    4、字符串常量:【双括号括起、后自动加上 ''】 

    5、符号常量:宏定义【#define】 、const类型定义符

    变量

    参考:链接

    算符与表达式

    1、算术运算符和算术表达式

     

    结合方向:自左向右

    2、赋值运算符和赋值表达式

    结合方向:自右向右左

    3、关系运算符和关系表达式

    结合方向:自左向右

    4、逻辑运算符和逻辑表达式

    结合方向:自左向右 

    5、位运算符和位表达式

     

     结合方向:自左向右 

    6、条件运算符和条件表达式

     三目运算符:

    7、逗号运算符和逗号表达式

    逗号用途:运算符【优先级最低】、分隔符

    运算的优先级与结合性

    数据的输入输出

    参考:链接

    控制语句

    程序的三种基本结构

    顺序

    分支

    循环

    循环嵌套

    循环嵌套时内层循环必须完全包含在外层循环内,不允许循环结构交叉

    数组和结构

    维数组

    1、常量表达式中不允许包含变量

    int n = 10;
    int score[n];

    2、数组先定义【即分配存储空间】后使用

    二维数组

    1、可以省略第一维的长度,不能省略第二维的长度

    字符数组

    1、单个字符赋初值

    2、字符串赋初值:自动在后加上一个终止符,即数组长度加一

    3、输入和输出

    (1)逐个字符输出和输入

     由循环次数控制字符长度,不检测字符串结束标志

    (2)字符串整体输入输出

     或者:

    gets(字符数组名)

    puts(字符数组名)

    字符串处理函数

    参考链接

    结构

    结构数组

    指针

    参考链接

    函数

    模块化程序设计方法

    在求解一个问题时,采样逐步求解、分而治之的方法,就是把一个大问题分解成若干比较好求的小问题,然后分别求解。

    在处理一个复杂的应用程序也是如此,把整个程序划分为若干功能较为单一的程序模块。然后分别寄予实现,最后爱吧所有的程序模块像搭积木似的一起装配起来。

    函数参数

    参考

    1、传值调用

    把实参的值传递给形参,而被调用函数中形参的改变对调用函数的实参没有影响,这相当于把实参赋值一份给形参,然后调用内存回收。

    int sum(int x,int y){
        return x+y;
    }
    int mian(){
        int result=sum(2,3);//通过直接对sum传递参数
        printf("%d",result);
        return 0;
    }

    2、传址调用

    地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

      #include<stdio.h>
    
      int sum(int *x,int *y){
    
        return *x+*y;//表示获取x中的内容+y中内容
    
      }
    
      int main(){
    
        int a,b;
    
        a=2;b=3;
    
        int result=sum(&a,&b);//通过地址对sum传递参数
    
        printf("%d
    ",result);
    
        return 0;
    
      }

    3.引用传递

    以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便,自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。引用相当于实参的别名,他和实参是同一个变量或数值,它的改变就是实参的改变。

      int sum(int &x,int &y){     //定义引用类型
    
        return x+y;
    
      }
    
      int  main(){
    
        int a,b;
    
        a=2;b=3;
    
        int result=sum(a,b);//通过引用对sum传递参数
    
        printf("%d
    ",result);
    
        return 0;
    
      }

    例题:

    在调用函数时,如果形参和实参分别是下列情况,则相应的调用方式是什么?(5分)   【见2012年笔试题2.3】

    (1) 实参和形参都是数组元素   //传值调用(值传递)

    (2) 形参是指针  //传地址调用(地址传递)

    (3) 实参和实参都是数组  //传地址调用(地址传递)

    函数与数组

    数组元素函数实参,数组名作为函数参数

     

    函数与指针

    1、返回指针的函数

     

    举例:

    #include <stdio.h>
    #include <stdlib.h>
    int count;
    int main()
    {
        char s[80],ch,*p,*match();
    
        gets(s);
        ch = getchar();
        p = match(ch,s);
        if(p)
        printf("%s  %d
    ",p,(count + 1));
        else
        printf("no match found
    ");
        return 0;
    }
    
    char *match(c,s)
    char c, *s;
    {
        count = 0;
        while(c != s[count] && s[count] != '')
        {
            count++;
        }
        if(s[count])
            return (&s[count]);
        return (0);
    }

    2、指向函数的指针

     

     例子:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int main()
    {
        int strcmp(),numcmp();
        char s1[80],s2[80];
    
        printf("请输入两个字符串:
    ");
        gets(s1);
        gets(s2);
        if(isalpha(*s1)) // isalpha(*s1)用于检测数组s1中是否是字符串,
            check(s1,s2,strcmp); // strcmp()字符串比较库函数
        else  // 若是数字字符串
            check(s1,s2,numcmp); // numcmp() 使用库函数atoi(),把以字符串的方式输入的数字转换为整型数
    }
    
    check(a,b,cmp)
    char *a,*b;
    int (*cmp)();
    {
        printf("检测结果为:
    ");
        if(!(*cmp)(a,b)) //返回不为0时
            printf("相同!
    ");
        else
            printf("不相同!
    ");
    }
    
    numcmp(a,b)
    char *a,*b;
    {
        if(atoi(a) == atoi(b))
            return 0;
        else
            return 1;
    }

    递归函数

    参考:链接

    预处理功能

    宏定义

    1、简单地字符替换

     

    2、带参数的宏定义和宏调用

    文件包含

    条件编译

    令源程序中其中一部分内容安装在满足一定条件时才进行编译,这就是条件编译

    #if条件编译

    #ifdef条件编译

    #ifndef 条件编译

    变量的存储类型

    内部变量

    又叫“局部变量

    外部变量

    又叫“全局变量

    总结:

    静态变量

    举例:

    寄存器变量

    变量的初始化

    动态内存分配函数

    动态内存分配的优点:

    1、在程序执行过程中,同一内存空间能用于几个不同的目的,即在程序晕死那个的不同阶段,同一内存能为程序的不同部分服务,这个内存区域就是堆区 

    2、允许建立链表

    1、malloc()

     使用原理:在调用该函数时,它将在内存中分配size个字节的存储空间,返回指向分配的存储区起始地址的指针;若不能获得需要的存储空间,则返回null。

    由于malloc()的返回值是无类型void的指针,即返回的地址值可以指向任何合法的数据类型,因此将返回值赋予一定数据类的指针变量时,应该对返回值实行强制类型转换

    2、free()

    文件管理

    流和文件

    1、文本流

    一行行的字符,换行符表示结束

    2、二进制流

    由一系列字节组成的

    文件

    通常指存放在外部存储器上的一批数据的集合,如:磁盘文件,磁带文件等,外部设备也被成为文件,因此,文件表示从磁盘、光盘文件到所有的外部设备

    C语言的文件系统:

    1、缓冲型文件

    提供的函数叫做“流式I/O函数”,采用缓冲存储区域

    2、非缓冲型文件

    提供的函数叫做“低级I/O函数”,直接调用系统的输入输出功能

    字符输入输出:getcharputchar

    字符串输入输出:getsputs

    参考:链接

    文件管理

    参考链接

    C程序应用

    排序算法

    参考:链接

    递归算法

    参考:链接

    文件相关算法

    线性链表算法

    的基本算法

    树的基本算法

  • 相关阅读:
    初探 Redis 客户端 Lettuce:真香!
    vscode 代码中查找并替换为换行符
    Jenkins Kubernetes插件添加 云
    Jenkins kubernetes插件的原理
    jenkins pipeline实现自动构建并部署至k8s
    python3 requests中的 stream参数
    rsync 开启用户密码认证
    rancher1版本 基本使用
    nginx http跳https
    sed合并多条指令修改文本
  • 原文地址:https://www.cnblogs.com/pam-sh/p/12892370.html
Copyright © 2020-2023  润新知