c复习资料.docx
《c复习资料.docx》由会员分享,可在线阅读,更多相关《c复习资料.docx(10页珍藏版)》请在冰豆网上搜索。
![c复习资料.docx](https://file1.bdocx.com/fileroot1/2023-4/19/3d098edd-048f-46a6-ad19-2591d688d359/3d098edd-048f-46a6-ad19-2591d688d3591.gif)
c复习资料
复习资料
Ch2数据类型、运算符与表达式
1.C程序的结构:
C程序是由一个或多个源文件组成,源文件是C程序的编译单位;源文件由函数组成的;一个程序有且仅有一个名字为main()的函数;函数的定义不可嵌套,即,在一个函数内部不可定义另外一个函数;程序总是从main函数第一条可执行语句开始执行,在main函数结束;
2.标识符
合法的标识符的组成;如x1、a、max_int、_num等合法的,2x、x#等不合法,不能用关键字,如for、int等,最好不用函数名如printf等。
关键字:
查看附录B;如printf、define不是关键字;C语言区分大小写,故For、If等不是关键字
3.常量的表示形式
整型常量:
十进制、八进制、十六进制。
如028、0x2ah不合法;若整数是2个字节,则整数范围-32768-32767之间,32768(错)-0370xaf均正确
实型常量:
3.02.3e32e-4正确,2e3.0错
字符常量:
注意转义字符,如\n、\72、\x23等均表示一个字符,如“\t\”name\\address\n”长度为15;’\38’错误
字符串常量:
变量定义及赋值:
变量赋值时的类型应相同或兼容,
如inta=3.5、floatb=4、charc=97正确,但charch=”abc”错误
4.运算符及表达式
运算符的功能、特点:
如%要求两侧操作数均为整数;若/两侧操作数都是整数表示整除;
运算符的优先级:
复合运算符:
如inta=3;执行a+=a-=a*a;后,a的值是-12;
如:
n=10,i=4,则赋值运算n%=i+1,n的值是
逻辑运算符:
掌握&&和||的运算特点;
如i=2,j=3,k=4,if((i++)||(j++))&&k++)printf(“%d,%d,%d”,i,j,k);结果是?
设a=3,b=4,c=5,表达式
(1)‘a’&&‘b’、
(2)a<=b、a||b+c&&b-c、(3)!
((a
c||1)、(4)ab>a结果?
如:
c=0;考虑,表达式c=b=a、(a=c)||(b=c)、(a=c)&&(b=c)、a=c=b能正确将c的值赋给变量a,b吗?
为什么?
关系运算符:
注意==与=的区别,如a=1,b=2则if(a=3)b=0;则b的值变化了吗?
为什么?
条件运算符:
运算的特点
如:
i=1,j=2;执行语句n=i>j?
i++:
j++;则i和j的值是
5.自增自减:
掌握前置与后置的运算特点;
如:
x=3,则表达式x++的结果是3,x的值变成4;而++x的结果是4,x的值也是4;-x++结果是-3,x的值变成4
如:
x=7,则(x++%3)结果是?
6.表达式类型的转换:
若chara;intb;floatc;doubled;则表达式a*b+d-c的值类型?
7.逗号运算符:
逗号表达式的值是最后一个表达式的值。
如:
(a=2*3,a+2,a*6)的值是?
Ch3简单的C程序设计
掌握格式化输入输出
如:
scanf(“%d,%d”,a,b);错!
floatf=3.14,printf(“%d”,f);错!
floatf;scanf(“%5.2f”,&f);错!
如:
scanf("a=%d,b=%d",&a,&b);对应的输入应该是?
如:
要求实数的输出结果保留2位小数位数,怎样写printf()?
Ch4程序的控制结构
1.条件表达式:
C语言中,在进行逻辑判断时,以非0表示逻辑真;逻辑真用1表示,逻辑假用0表示;if(a)等价于if(a!
=0);
2.循环结构(重点):
循环的条件、循环的次数等
如:
a[7]={11,13,14,15,16,17,18},i=0,k=0;
while(i<7&&p[i]%2)
{k=k+p[i];
i++;
}
printf("%d\n",k);输出结果是?
}
如:
intx=-1;
do
{
x=x*x;
}while(!
x);是死循环吗?
不是的话执行多少次循环?
如:
for(i=5;i=0;)printf("%d\n",i--);执行几次循环?
Ch5函数
1.函数的调用:
掌握单向值传递的思想;简单变量作为实参时,它和对应形参之间数据的传递方式为单向值传递;若用数组名作为函数调用时的实参,则实际上传递给形参的是数组的首地址
如:
voidswap(intx,inty)
{intt;
if(x{t=x;x=y;y=t;}
}
main()
{inta=1,b=2;
swap(a,b);
printf("%d,%d,%d\n",a,b,c);结果是?
}
3.变量的作用范围作用域:
变量的类型(按作用范围分全局变量、局部变量;按生存期分:
动态变量、静态变量);auto、static声明的变量的类型;全局变量的作用域不一定比局部变量的作用域范围大(考虑为什么?
);静态变量(static声明)的生存期贯穿于整个程序的运行期间;函数的形参都属于局部变量;未在定义语句中赋初值的auto变量初值是随机值而全局变量和static声明的变量未初始化时系统自动将其初始化为0;不同的函数中可以使用相同的变量名;形式参数是局部变量;在语句块内定义的变量称为局部变量;
4.预处理:
在有宏替换的地方,一定要注意原样替换!
!
如:
#defineN2
#defineMN+1
#defineNUM(M+1)*M/2
则for(i=0;iCh6数组
1.数组定义及初始化:
掌握数组初始化的方法;在定义数组时,数组名后的方括号里必须是常量表达式;一维数组所有元素均初始化时可以省略数组长度;二维数组所有元素均初始化时可以省略第一维长度不能省略第二维长度;初始化的元素个数不能大于数组的长度;数组中元素的个数计算方法?
如:
定义5个整型元素的数组a并初始化为0,正确的是?
(1)inta[5]=(0);
(2)inta[5]={};
(3)inta[5]={0};(4)inta[]={0*5};
2.字符数组在内存中的存储形式:
每个字符在内存中占1个字节,字符串末尾自动添加结束标志字符,所以charstr[]="china",数组str在内存中占6个字节,但是,str的长度是5,再如charstr[10]="china",strlen(str)=5
字符串处理函数:
strlen、strcmp、strcpy等;字符串大小的比较;比较依据(如:
"CHINA","china"和"China"中最小的是谁?
字符串s1大于字符串s2,正确的比较形式是?
Ch7指针
1.指针与数组:
掌握用指针访问数组中元素的方法;数组中元素的地址(指针)运算方法;
如:
若有定义chars[]="china",*p=s;则能运算出字符i的是:
s[2]、*(p+2)、p+=4,*p
如:
inta[2][3],元素a[i][j]的访问形式可以是a[i][j]、*(*(a+i)+j)、*(a[i]+j)等。
考虑*(a+i*3+j)可以吗?
为什么?
2.指针与字符串:
字符数组的定义、字符指针处理字符串;一般字符串的尾部加结束字符;
如:
charstr[5]="china";不正确,没有结束字符;charstr[]="china";
char*str="china";charstr[]={'c','h','i','n','a','\0'};都可以。
如:
charstr[]=“china”,*p=str;则表达式(*p)++、*p++结果分别是?
3.指向数组的指针:
如:
char(*p)[10];意思是声明了一个指向含有10个元素的一维字符型数组的指针变量p;考虑char*p[10]什么意思?
4.指针数组:
int*p[5];
Ch8结构体
1.结构的定义及初始化:
如:
typedefstruct
{intn;
charc;
doublex;
}STD;
则:
STDtt[2]={{1,'A',62},{2,'B',75}}(正确),以下几个初始化均错误:
STDtt[2]={{1,"A",62},{2,"B",75}};、structtt[2]={{1,'A'},{2,'B'}};、structtt[2]={{1,"A",62.5},{2,"B",75.0}};(考虑为什么?
)
2.结构体中成员的引用方法:
掌握成员运算符(.->)的用法
如:
structstudent
{charname[10];
intage;
charsex;
}stu[3],*p=stu;则以下语句正确的是?
错误的是(为什么错?
)
A.scanf("%d",&(*p).age);
B.scanf("%s",&std.name);
C.scanf("%c",&std[0].sex)
D.scanf("%c",&(p->sex));
如:
structstudent
{
intnum;
intage;
}stu[3]={{001,20},{002,19},{003,21}},*p=stu;
表达式(p++)->nump++(*p).nump=&stu.age是否合法,如果合法,表达式值是什么?
如果不合法为什么?
2.typedef的用法:
注意typedef不是定义一种新的类型,仅是给某个类型起个“外号、别名”
Ch10文件操作
1.文件打开及关闭:
已知FILE*fp,以只读方式打开d:
\vc60\data.txt的语句是fp=fopen("d:
\\vc60\\data.txt","r");要求以只写方式打开呢?
1.文件位置指针的定位:
掌握rewind、fseek、ftell的用法;
如:
考虑怎样才能将文件位置指针定位到文件开头?
rewind(fp)或fseek(fp,0,0)
阅读程序
以下程序的输出结果是?
?
1.voidmain()
{inta[]={1,2,3,4,5,6,7},*p=a;
p+=2;
printf("%d\n",p[3]);
}
2.voidmain()
{charch[7]={"123ab45"};
inti,s=0;
for(i=0;ch[i]>='0'&&ch[i]<='9';i+=2)
s=10*s+ch[i]-'0';
printf("%d\n",s);
}
3.intfunc(inta,intb)
{staticintm=0;
staticinti=2;
i+=m+1;m=i+a+b;
return(m);
}
voidmain()
{intk=1,m=2,p;
p=func(k,m);printf("%d,",p);
p=func(k,m);printf("%d\n",p);
}
4.voidmain()
{inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int(*p)[4]=a,i,j,k=0;
for(i=0;i<3;i++)
for(j=0;j<2;j++)
k=k+*(*(p+i)+j);
printf("%d\n",k);
}
5.main()
{char*s="12134211";
intv1=0,v2=0,v3=0,v4=0,k;
for(k=0;s[k];k++)
switch(s[k])
{default:
v4++;
case'1':
v1++;
case'3':
v3++;
case'2':
v2++;
}
printf("%d,%d,%d,%d\n",v1,v2,v3,v4);
}
程序题
1.从键盘输入圆的半径r,计算并输出圆的面积s。
(要求:
半径r定义为float型;圆周率
定义为符号常量;面积s保留2位小数)
2.从键盘输入三角形的三边长a,b,c,计算并输出三角形的面积area,其公式为
(要求:
面积area定义为float型,输出结果保留2位小数)。
3.编程序求10!
4.编程计算1!
+2!
+…+10!
的值
5.计算两个正整数的最大公约数,求最大公约数的过程用子函数实现。
6.利用泰勒级数
,计算e的近似值。
要求最后一项的绝对值小于10-5为止。
7.以选择法(再编写以冒泡法)排序写一个排序函数,函数名为sort,实现对含有n个整数的数组按由大到小的顺序排序。
原始数据在主函数中通过键盘输入,排序结果在主函数中输出。
请写出sort函数。
8.在一个已经排好序(由小到大)的数组中查找待插入数据x应插入的位置,使其插入后,数组元素仍然保持由小到大的顺序。
9.有一个字符数组str,数组中存放一个字符串,编程将字符数组中ASCII值为偶数的字符从数组中删除掉,删除后形成的新字符串仍然存放在原来的字符数组str中。
课本:
课后习题:
习题2、习题3、习题4(后面编程重点4.64.124.15.4.18)、习题5(后面编程重点5.45.7)、习题6(后面编程重点6.56.12)、习题7(后面编程重点7.67.8)、习题8(后面编程不作重点)
说明:
本资料仅作为期末考试复习重点,不是考试内容!
有不明白的问题同学之间相互讨论。