C 程序设计
第一章 顺序程序设计
一、常量与变量
- 常量
- 整型常量
- 实型常量
- 字符常量
- 普通字符——单撇号‘ ’括起来的单个字符
- 转义字符——\n
- 字符串常量
- 符号常量——# define 符号名 常量
- 变量 必须先定义,再调用
- 常变量 const int a = 3 常变量&符号常量——对符号常量的名字不分配储存单位
- 标识符 只能有字母、数字和下划线组成且 第一个字符必须是字母 or 下划线
二、数据类型
-
整型
类型 字节数 表示范围 int 4 字节 -^31^ ~ ^31^-1 short 2 字节 -^15^ ~ ^15^-1 long 4 字节 -^31^ ~ ^31^-1 long long 8 字节 -^63^ ~ ^63^-1 - unsigned——只储存非负数
-
字符型
- ASCII 字符集共 127 个,可用 7 位 2 进制表示,占用一字节
-
浮点型
Col1 Col2 Col3 float 4 字节 0 及 1.2_1^-38^ ~ 3.4_1^38^ double 8 字节 0 及 2.3_1^-308^ ~ 1.7_1^308^ long double 16 字节 0 及 3.4_1^-4932^ ~ 1.1_1^4932^
三、运算符
- 除法/——两个实数相除是双精度实数,两个整数相除是整数且向零取整
- ++i,—i(用前加减 1)
- 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: 表达式 3
- 表达式 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; }
第四章 利用数组处理批量数据
数组
-
一般形式:类型符 数组名[常量表达式]
-
引用数组:数组名[下标]
下标从零开始
-
初始化:int a[10]={1,2······}
未赋值的默认为零
-
起泡排序法 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; }
二维数组
-
定义——类型说明符 数组名[常量表达式][常量表达式]
-
初始化
- 完全赋值——用花括号分行或直接全部输入
- 如果全赋值,可只定义第二维长度
字符数组
-
定义——char a[n]
-
c 语言中不存在字符串类型,字符串储存在字符型数组中的。
-
字符串结束标志——‘\0’
-
定义字符串——char c[]= “abc”
-
储存字符串时,系统会自动加一个’\0’, 占用字节加一。
-
字符串输出
for (int i = 0; i < n; i++) printf("%c", c[i])printf("%s", c) -
字符串输入
scanf("%s", c)- 不加&,因为数组名代表数组的第一个元素的地址
字符串处理函数
下面几个函数在头文件 <string.h> 中
-
puts 函数——输出字符串
puts(abc) -
gets 函数——输入字符串
gets(数组名) -
strcat 函数——连接字符串
strcat(字符数组1,字符数组2)- 字符串 1 在定义的时候必须有足够长的空位’\0’, 来容纳字符数组 2,不能定义为 str a []
-
strcpy or strncpy 函数——复制字符串(把字符串 2 复制给字符串 1)
strcpy(字符数组1,字符数组2)strncpy(字符数组1,字符数组2,复制字符数) -
strcmp 函数——字符串比较
strcmp(字符数组1,字符数组2) -
strlen 函数——测量字符串长度
strlen(字符数组) -
strlwr and strpr 函数——全小写 和 大写
strlwr()
第四章 函数
定义函数
类型名 函数名(形参)
{
函数体
}调用函数
-
函数名(实参表列) 调用过程:把实参的值赋给形参,运用形参进行运算,最后通过 return 把指定的值带回给函数。
-
函数的返回值与函数的定义不同时,以函数定义为准。
-
对于不带返回值的函数定义为 void 类。
-
自行定义的函数应该放在主函数的后面,同时要在主函数中进行声明。
局部调用与全局变量
- 全局变量:定义在函数之外,作用范围为定义位置到文件末尾
- 局部变量:定义在函数内,只作用在此函数内,也可定义在复合语句内,只作用与复合语句内。
第五章 指针
指针基础概念
-
指针——带类型的地址。
-
指针变量——用来储存另一个变量的地址(即指针),定义类型为指针的类型。
-
指针变量的定义
类型名 *指针变量名; -
指针变量&*指针变量
前者为指针变量,在赋值时使用;后者对应指针变量对应的指针,在调用时用 对p赋值,是更改p所指向的变量 e.g. p=&a 对*p赋值,是更改a的值e.g. *p=1
通过指针引用数组
-
数组名代表首个元素的位置
-
指针指向数组元素时,加减代表指向下一个和上一个元素
-
[]实际是变址运算符,a [i] 表示 a+i 的地址
-
指针
*(p+5) *(a+5) a[5] 等价 -
指针变量相减表示元素相对位置 e.g. p2 指向 a [5],p1 指向 a [3], p2-p1 = 2
-
++ & *
p = a[0]; *p++ = *(p++) = a[0]; *(++p) = a[1]; -
用数组名做函数参数 fun (int p []) = fun(int *p)
用指针应用多维数组
- 理解:
int a[3][3]由三个一维数组(a [0], a [1], a [2])组成

用指针引用字符串
-
char *string = "hello"; 与下面两行等价 char *string; string = "hello"; -
指针指向的是字符串的第一个字符
指向函数的指针
-
定义:类型名 (*指针名)(函数形参表列)
-
用指针调用函数
int max(int); int (*p)(int); int a,b; b=(*p)(a);
指针数组
-
定义:类型名 *数组名 [数组长度]
-
指向指针数据的指针变量:类型名 **指针名
动态内存分配
-
malloc 开辟动态存储区
void *malloc(unsigned int size);函数值为第一个字节的位置
-
calloc 开辟动态存储区
void *calloc(unsigned n, unsigned size);
-
relloc 重新分配动态存储区
void *relloc(void *p, unsigned int size);
-
free 释放动态存储区
void free(void *p);
上述几个函数在头文件
指针总结

第六章 结构体变量
定义和使用结构体变量
-
声明:
struct 结构体名 {成员表列}变量名表列; -
调用变量中成员的值:
结构体变量名.成员名 -
初始化某一成员
struct 结构体名 变量名 = {.成员名 = 值} or 变量名.成员名 = 值
使用结构体数组
-
声明:
struct 结构体名 {成员表列}数组名[数组长度];
结构体指针
-
声明:
struct 结构体名 *p; -
通过指针调用成员
变量名.成员名; (*p).成员名; p->成员名;
用指针处理链表
枚举类型
-
声明:
enum 枚举变量{枚举元素}