C 程序设计

第一章 顺序程序设计

一、常量与变量

  1. 常量
    1. 整型常量
    2. 实型常量
    3. 字符常量
      1. 普通字符——单撇号‘ ’括起来的单个字符
      2. 转义字符——\n
      3. 字符串常量
      4. 符号常量——# define 符号名 常量
  2. 变量 必须先定义,再调用
  3. 常变量 const int a = 3 常变量&符号常量——对符号常量的名字不分配储存单位
  4. 标识符 只能有字母、数字和下划线组成且 第一个字符必须是字母 or 下划线

二、数据类型

  1. 整型

    类型字节数表示范围
    int4 字节-^31^ ~ ^31^-1
    short2 字节-^15^ ~ ^15^-1
    long4 字节-^31^ ~ ^31^-1
    long long8 字节-^63^ ~ ^63^-1
    • unsigned——只储存非负数
  2. 字符型

    • ASCII 字符集共 127 个,可用 7 位 2 进制表示,占用一字节
  3. 浮点型

    Col1Col2Col3
    float4 字节0 及 1.2_1^-38^ ~ 3.4_1^38^
    double8 字节0 及 2.3_1^-308^ ~ 1.7_1^308^
    long double16 字节0 及 3.4_1^-4932^ ~ 1.1_1^4932^

三、运算符

  1. 除法/——两个实数相除是双精度实数,两个整数相除是整数且向零取整
  2. ++i,—i(用前加减 1)
  3. i++,i—(用后加减 1)

四、数据输出

  • printf 函数

    printf(格式控制,输出表列)

  • 格式符

    %nd——输出 int,n 表示域宽

    %c——输出 char

    %s——输出字符串

    %m.nf——输出实数,m 表示域宽,n 表示小数位数,未指定默认输出 6 位

    %-m.nf——同上,但左对齐

    %m.ne——输出指数

    float 转化为 int,只保留整数部分,不四舍五入

    %lf——输出 double float 型

五、输入语句

  • scanf 函数 scanf(格式控制,&变量名)

六、字符输入输出

  • putchar(c)输出
  • getchar(c)输入

第二章 选择结构

if 语句

if (表达式)
{
    循环体
}

关系运算符

  1. 优先级从高到低 !——算数运算符——关系运算符——&&和||——赋值运算符

  2. 条件表达式

表达式 1?表达式 2: 表达式 3

  1. 表达式 1 为真,执行表达式 2,为假,执行表达式 3。

Switch 语句

switch(表达式)
{
    case 常量1 : 语句1 ; break ;
    default : 语句2 ;
}

第三章 循环结构

1. while 语句

while(表达式)
{
    循环体
}

2. do …… while 语句

do
{
    循环体
}
while (表达式)

do while 先执行一次,再判断真假,所以至少执行一次循环体

3. for 语句

for(循环变量赋初值;循环条件;循环变量增值)
{
    循环体
}

4. break 语句&continue 语句

  • break 结束整个循环
  • continue 结束单次循环
  • 循环变量增减应在 break or continue 前

例题

  • 输入两个正整数 m, n,求最大公约数和最小公倍数。 阿基米德法

    #include<stdio.h>
    int main()
    {
        int m, n, p, r, temp;
        printf("please input 2 numbers:");
        scanf("%d%d", &n, &m);
        if (m > n)
        {
         temp = n;
         n = m;
         m = temp;
     }
     p = m * n;
     while (m != 0)
        {
         r = n % m;
      n = m;
      m = r;
     }
     printf("最大公约数:%d\n", n);
     printf("最小公倍数:%d\n", p / n);
     return 0;
    }
    #include<stdio.h>
    int main()
    {
     int m, n, p, q, temp;
     printf("please input 2 numbers:");
     scanf("%d%d", &n, &m);
     if (m > n)
     {
         temp = n;
      n = m;
      m = temp;
     }
     for (p = m; p % n != 0 || p % m != 0; p++);
     for (q = m; n % q != 0 || m % q != 0; q--);
     printf("最大公约数:%d\n", q);
     printf("最小公倍数:%d\n", p);
     return 0;
    }

第四章 利用数组处理批量数据

数组

  1. 一般形式:类型符 数组名[常量表达式]

  2. 引用数组:数组名[下标]

    下标从零开始

  3. 初始化:int a[10]={1,2······}

    未赋值的默认为零

  4. 起泡排序法 e.g. 输入十个数,并将其由小到大排序

    #include<stdio.h>
    int main()
    {
     int a[10];
     int i, j, t;
     printf("input 10 numbers:\n");
     for (i = 0; i < 10; i++)
      scanf("%d", &a[i]);
     printf("\n");
     for (j = 0; j < 9; j++)
      for (i = 0; i < 9 - j; i++)
       if (a[i] > a[i + 1])
        {t = a[i]; a[i] = a[i + 1]; a[i + 1] = t;}
     printf("the sorted numbers:\n");
     for (i = 0; i < 10; i++)
      printf("%d ", a[i]);
     printf("\n");
     return 0;
    }

二维数组

  1. 定义——类型说明符 数组名[常量表达式][常量表达式]

  2. 初始化

    1. 完全赋值——用花括号分行或直接全部输入
    2. 如果全赋值,可只定义第二维长度

字符数组

  1. 定义——char a[n]

  2. c 语言中不存在字符串类型,字符串储存在字符型数组中的。

  3. 字符串结束标志——‘\0’

  4. 定义字符串——char c[]= “abc”

  5. 储存字符串时,系统会自动加一个’\0’, 占用字节加一。

  6. 字符串输出

    for (int i = 0; i < n; i++)
        printf("%c", c[i])
    printf("%s", c)
  7. 字符串输入

    scanf("%s", c)
    • 不加&,因为数组名代表数组的第一个元素的地址

字符串处理函数

下面几个函数在头文件 <string.h> 中

  1. puts 函数——输出字符串

    puts(abc)
  2. gets 函数——输入字符串

    gets(数组名)
  3. strcat 函数——连接字符串

    strcat(字符数组1,字符数组2)
    • 字符串 1 在定义的时候必须有足够长的空位’\0’, 来容纳字符数组 2,不能定义为 str a []
  4. strcpy or strncpy 函数——复制字符串(把字符串 2 复制给字符串 1)

    strcpy(字符数组1,字符数组2)
    strncpy(字符数组1,字符数组2,复制字符数)
  5. strcmp 函数——字符串比较

    strcmp(字符数组1,字符数组2)
  6. strlen 函数——测量字符串长度

    strlen(字符数组)
  7. strlwr and strpr 函数——全小写 和 大写

    strlwr()

第四章 函数

定义函数

类型名 函数名(形参)
{
    函数体
}

调用函数

  1. 函数名(实参表列) 调用过程:把实参的值赋给形参,运用形参进行运算,最后通过 return 把指定的值带回给函数。

  2. 函数的返回值与函数的定义不同时,以函数定义为准。

  3. 对于不带返回值的函数定义为 void 类。

  4. 自行定义的函数应该放在主函数的后面,同时要在主函数中进行声明。

局部调用与全局变量

  1. 全局变量:定义在函数之外,作用范围为定义位置到文件末尾
  2. 局部变量:定义在函数内,只作用在此函数内,也可定义在复合语句内,只作用与复合语句内。

第五章 指针

指针基础概念

  1. 指针——带类型的地址。

  2. 指针变量——用来储存另一个变量的地址(即指针),定义类型为指针的类型。

  3. 指针变量的定义

    类型名 *指针变量名;
  4. 指针变量&*指针变量

    前者为指针变量,在赋值时使用;后者对应指针变量对应的指针,在调用时用
    对p赋值,是更改p所指向的变量 e.g. p=&a
    *p赋值,是更改a的值e.g. *p=1

通过指针引用数组

  1. 数组名代表首个元素的位置

  2. 指针指向数组元素时,加减代表指向下一个和上一个元素

  3. []实际是变址运算符,a [i] 表示 a+i 的地址

  4. 指针

    *(p+5)  *(a+5)  a[5] 等价
  5. 指针变量相减表示元素相对位置 e.g. p2 指向 a [5],p1 指向 a [3], p2-p1 = 2

  6. ++ & *

    p = a[0];
    *p++ = *(p++) = a[0];
    *(++p) = a[1];
  7. 用数组名做函数参数 fun (int p []) = fun(int *p)

用指针应用多维数组

  1. 理解:int a[3][3] 由三个一维数组(a [0], a [1], a [2])组成
    avatar

用指针引用字符串

  1. char *string = "hello";
    与下面两行等价
    char *string;
    string = "hello";
  2. 指针指向的是字符串的第一个字符

指向函数的指针

  1. 定义:类型名 (*指针名)(函数形参表列)

  2. 用指针调用函数

    int max(int);
    int (*p)(int);
    int a,b;
    b=(*p)(a);

指针数组

  1. 定义:类型名 *数组名 [数组长度]

  2. 指向指针数据的指针变量:类型名 **指针名

动态内存分配

  1. malloc 开辟动态存储区

    void *malloc(unsigned int size);

    函数值为第一个字节的位置

  2. calloc 开辟动态存储区

    void *calloc(unsigned n, unsigned size);

  3. relloc 重新分配动态存储区

    void *relloc(void *p, unsigned int size);

  4. free 释放动态存储区

    void free(void *p); 

上述几个函数在头文件

指针总结

avatar

第六章 结构体变量

定义和使用结构体变量

  1. 声明:

    struct 结构体名
    {成员表列}变量名表列;
  2. 调用变量中成员的值:

    结构体变量名.成员名
  3. 初始化某一成员

    struct 结构体名 变量名 = {.成员名 = 值}
    or
    变量名.成员名 =

使用结构体数组

  1. 声明:

    struct 结构体名
    {成员表列}数组名[数组长度];

结构体指针

  1. 声明:

    struct 结构体名 *p;
  2. 通过指针调用成员

    变量名.成员名;
    (*p).成员名;
    p->成员名;

用指针处理链表

枚举类型

  1. 声明:

    enum 枚举变量{枚举元素}

声明新型类型名

第七章 对文件的输入与输出