C复习资料Word文档格式.docx
《C复习资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《C复习资料Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
int、short、long、signed、unsigned、char、double、float、enum、union、struct、typedef、static、register、auto、extern,还有一些如:
void、sizeof等;
能正确定义标识符(在程序中,符号常量名、变量名、函数名都是用户自定义标识符),自定义标识符的正确与否可从以下几方面判断:
①是否以字母或下划线开头;
②是否是只有字母、数字、下划线的序列③是否选用了关键字
练习:
下列哪一个是合法的用户自定义标识符______。
A、_do_while;
B、begin?
end;
C、for;
D、1st_run;
掌握所有的运算符及其优先级、结合方向及特殊的运算规则:
34种运算符的优先级关系大致为:
[]、()、->
、.---一元运算符---乘除类算术运算符---加减类算术运算符---移位运算符---有大小关系的关系运算符---等与不等的关系运算符---位运算符---逻辑与---逻辑或---条件运算符---各种赋值运算符---逗号运算符。
结合方向:
一元运算符、条件运算符、赋值运算符三种为自右向左结合,其它均为自左向右结合
能改变变量值的运算符:
赋值、++、--,注意前后++、--的区别
具有特殊运算规则的运算符:
逻辑与&
&
、逻辑或||、条件运算符,具有断路功能,表达式中的某些部分可能不运算;
%运算符要求两个运算对象均为int型
注意两个运算符的区别:
=与==
表达式运算过程中可能进行类型转换,原则:
低类型自动向高类型转换
1、表达式a=4,a*5,b=a+3的结果是?
x=9;
x/=(a=4,b=a*5,b++)+9执行后,变量a、b、x的值分别是多少?
表达式的值呢?
2、if(!
x)…此处!
x相当于x==0
if(x)…此处x相当于x!
=0
常量与变量:
常量是其值不可变化的量,有两种表现形式:
字面常量和符号常量,C是定义符号常量只有一种方法:
#define常量名串
C中的字面常量有五种:
整型常量、实型常量、字符常量、字符串常量、枚举常量(不作要求)
整型常量有三种合法制式:
十、八(如012)、十六(如0xa3),另外还可以有L(l)、U(u)作后缀,分别表示长整型及无符号常量
实型常量有两种表示形式:
小数形式、指数形式,注意:
小数形式要求一定要有小数点,小数点前面或后面的数字可以缺省;
指数形式一定要有E(e),并且在其左边一定是合法的整数或小数形式的实数,右边必须是合法的整数。
字符常量是以一对单‘’括起的单个字符(‘\191’错),需要特别注意的是以右\开头的转义字符的三种形式:
‘\n’、‘\121’、‘\xa5’,记住’A’、’a’、‘0’、‘\n’的ASCII码分别为:
65、97、48、10,字符常量的大小就是其ASCII码值的大小
小写转大写:
ch=ch-32;
大写转小写:
ch=ch+32;
字符串常量是以一对双“括起的0个或多个字符,需要特别注意字符串的长度与字符串所占的字节数之间相差1
1、字符串"
12\\\t345\r489"
的长度是______,占____字节。
2、charc=’m’;
c=c-35;
putchar(c);
的输出结果是____
3、下列哪一个不是合法的常量
A、027B、2.5e2.5C、0xfdaLD、10.e+0
变量:
在程序运行过程中其值可变的量,需要先定义后使用。
每一个变量都具有:
变量名、变量的当前值、变量的地址、变量的存储属性,指针变量中存的是地址,其余变量中存放的是值。
在所有函数之外定义的变量称为全局变量,其作用域为定义点开始到程序结束(去掉含同名局部量的作用区域);
在函数内部定义的变量称为局部变量(形式参数也是局部变量),局部变量分auto(默认)和static两种,前者是在函数被调用时分配空间,每次函数执行完毕后将不再存在,但是static型的局部变量在函数第一次被调用时进行分配空间,只初始化一次,每次函数执行完毕后将继续存在,但是只在本函数中才起作用,因此这种变量的读程序题一定要注意!
#include<
stdio.h>
intcal(intn)
{staticintf=20;
f+=n;
returnf;
}
voidmain()
{
inti;
for(i=1;
i<
7;
i++)
if(i%2)printf("
%d"
cal(i));
模块二:
三种基本结构及流程控制
C程序的三种基本结构是顺序结构、选择结构、循环结构。
这三种结构分别需要借助于特定的语句控制实现。
(1)顺序结构:
赋值语句和函数调用语句是控制该结构的主要语句。
函数调用语句中最常用的是:
scanf()、printf()、getchar()、putchar()等用于控制输入输出的语句。
注意用scanf()输入变量值时要严格按照格式控制串的形式要求输入,用printf()输出时要进行相应的格式控制,需要熟记几种格式转换说明符:
%c、%s、%d、%f、%lf(当变量为double类型时,在scanf中必须用%lf,但输出时用%f就可以了)。
1、已知a、b、c为int型变量,用于输入的语句为:
scanf("
a=%d,b=%d,c=%d"
&
a,&
b,&
c);
,若想使a的值为1,b的值为2、c的值为3,应当怎样输入?
如果提供的输入方法为1,2,3<
回车>
,则对应的输入语句是什么?
2、floatv=1234.5678;
,输出格式为:
输出总宽度为10,精度为3,则应使用语句printf(_______);
实现;
若输出语句为:
printf(“%.3f”,v);
,输出的内容为:
______
(2)选择结构:
用if...else、switch语句配合复合语句、break语句控制实现。
If语句有三种形式:
单分支if、双分支if、嵌套if,注意else应与其前最靠近的未匹配过的if相对应,而与对齐的形式无关,每一个else实际上都隐含了一个条件,要充分利用这些条件分析程序;
if后的条件通常是关系表达式,但是实际上可以是任何表达式,仅以该表达式是0或非0来判断条件的假和真。
注意:
if()及else后面都只能控制一条语句,经常需要用到复合语句。
switch语句中特别要注意的是:
(1)switch后面的表达式类型应当为整型、字符型、枚举型,而不可以是float或double型,因为表达式的取值必须是离散值。
(2)找到与表达式匹配的常量后开始执行,直到遇到break或语句结束才会停止。
因此每一个分支后如果没有及时用break,则继续向下执行,这样,switch结构可以选择多个分支执行
(3)这些常量的顺序调整不影响程序的正确性,只要每个分支执行的功能固定就可以了。
1、已知变量tf为整型,下面的条件语句中,五种表达有一种与其它四个不等价,它是?
A、if(tf)语句1;
else语句2;
B、if(tf==0)语句2;
else语句1;
C、if(tf!
=0)语句1;
D、if(!
tf)语句2;
E、if(tf==1)语句1;
2、设以下所有变量均为整型,下列程序所实现的分段函数是?
if(x>
0)y=1;
elsey=0;
if(x<
0)y=-1;
3、下列程序段执行后,a、b的值是?
a=1;
b=2;
c=0;
if(a>
b)
c=a;
a=b;
b=c;
4、设有声明inta=1,b=2,则下面程序段的输出结果是?
如果是内层的每个case后有break,而外层没有break,输出结果是?
switch(a)
{
case1:
printf("
#\n"
);
switch(b)
{
case1:
printf("
*\n"
case2:
**\n"
case3:
***\n"
}break;
case2:
##\n"
break;
}
(3)循环结构:
常用while、do…while、for三种流程控制语句实现,注意while和for属于当型循环,do…while属于直到型循环,若while后的条件为非0则继续循环,若为0则结束,三种循环是可以相互转化的。
这里特别强调的是:
循环的退出一般是条件为0(for的表达式2,如果表达式2缺省,则表示永真条件、while或dowhile后的表达式就可以表示条件,如:
while(‘A’),这就是一个永真条件)时不进入循环体,但是在循环体内也可以用一定条件下的break语句退出本层循环。
如果表示条件的表达式值永远不可能为0,则为一个死循环,这一点要注意!
在循环语句中可以用break表示退出本层次循环、continue表示忽略本次循环体中的后续语句,重新开始下一次循环条件的判断,以便决定是否要继续循环。
循环体只有一条语句,注意复合语句的正确使用,不要误用分号形成循环体为空语句,例如:
for(i=0;
3;
i++);
s+=i;
有关退出的几个操作:
(1)在循环结构中用break结束本层循环、在switch语句中用break结束本层switch中当前分支的执行;
(2)在函数体内的return语句结束本函数的调用,返回到调用点;
(3)库函数exit结束程序的执行,返回到操作系统,该函数在<
stdlib.h>
头文件中
1、若已有定义inti,则对于如下循环语句,循环体执行的次数分别为______。
①for(i=0;
;
i++)
printf("
i);
②for(;
i=0;
③for(i=0;
i<
0;
④i=0;
while(i=1)
i++;
2、下列程序运行后,x和y的值分别是?
#include<
voidmain()
intx=1,y=2;
for(;
x<
10;
x++)
x+=2;
if(x>
7)
{
printf("
x=%dy=%d\n"
x,y);
break;
}
if(x==6)continue;
y*=x;
}
}
这一模块中有很多经典算法,下面几个是同学们必须非常熟悉的:
(1)质数问题
1判断一个整数是否为质数(用一层循环可以解决)
会定义函数实现,函数原型:
intprime(intn);
判断参数n是否为质数,如果是,返回1,如果不是,返回0。
2找出一定范围内所有的质数(用两层循环可以解决)
voidprime(intlow,inthigh);
找出从low到high范围内的所有质数,是质数则输出。
如果函数需要返回该范围内的质数个数,则应该将返回值类型修改为int。
③能按一定的格式输出
(2)求最大公约数问题
可以用辗转相减或相除的方法都可以得到。
intgcd(intm,intn);
在辗转相除法中,当余数为0时的除数即为最大公约数,注意循环控制方式的不同可能导致返回值的不一样。
求最小公倍数:
a*b/gcd(a,b)
(3)求和问题:
掌握求和问题中条件的控制方式、累加的方式:
1可以根据求和的项数要求来求解,例如:
求100项之和;
2可以根据每一项的精度进行求解,例如:
求到这一项的绝对值不超过1E-6为止,注意这时的循环条件应该为:
while(fabs(term)>
=1E-6),如果用do...while循环,条件也是这样表示。
3注意分子、分母、当前项、和分别用一个变量表示,正确定义变量的类型,正确解决变符号问题:
s=-s;
(4)输出规则图形式问题
分析行号与当前行前导空格数、符号个数、符号形状之间的关系,正确控制换行。
(5)利用循环可以控制输入数据的范围,这在实验三的P23页。
inta,b;
do
{scanf(”%d%d”,&
b);
}while(a<
10||a>
b||b>
1000);
实现输入的a,b范围是:
10<
=a<
=b<
=1000
模块三:
函数
C语言的源程序由一个或多个函数组成,其中必须有且只能有一个主函数main(),程序执行总是从main函数开始的,也是因main函数的结束而结束整个程序。
C函数只可以嵌套调用,而不能嵌套定义
C函数可以在定义的时候调用自己,这就是直接递归方式
这一部分需要搞清楚以下问题:
(1)函数定义:
包括函数首部和函数体,函数首部又包括了函数返回值类型函数名(形式参数表),函数体是由一对大括号括起的语句系列组成,函数的形式参数名字是无关紧要的,若函数无需返回值,则将返回值类型可以定义为void。
函数的返回值由首部的函数返回值类型决定,return后的表达式类型若与其不一致,则自动转换。
函数只能返回一个值,如果一个函数需要返回多个信息,则要考虑其中的形式参数采用指针参数。
例如:
intf(inta[],intn,int*max);
由函数返回数组a的前n个元素之和,而元素的最大值通过设定max指针,在函数体内求*max实现,外部调用时,要用一个地址实参对应于形式参数max。
(2)函数原型:
函数应当先定义后被调用,如果出现调用先于定义的情况,则必须对后定义的函数在调用点之前进行原型声明,函数原型就是函数定义的首部最后加一个分号,在原型声明中形式参数名字可以缺省。
(3)函数调用:
形式为:
函数名(实在参数表),实在参数与形式参数对应的要求是:
个数相同、对应位置的类型最好一致
(4)形式参数类型:
有值形式参数,这时实在参数将值赋值到值形式参数变量中;
指针形式参数,这时将实参的地址赋值到指针形式参数中,虽然都是单向传递,但是可以通过在被调函数中修改指针所指向的内容达到修改实参变量的目的。
如:
swap(int*x,int*y),在该函数体内交换的是*x和*y的值;
对swap的几种正确与错误实现需要能正确理解。
如果函数原型为:
swap(int*x,inty),在函数体内交换*x和y的值,则主函数中的调用形式应该为:
swap(&
a,b);
只有实参a可能会得到改变,无法完成a、b互换的目的。
(5)变量的作用域问题:
全局变量——在所有函数之外定义的变量,作用于定义点到程序结束处,但应去除掉同名局部量的作用域部分。
局部自动变量——在某函数内部定义的变量,包括形式参数也是,其作用域只在本函数内,生命期为:
所在函数被调用时分配空间,该函数当次结束时空间不复存在。
下次再调用则重新分配空间。
在不同函数中定义的局部量可以同名,因此形式参数可以与实在参数同名,因为处于不同的函数。
局部静态变量——在某函数内部定义的变量,有static关键字,其作用域只在本函数内,生命期为:
所在函数被调用时在静态存储区分配空间,只初始化一次,本次函娄数调用结束后仍然存在,其值保留,但是在函数之外的其余部分均不可见,等该函数再次被调用时,该变量就在原来值的基础上继续变化。
(6)函数的递归:
会阅读递归函数,并能对简单的调用得到运行结果,理解递归的条件:
有明确的边界条件;
原问题可转化为新问题,新旧问题的解决方法一样。
1、若用一维数组名作为函数调用时的实在参数,则实际上传递给形参的是______。
2、若在主函数中定义了数组变量:
intarr[20],并调用了函数f(arr),则下列关于函数f的原型声明,哪几个是完全等效的______。
A、voidf(intx[20]);
B、voidf(intx[]);
C、voidf(intx[10]);
D、voidf(intx);
E、voidf(int*x);
3、以下程序的输出结果是______。
longfun(intn)
{staticlongs;
if(n==0||n==1)
s=n;
else
s=n+fun(n-1);
returns;
{inti;
for(i=1;
4;
i++)
%4ld\n"
fun(i));
此题中既有递归调用,又有静态局部变量的使用这两个重要的知识点。
教材中的习题P194,5.3也是涉及静态局部变量的使用。
教材中的习题P375,9.2是利用递归进行十进制向二进制的转换问题,大家可以思考用类似方法实现十进制向其它进制的转换
4、有函数原型为voidf(int,int*);
主函数中有变量定义:
inta,*p=&
a;
则下列几种调用正确的是____?
A、f(a,p);
B、f(*p,&
a);
C、f(a,*p);
D、f(*p,a);
E、f(a,&
F、f(*p,p);
G、f(a,a);
H、f(p,p);
5、会结合数组、结构体类型,用多个函数完成一个程序。
模块四:
数据类型
C语言源程序中所处理的任何数据(常量或变量)都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小、数据值的表现形式及数据范围、可进行的运算及操作、变量值的组成情况等。
C中数据类型分为:
基本类型、构造类型、指针类型、空类型四大类,其中基本类型包括整型、实型、字符型、枚举型;
构造类型有:
数组类型、结构体类型、共同体类型,指针类型的特殊性在于其变量中存放的是内存地址信息而不是内存中的值。
这一模块的重点是数组、结构体、指针类型。
(1)数组类型:
基本知识:
一维及二维数组变量的定义及初始化、如何正确访问元素、一维字符数组操作字符串、会正确输入输出数组的元素、正确输出字符串,掌握string.h函数中的一些常用函数的使用,如:
两个字符串的比较(例如:
判断串s1是否大于s2,不能用s1>
s2,而应该用strcmp(s1,s2)>
0)、字符串的赋值、字符串的连接等。
算法:
首先要理解一维数组名作实参和形式能数传地址的实质;
掌握在一维数组中:
输入数组所有元素、输出数组所有元素、寻找最大数、最小数、求元素的平均值、查找某一个值是否是数组中的元素、数组元素逆置、某种常见排序算法等。
数组元素实际个数随着输入动态统计的方法:
应当设定一个输入结束标志,在输入该标志之前的元素都依次作为数组的有效元素,该标志不计入内,用如下代码输入以-1为结尾标志的数组并输出所有的有效元素:
inta[100],num=0,i=0;
{
%d"
a[i++]);
}while(a[i-1]!
=-1);
num=i-1;
num;
%5d"
a[i]);
\n%d\n"
num);
1、有数组定义inta[m][n],则在a[i][j]之前的元素的个数为______。
2、以下一维数组的定义正确的是___
A、intn=3,a[n];
B、#defineN=3inta[N];
C、constintn=3;
inta[n];
D、#defineN3inta[N*3];
3、以下一维数组定义及初始化正确的是____
A、inta[];
B、inta[]={1,2,3}
C、inta[3]={1,2,3,4}D、inta[3]={,2,}
4、以下选择中,能正确定义二维数组的是______。
A、intx[][2];
B、intx[][2]={2*2};
C、intx[2][]={1,2,3,4};
D、inta[2][3]={,{1}};
5、若定义intm[10]={9,1,15,6,2,11,8,7,19,3};
则m[m[1]+2*m[4]]的值是______,*m+m[8]的值为______。
6、下列字符数组定义与初始化不正确的是____
A、chars[]=”abc”;
B、chars[]={”abc”};
C、chars[3]={‘a’,’b’,’c’};
D、chars[3]=”abc”;
7、下列关于数组的描述中不正确的是______。
A、可以对字符型数组进行整体输入、输出
B、可以对整型数组进行整体输入、输出
C、利用字符型数组可以实现字符串操作
D、不能通过赋值运算符“=”对字符型数组进行整体赋值
8、下列程序的输出结果是?
intf(int*a,intnum,intx);
voidmain()
{inta[10]={8,6,17,29,34,5,7,23,2,1};
intpos;