翁恺C语言
翁恺老师C语言课大纲
C语言程序设计
1.1.1 计算机和编程语言
1.1.2 计算机的思维方式
1.2.1 为什么是C
1.2.2 简单历史
1.2.3 编程软件
1.3.1 第一个C程序
1.3.2 详解第一个程序
1.3.3 做点计算
1.3.4 Mac OS X如何在命令行编辑、编译和运行C程序
2.1.1 第二周
2.1.2 变量定义
2.1.3 变量赋值与初始化
2.1.4 变量输入
2.1.5 常量vs变量
2.1.6 浮点数
2.2.1 表达式
2.2.2 运算符优先级
2.2.3 交换变量
2.2.4 复合赋值和递增递减
2.2.5 如何使用PAT系统来做编程练习题
3.0.1 PAT再解释
3.0.2 第二周习题解析
3.0.3 0的故事
3.1.1 做判断
3.1.2 判断的条件
3.1.3 找零计算器
3.1.4 否则的话
3.1.5 if语句再探
3.2.1 嵌套的if-else
3.2.2 级联的if-else if
3.2.3 if-else的常见错误
3.2.4 多路分支
4.1.1 循环
4.1.2 while循环
4.1.3 do-while循环
4.2.1 循环计算
4.2.2 猜数游戏
4.2.3 算平均数
4.2.4 整数逆序
5.1.1 for循环
5.1.2 循环的计算和选择
5.2.1 循环控制
5.2.2 嵌套的循环
5.2.3 从嵌套的循环中跳出
5.3.1 前n项求和
5.3.2 整数分解
5.3.3 求最大公约数
6.0.1 编程练习解析4-0:给定条件的整数集
6.0.2 编程练习解析4-1:水仙花数
6.0.3 编程练习解析4-2:九九乘法表
6.0.4 编程练习解析4-3:统计素数求和
6.0.5 编程练习解析4-4:猜数游戏
6.0.6 编程练习解析5-0:n项求和
6.0.7 编程练习解析5-1~5-3
6.1.1 数据类型:C语言有哪些基础数据类型,sizeof可以做什么
6.1.2 整数类型:除了int,还有多少整数类型
6.1.3 整数的内部表达:整数是如何表达的,尤其是负数如何表达
6.1.4 整数的范围:如何推算整数类型所能表达的数的范围,越界了会怎样
6.1.5 整数的格式化:如何格式化输入输出整数,如何处理8进制和16进制
6.1.6 选择整数类型:没什么特殊需要就只用int就好了
6.1.7 浮点类型:double和float,它们是什么,如何输入输出
6.1.8 浮点的范围与精度:浮点数到底能表示哪些数
6.1.9 字符类型:char是整数也是字符
6.1.1 0逃逸字符:反斜杠开头的字符是特殊的控制字符
6.1.11 类型转换:如何在不同类型之间做转换
6.2.1 逻辑类型:表示关系运算和逻辑运算结果的量
6.2.2 逻辑运算:对逻辑量进行与、或、非运算
6.2.3 条件运算与逗号运算
第一次单元测验
7.1.1 初见函数
7.1.2 函数的定义和调用
7.1.3 从函数中返回
7.2.1 函数原型:用来告诉编译器这个函数长什么样儿
7.2.2 参数传递:调用函数的时候,是用表达式的值来初始化函数的参数
7.2.3 本地变量:定义在函数内部的变量是本地变量,参数也是本地变量
7.2.4 函数庶事:一些有关函数的细节问题,main()是什么
8.1-1 初试数组
8.1-2 数组的使用:如何定义和使用数组,数组的下标和下标的范围
8.1-3 数组的例子:统计个数
8.2-1 数组运算
8.2-2 数组例子:素数
8.2-3 二维数组
9.1-1 取地址运算:&运算符取得变量的地址
9.1-2 指针:指针变量就是记录地址的变量
9.1-3 指针的使用:指针有什么用呢?
9.1-4 指针与数组:为什么数组传进函数后的sizeof不对了
9.1-5 指针与const:指针本身和所指的变量都可能const
9.2-1 指针运算
9.2-2 动态内存分配
10.1-1 字符串
10.1-2 字符串变量
10.1-3 字符串输入输出
10.1-4 字符串数组,以及程序参数
10.2-1 单字符输入输出,用putchar和getchar
10.2-2 字符串函数strlen
10.2-3 字符串函数strcmp
10.2-4 字符串函数strcpy
10.2-5 字符串函数strcat
10.2-6 字符串搜索函数
第二次单元测验
A0-1 ACLLib介绍,看几个小游戏的演示
A0-2 Win32API简单介绍,太难了,不学!
A0-3 Dev C++建ACLLib项目,第一个窗口跑起来
A0-4 ACLLib的基本绘图函数
11.1-1 枚举
11.2-1 结构类型
11.2-2 结构与函数
11.2-3 结构中的结构
11.3-1 类型定义
11.3-2 联合
12.1-1 全局变量:定义在函数之外的变量,全局的生存期和作用域
12.1-2 静态本地变量:能在函数结束后继续保有原值的本地变量
12.1-3 后记:返回指针的函数,使用全局变量的贴士
12.2-1 宏定义
12.2-2 带参数的宏
12.3-1 多个源代码文件
12.3-2 头文件
12.3-3 声明
13.1-1 格式化输入输出
13.1-2 文件输入输出
13.1-3 二进制文件
13.2-1 按位运算
13.2-2 移位运算
13.2-3 位运算例子
13.2-4 位段
14.1-1 可变数组
14.1-2 可变数组的数据访问
14.1-3 可变数组的自动增长
14.2-1 可变数组的缺陷
14.2-2 链表
14.2-3 链表的函数
14.2-4 链表的搜索
14.2-5 链表的删除
14.2-6 链表的清除
期末考试
日常测验
第二周 计算
2.1 变量
有效变量名
以下哪些是有效的变量名?
A.main
B.4ever
C.monkey-king
D.__int
正确答案:A、D
注:main不是C语言的关键字,所以是有效变量名
附上C语言关键字
关键字 | 说明 |
---|---|
auto | 声明自动变量 |
short | 声明短整型变量或函数 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数 |
float | 声明浮点型变量或函数 |
double | 声明双精度变量或函数 |
char | 声明字符型变量或函数 |
struct | 声明结构体变量或函数 |
union | 声明共用数据类型 |
enum | 声明枚举类型 |
typedef | 用以给数据类型取别名 |
const | 声明只读变量 |
unsigned | 声明无符号类型变量或函数 |
signed | 声明有符号类型变量或函数 |
extern | 声明变量是在其他文件正声明 |
register | 声明寄存器变量 |
static | 声明静态变量 |
volatile | 说明变量在程序执行中可被隐含地改变 |
void | 声明函数无返回值或无参数,声明无类型指针 |
if | 条件语句 |
else | 条件语句否定分支(与 if 连用) |
switch | 用于开关语句 |
case | 开关语句分支 |
for | 一种循环语句 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
goto | 无条件跳转语句 |
continue | 结束当前循环,开始下一轮循环 |
break | 跳出当前循环 |
default | 开关语句中的“其他”分支 |
sizeof | 计算数据类型长度 |
return | 子程序返回语句(可以带参数,也可不带参数)循环条件 |
第三周 判断
3.2 分支
break和continue
写出程序的输出:
int i=1;
switch ( i%3 ) {
case 0: printf("zero");
case 1: printf("one");
case 2: printf("two");
}
正确答案:onetwo
因为case 1后面并没有break;所以要一直跑下去,直至switch中的语句结束或遇到break
真正的代码应该为:
int i=1;
switch ( i%3 ) {
case 0: printf("zero"); break;
case 1: printf("one"); break;
case 2: printf("two"); break;
}
break 用来结束所有循环,循环语句不再有执行的机会;
continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
第五周 循环控制
5.1 第三种循环
i++和for循环
以下代码段的输出是什么?
for ( int i=10; i> 1; i /=2 ) {
printf("%d ", i++);
}
正确答案:10 5 3 2
解析:i=10 ——输出10 ——i赋值为11——i=5
i=5 ——输出5 ——i赋值为6——i=3
i=3 ——输出3 ——i赋值为4——i=2
i=2——输出2 ——i赋值为——i=1
i=1——表达式2为假——跳出循环
附注:for语句的执行过程
1.求解表达式1。
2.求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步。
3.求解表达式3。
4.转回上面第2步继续执行。
5.循环结束,执行 for 语句下面的语句。
第六周 数据类型
6.1 数据类型
字母在数字后面表示类型
以下哪个字母不能在数字后面表示类型?
A.F
B.U
C.L
D.X
正确答案:D
U表示该常数用无符号整型方式存储,相当于 unsigned int,如32U
L表示该常数用长整型方式存储,相当于 long,如32L
F表示该常数用浮点方式存储,相当于 float,如32F
变量所占字节
以下哪个数字占据的空间最大?
A.32768
B.‘3’
C.32768.0
D.32768.0F
正确答案:C
类型 | 字节长度 |
---|---|
char | 1 |
short | 2 |
int | 不同系统不一样 |
float | 4 |
double | 8 |
long | 不同系统不一样 |
long long | 8 |
1字节表示 8bit
switch-case的判断变量类型
以下哪种类型不能用在switch-case的判断变量中:
A.char
B.short
C.int
D.double
正确答案:D
switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和bool类型
第七周 函数
7.2 函数的参数和变量
函数原型
以下哪句不是正确的原型?
A.int f();
B.int f(int i);
C.int f(int);
D.int f(int i) {}
正确答案:D
解析:D选项是函数定义,不是函数原型
void
以下哪个函数的定义是错误的?
A.void f() {}
B.void f(int i) { return i+1; }
C.void f(int i) {}
D.int f() { return 0; }
正确答案:B
解析:错在函数的返回值。
正确的应该是:
int f (int i)
{
return i + 1;
}
此处知识点为函数的定义。
函数定义的语法形式是:
类型标识符 函数名(形式参数表)
{
语句序列
}
类型标识符是函数的类型,就是常说的函数的返回值类型。函数的返回值可以返回给主调函数使用,由return语句给出,比如:return 0。没有返回值的函数的类型标识符为void,不需要写return语句。函数都有自己的类型,除void类型的函数外都有自己的返回值。
总结:void没有返回值,不需要return
第九周 指针
9.2 指针运算
内存
对于以下代码段,正确的说法是:
char *p;
while (1) {
p = malloc(1);
*p = 0;
}
A.最终程序会因为没有没有空间了而退出
B.最终程序会因为向0地址写入而退出
C.程序会一直运行下去
D.程序不能被编译
正确答案:B
解析:当得不到内存时,程序不会自动退出,而是malloc返回了0(也就是NULL),然后让程序去处理。这个程序导致退出的原因不是没有内存了,而是它在这里只是写入,最终会因为向0地址写入而崩溃。
数组下标越界
对于以下代码段:
int a[] = {
1,2,3,4,5,};
int *p = a;
int *q = &a[5];
printf("%d", q-p);
当sizeof(int)为4时,以下说法正确的是:
A.因为第三行的错误不能编译
B.因为第三行的错误运行时崩溃
C.输出5
D.输出20
正确答案:C
这里只是指针p加了5而已,并没有动到里面的数据,动到该内存(变量)也不会出现系统崩溃。
[ ]符号代表取偏移地址的内容。a[5]表示取指针向后偏移5个指针a所指类型数据长度的位置处的内容。C语言不检查数组越界,因此a[5]在编译期不会报错。&a[5]代表该位置的地址,相当于a+5。因此q-p相当于a+5-a,答案自然为5。
因为&是取址运算符,注意,是运算,所以并不会读写那个并不属于你的空间,因此不会跳出错误。最后的q-p实际上等于 q 地 址 − p 地 址 的 偏 移 量 q地址-p地址的偏移量 q地址−p地址的偏移量,系统很智能的给出了偏移5个int
malloc和数组
使用malloc就可以做出运行时可以随时改变大小的数组
A. √ √ √
B. × × ×
正确答案:B
realloc才可以在运行时改变空间的大小(数组的大小),malloc只能用于申请内存空间,但该函数无法重新调整空间大小。
第一次单元测验
X++的输出值
下列程序段输出结果为:
int x=1, y=012;
printf(“%d”,y*x++);
得分/总分
A.12
B.24
C.10
D.20
正确答案:C
X++的结果是加1以前的值,而++X是加1以后的值
短路效应
以下代码的输出是 _____.
int x=0, y=0, z=0;
z = (x==1) && (y=2);
printf("%d ", y);
正确答案:0
代码第二行 x!=1 导致&&直接输出为0,并不去算右边的 y=2 ,所以y的值还是0
sizeof()
以下代码段的结果是:
int i=10;
long long t = sizeof(i++);
printf("%d", i);
正确答案:10
sizeof()是静态运算符
if语句的包含范围
以下代码的输出是 :
int i,x,y;
i=x=y=0;
do {
++i;
if ( i%2 )
x+=i,
i++;
y +=i++;
} while ( i<=7 );
printf("%d %d %d"