c语言考试复习大纲.docx
《c语言考试复习大纲.docx》由会员分享,可在线阅读,更多相关《c语言考试复习大纲.docx(17页珍藏版)》请在冰豆网上搜索。
c语言考试复习大纲
武汉理工大学管理学院2014级c语言考试梳理
第一章概览
C语言起源:
1972年贝尔实验室
许多计算机语言Basic模仿英语
C语言是为编程人员开发的语言
计算机工作的基本原理
cpu进行绝大多数计算工作,
内存指令->cpu寄存器->cpu计算执行
c语言是高级语言
强大高效可移植面向编程人员
缺点:
(1)给了比较大的自由度,风险也上升,尤其是指针
(2)运算符丰富,组合起来难以理解
c是最接近底层的高级语言
编程机制:
编译器将c源代码编译成机器语言生成目标代码文件,
链接器向最终程序加入代码,启动代码(不同操作系统启动代码不同),库函数。
。
生成可执行文件.exe
C语言标准:
c99
一个实例
#include//#是一个预处理例子
#defineAGE“Howoldareyou?
”
/*宏定义指令无参宏有参宏
无参宏:
#define标识符字符
有参宏:
#define标识符(参数)字符表达式*/
intmain(void)
{
inta;//a为标识符int为关键字之一
printf(AGE);
scanf(“%d”,&a);//输出控制&取地址符
return0;
}
printf(“字符串”,变量列表)
printf():
%d%o%x%X%u
%f%e%E
%c%s
附加格式字符%5d%05d%+5d%+-5d%.5f%7.1f%#x%#X
scanf(“字符串”,&变量)
scanf()注意事项输入遇到空白字符时停止输入
代码规范性
第二章基本数据类型和运算符
程序运行离不开数据
2.1基本数据类型
现在所学的
基本型:
整型实型字符型(枚举类型enum)
指针类型
构造类型:
数组array结构struct联合(共用体)union
2.2常量
整型常量:
十进制八进制:
012十六进制:
0Xfff存储方式其实都一样
后缀ULUL
实型常量(浮点型):
十进制小数0.000000
指数形式:
3.2e51e+0120e5-0.45e-4
默认为double可用后缀F或L进行类型转换
字符常量:
‘a’‘d’‘$’空字符:
‘\0’
转义字符‘\n’‘\t’‘\’’‘\”’‘\ddd’‘\xhh’
字符串常量
“字符串”
分多行输出:
printf(“Thisisthefirstline\
Thisisthefirstline\n”);
printf(“Thisisthefirstline”,
“Thisisthefirstline\n”);
printf(“Thisisthefirstline”);
printf(“Thisisthefirstline”);
符号常量定义了符号常量之后,与字符串序列等价
#define或类型限定符const或枚举类型enum
2.3变量
变量声明变量赋值/初始化
先定义才能使用
一个函数中变量名不能重复,标识符不能重复
2.4指针变量
int*p;p的类型是int*,p是一个指向int类型整数的指针
指针运算符*取值;&取地址
&*互为逆运算
指针变量初始化才有意义
inta;
p=&a;p中只能存放同类型变量的地址这里都为int
2.5运算符与表达式
用运算符将若干个式子连接起来构成的式子叫做表达式
求表达式的值在考试中经常见到,直接或者间接的考
2.5.1算术运算符和算术表达式
+-(正和负)+5(右往左)优先级比下面几个高
+-(加和减)*/%(左往右)5.0/2==2.500000
各个注意事项
左右两边类型不一致,自动升级为高等级类型,混合类型中有float类型,会被升级为double
/整数相除要注意,会舍去小数部分,或者说是类型相同时,值的类型也相同
指针用加减的注意事项
%注意事项
字符型操作数,比如‘a’,会将字符型转为整数型,用字符的ASCII码值参加运算
‘a’+3==‘d’
2.5.2赋值运算符和赋值表达式
=+=-=*=/=%=
性质:
所有的优先级相同,结合方向为从右至左。
优先级低于算术运算符
注意优先级所带来的赋值问题a*=3+2
整体表达式的值是最后一次运算之后的值
inta=9,b=5;b=(a=4)/(b=a)值为1
赋值表达式左右类型不一致时的类型转换规则:
整型数据赋给实型变量时,值大小不变
实型赋给整型会舍弃小数部分
float赋给double数值不变,double赋给float截取前七位有效位
整型长的赋给短的,截取相应大小的低字节位;短的赋给长的,
若有符号将符号值填充多出来的高位(0为正1为负),无符号的就用0填充多出来的字节
2.5.3自增和自减运算符
a++++a顺序问题a++就是先用a,再让a增加1
a----a++a就是先让a增加1,再用a
只能用于变量,不能用于常量和表达式,即不能有3++(d=3)++之类
最好只用在整数上,浮点数最好不用
++--单目,优先级比双目高,与+-(正负)优先级相同
-d--结合方向都是从右向左所以可以看做-(d—)
指针变量自增运算
int*p;intx=2;p=&x;
++p
2.5.4逗号运算符和逗号表达式
优先级在所有运算符中最低,结合方向从左往右,顺序执行,
最后一个表达式的值就是整个逗号表达式的值
注意与函数调用,声明等中出现的,的区别,这里面的,只是个分隔符
2.5.5其他运算符
强制类型转换运算符
(int)3.2
sizeof运算符
用法:
sizeof(表达式)或者sizeof(数据类型)
输出可用%z,是一种由u改造的类型,所以输出sizeof()也可用%u
printf(“int类型的大小为%z个字节”,sizeof(int));
2.5.6混合运算
不同类型数据在运算时,首先进行类型转换再进行运算
书写代数,数学上的表达式应注意,使用数学库函数注意参数类型,
如计算sin30°值,应代入弧度值即30*3.14/180
第三章控制结构
3.1基本控制结构
顺序,选择,循环图灵证明这三种控制结构的组合可以解决一切实际问题
3.1.1基本语句
3.1.2常用的输入输出函数
字符输入输出函数getch();getchar();putch();putchar();
getch()不需要回车确认,拿到字符就走人,还不回显;
getchar()需要按回车确认输入好了
printf(“ch=%c\n”,getch());//将输入的字符立即显示
3.1.3顺序结构程序设计示例
3.2程序中的控制运算符
3.2.1关系运算符
6种比较运算的关系运算符:
<<=>>===!
=
前四个同级,优先级比后两个高。
优先级比加减乘除低,比赋值运算符高
关系表达式结果只有真假。
c语言规定非零为真,0为假3>2+2值为0
正确表示数学上的连不等式3<=x<=7x>=3&&x<=7
3.2.2逻辑运算符
!
非&&与||或
&&类似于乘法运算||类似于加法运算
短路特性
3.2.3条件运算符
?
:
三目运算符结合方向从右往左如a>b?
a:
c>d?
c:
d等价于a>b?
a:
(c>d?
c:
d)
3.3程序中的选择结构
3.3.1if语句
用法1:
if(表达式)//条件表达式为真则执行内嵌语句。
若没有强制性语句就
语句;//执行一遍内嵌语句之后就执行下一个语句
用法2:
if(表达式)
语句;
else
语句;
用法3:
if(表达式)
语句
elseif(表达式)
语句
…
else
语句
3.3.2switch语句
用法:
switch(表达式)
{
case常量表达式1:
语句1;
case常量表达式2:
语句2;
……
case常量表达式n:
语句n;
default:
语句n+1;
}
执行过程顺序执行
优化用法:
各个语句最后加上break;
3.3.3多重选择结构
if语句的嵌套
else与它前面最接近的没有和else配对的if配对
switch嵌套
3.4程序中的循环结构
3.4.1while循环结构
用法:
while(表达式)
{
循环体;
}
3.4.2do-while循环结构
用法:
do{
循环体;
}while(表达式);
3.4.3for循环结构
用法:
for(表达式1;表达式2;表达式3)
{
循环体;
}
3.4.4break和continue语句
3.4.5多重循环结构
3.53.6不考
第四章数组和指针
数据类型在实际生活中有很多是批量数据,
单个数据用来处理这些问题效率显然会比较低下
数组是一种构造类型
是由若干相同数据类型的数据组合起来的
4.1一维数组
4.1.1一维数组的定义和初始化
(1)定义:
类型名数组名[数组元素个数]
inta[5];floatb[5];charc[5];
注意事项:
数组a的元素是a[0]a[1]a[2]a[3]a[4]下标从0开始
课本:
不能用变量定义数组长度(变长数组VLA)
可以使用malloc()动态分配
数组一旦确定大小就不能改变
推荐使用宏定义的明显常量作为数组大小比如
#defineMAXNAME50
……
charname[MAXNAME];
一维数组定义之后会在内存中分配连续的存储空间,
大小为数组元素的个数*定义的数据类型所占用字节数比如inta[5]大小就是5*4=20字节
(2)初始化数组如果不初始化,就没有实际意义部分初始化之后,没有初始化的变为0
inta[6]={1,2,3,4,5,6};//整体初始化只能在定义的时候
inta[6]={1,2}//定义之后只能单个初始化a[5]是个元素
4.1.2一维数组元素的引用及基本操作
使用某个已经声明过的数组中的元素:
a[0]a[1]注意下标
引用只能单个引用
for(i=0;iscanf(“%d”,&a[i]);//或printf(“%d”,a[i]);
赋值操作
inta[3];//a[0]a[1]a[2]就相当于普通的整型变量
4.1.3一维数组的应用举例
查找:
(1)顺序查找:
(只列出核心代码)
#defineN20
……
for(i=0;iif(a[i]==key)
{
printf(“%d被找到啦,哈哈哈~~~”,key);
num++;//统计找到的数据个数
}
(2)二分法查找(前提是数据升序或者降序排列,本例中为升序)
#defineN9
……
intlow=0;
inthigh=N-1;
intmid,key;
……
while(low{
mid=(low+high)/2;
if(a[mid]==key)
break;
if(a[mid]low=mid+1;
else
high=mid–1;
}
排序:
(1)比较排序法
先从a[0]开始与a[1]比较,如果遇到比a[0]小的
就交换这个数与a[0]的值,这样a[0]最后就是这些数的最小值
然后从a[1]开始,与a[2]比较,类似上面,a[1]就成为除了a[0]的数的最小值
以此类推,就会得到一个从小到大的数组排列
for(i=0;ifor(j=i+1;jif(a[j]{
t=a[i];
a[i]=a[j];
a[j]=t;
}
(2)选择排序法
先找出a[0]a[1]……a[n-1]中最小值,
与a[0]交换,这样这n个数最小值就是a[0]
再将a[1]a[2]……a[n-1]中最小值与a[1]交换,
这样这除了a[0]的n-1个数最小值就是a[1]
以此类推得到从小到大的数组
(3)冒泡法:
首先将a[0]与a[1],a[1]与a[2],a[2]与a[3]……进行比较若为逆序则交换
这样a[n-1]为最大值
重复,得到第二大的值a[n-2]
这是从后往前,由大到小
4.2二维数组及多维数组
4.2.1二维数组的定义及初始化
二维数组也称矩阵
inta[2][2]在内存中按行存储
顺序依次是a[0][0]a[0][1]a[1][0]a[1][1]
几种初始化方式:
inta[2][3]={{1,2,3},{4,5,6}}
inta[2][3]={1,2,3,4,5,6}
inta[][3]={1,2,3,4,5,6}//全部初始化可以省略第一维大小
若部分初始化,则未被初始化的变为0
二维数组元素表示
a[M][N]中第a[i][j]个元素,是总共M*N个元素中第N*i+j个元素
可用a[0][N*i+j]表示a[i][j](相对于a[0][0]的偏移量)
4.2.2二维数组的应用举例
4.2.3多维数组
初始化与二维类似
inta[2][3][4];
b[i][j][k]==b[0][0][M*N*i+N*j+k]
4.3字符数组及字符串处理函数
字符数组在内存中存放字符串
一维用来存放一个字符串,二位存放多个字符串
4.3.1字符数组的初始化
chars1[10]=“Hello”;
charstr[2][10]={“市场营销”,“会计学”}
str[0]==“市场营销”;str[1]==“会计学”;
4.3.2字符数组的输入
gets()函数
chars[100]
scanf(“%s”,s)//数组名是地址常量
for循环和scanf()%c一个一个输入字符
4.3.3字符数组的输出
chars[100]=“真是日了狗了!
!
”
puts(s);
printf()%c和putchar()一个一个输出字符;
4.3.4常用的字符串函数
strlen()可求出字符串实际长度,不包括‘\0’的所有字符个数;
strcat()字符串连接函数StringCatenate,有两个参数
strcat(str1,str2)把str2中字符串连接到str1末尾
str1中的\0没了,变成str2中第一个字符,str2中的\0不变
str1要足够大
strcpy(str1,str2)把str2复制到str1中
字符数组整体赋值只能用strcpy(),相当于整数浮点数中=的赋值运算
strcmp(str1,str2)字符串比较函数
如果str1>str2返回值大于零
<小于零
=等于零
“000abcd”>“000ABCD”
从左往右直到第一个不相等的字符,然后比较
4.4指针和数组
指针与数组有密切联系
数组名是特殊类型的指针
4.4.1指针与一维数组
inta[10];
int*p;
p=a;
p=&a[0];
*p=1;//a[0]为1
指针变量一旦指向数组首元素,指针变量名可以当作一维数组名使用
p[2]==a[2]
p+i==a+i;
a+i==&a[i];
*(a+i)==a[i];
指针变量的运算++--和*同级,都是从右向左结合
所以*p++==*(p++)//先把指针向后挪一位再取出其中的值
(*p)++//表示先取出p所指地址的值再把值加一
4.4.2指针与二维数组
intstr[2][3];
int*p;
p=str;
*p==&str[0]
**p==str[0][0]
4.4.3指针与字符串