C语言复习小结.docx
《C语言复习小结.docx》由会员分享,可在线阅读,更多相关《C语言复习小结.docx(54页珍藏版)》请在冰豆网上搜索。
![C语言复习小结.docx](https://file1.bdocx.com/fileroot1/2023-1/25/4d31a1bf-d73e-4fff-9208-7393c76dd4e5/4d31a1bf-d73e-4fff-9208-7393c76dd4e51.gif)
C语言复习小结
C语言复习小结
第三章数据类型、运算符和表达式
常量包括直接常量(或称字面常量)和符号常量。
直接常量有整型常量,实型常量,字符常量与字符串常量。
整型常量有以下三种数制形式表示:
•十进制:
如123;-60;0
•八进制:
以0开始,如0123表示(123)8
•十六进制:
以0x开始,如0x123表示(123)16
实型常量有以下两种形式表示:
小数形式:
由数字、数符和小数点组成。
注意必须有小数点。
如123.0.1230.012.5
指数形式:
数字部分e指数部分。
字母E/e前必须有数字,字母E/e后
必须为整数(1-3位)。
如123e2123E2
字符常量是用单撇号括起来的一个字符。
例如:
'a','x','d','?
','['
•字符常量的值实际上是一个数字值。
存储的实际值为ASCII值。
所以字符常量可以象整数一样参与运算。
(注意:
转义字符)
字符串常量是用一对双引号括起来的字符序列。
如:
“CHINA”,“a”,“X+Y”。
字符串常量在内存中的存放:
每一个字符均以其ASCII码存放,且最后添加一个“\0”作为字符串的结束标志。
(注:
在表达一个字符串时要时刻记着尾部有个‘\0’字符结束整个字符串。
)
变量是指在程序运行过程中其值可以改变的量。
系统为程序中的每一个变量开辟一个存储单元。
变量有两个要素:
1)变量名:
每个变量都必须有一个名字,即变量名。
变量名由字母、数字和下划线组成,且第一个字符必须是字母或下划线。
如果是字母通常使用小写字母,不使用大写字母。
如:
name,no,x,_k,i,j,stu_name等。
变量名中不能含有运算符、括号等C中关键字。
命名遵循顾名思义原则,且不宜过长。
C区分大小写字母。
2)变量值:
每个变量都有特定的值,且可以改变。
在程序中,通过变量名来引用变量的值。
变量的定义
所有的变量必须在赋值使用之前定义。
定义变量的一般形式是:
typevariable_list;(变量定义语句)
注:
type为C语言中有效类型;
variable_list为变量列表,多个变量之间用,隔开。
如:
inti,j,k;floata;
整型变量
数据类型所占位数取值范围
int16-32768~32767
short16-32768~32767
long32-21亿~21亿
unsignedint160~65535
unsignedshort160~65535
unsignedlong320~42亿
实型变量
分类所占位数取值范围
float单精度32-3.4*10-38~3.4*1038
double双精度64-1.7*10-308~1.7*10308
longdouble长双精度128-1.2*10-4932~1.2*104932
字符变量
1、变量的定义
charc1,c2;/*指定c1,c2为字符型变量*/
2、字符型数据的存储
一个字符变量在内存中占一个字节,并以ASCII码存储,存储形式与整型一样,可以和整数进行运算。
3、字符数据与整型数据可互相赋值
C语言中的关键字:
(32个)
类型说明符:
chardoublefloatintlongshortsignedunsignedstruct(结构体)union(共同体)
结构化语句中用:
ifelseswitchcasebreakdefaultdowhileforcontinuegoto
存储类别用:
autostaticexternregister
函数定义用:
voidreturn
其他:
constsizeoftypedefenumvolatile
C运算符
C语言中有以下几类运算符:
1)算术运算:
+,-,/,*,%(模运算)
2)关系运算:
<,>,==,>=,<=,!
=
3)逻辑运算:
!
,&&,||
4)位运算:
<<,>>,~,|,^,&
基本算术运算符
+(加法运算或正号运算符)
-(减法运算或负号运算符)
*(乘法运算符)
/(除法运算符)
%(求余运算符,或称模运算符)
运算符的优先级和结合性
-(负号)→*/%→+-
注:
(1)两个整数相除结果为整数,多数机器采用“向零取整”方法。
如:
5/3=1;-5/3=-1
(2)参与+,-,*,/运算的两个数中有一个为实数,则结果为double型。
如:
6/2.0的结果为3.0
(3)模%运算符(或称求余运算符)两侧的运算量均为整型量。
如:
55%12
(4)三角函数的自变量使用弧度。
如sin50应写成sin(50*3.1415926/180)
例:
3x2+4xysin56-|x-y|e2.3的表达式为:
3*x*x+4*x*y*sin(56*3.14/180)-fabs(x-y)*exp(2.3)
在求表达式的值时,要按照优先级的高低依次计算
如果运算符两侧优先级相同,则按规定的结合方向(从左到右)进行。
自增、自减运算符
++i,--i在使用i前,使i的值加(减)1
i++,i--在使用i后,使i的值加(减)1
注意:
1)++,--运算符只适用于对整型变量操作,而不能
作用于常量或表达式,如5++或(a+b)--是错误的。
2)++,--的结合方向是自右到左。
如j=3;
printf(”%d”,-j++);则输出-3,后使j值增为4。
思考:
1、(i++)+(i++)+(i++)结果?
2、(++i)+(++i)+(++i)结果?
3、i+++j是(i++)+j还是i+(++j)?
4、printf(“%d,%d”,i,i++)结果
赋值运算符
简单的赋值就是把一个表达式的值赋给一个变量。
复合的赋值运算符
在赋值符“=”之前加上其它运算符,可以构成复合的运算符<变量>运算符=<表达式>等价于
<变量>=<变量>运算符<表达式>
如:
m+=n*3等价于m=m+(n*3)
赋值表达式
对赋值表达式求解的过程是:
将赋值运算符右侧的表达式的值赋给左侧的变量。
赋值表达式的值就是被赋值的变量的值。
设a的值为6,计算a+=a-=a*a
先进行a*a的计算,结果为36
再进行a-=36的计算,相当于a=a-36=-30
最后进行a+=-30的计算,相当于a=a-30=-60
问:
j=k+=32*k合法吗?
什么结果
printf(“%d”,i=20);又是如何呢?
★赋值时进行的类型转换
将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。
将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(32位)中。
将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以64位存储。
字符型数据赋给整型变量时:
若系统将字符处理为无符号的量,则将字符的8位放到整型变量的低8位,高8位补0。
若系统将字符处理为带符号的量,如果字符最高位为0,则整型变量高8位补0;如果字符最高位为1,则整型变量高8位补1。
将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。
将带符号的整型数据赋给long型变量时,要进行符号扩展,将整型数的16位送到long型变量的低16位中,如果int型数据为正值,则long型变量的高16位补0;如果int型数据为负值,则long型变量的高16位补1。
以保持数值不变。
若将一个long型数据赋给一个int型变量,只将long型数据中的低16位原封不动地送到整型变量中(即截断)。
将unsignedint型数据赋给longint型变量时,不存在符号扩展问题,只需将高位补0。
将unsigned类型数据赋给一个占字节数相同的整型变量时,是将unsigned型变量的内容照原样送到非unsigned型变量中,但如果数据范围超过相应的整型范围,则会出现数据错误。
将非unsignedint型数据赋给长度相同的unsigned型变量时,也是原样照赋(连原有的符号位也作为数值一起传送)。
逗号是一种运算符
形式如下:
表达式1,表达式2
由逗号隔开的一对表达式从左向右进行计算,其求解过程为:
先求解表达式1,再求表达式2,整个逗号表达式的值是表达式2的值。
逗号运算符是所有运算符中级别最低的。
注:
一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,例如:
(a=4*6,a+5),a+6整个表达式的值为30。
在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。
(转换规则见书)
C语言提供一种“强制类型转换”运算符,将一个类型的变
量强制转换为另一种类型。
一般形式为:
(类型标识符)(表达式)
若x原为实型变量且值为2.6,在执行
i=(int)x
后得到一个整数2,并把它赋给整型变量i,但x仍为实型,值为2.6。
C运算符的优先顺序:
(从上到下依次为由高到低,同一级的按各自的结合方向)
1.()、[]、→、.(从左到右)
2.!
、++、--、-、*、&、sizeof、(类型)(单目、从右到左)
3.*、/、%(从左到右)
4.+、-(从左到右)
5.<、>、<=、>=(从左到右)
6.==、!
=(从左到右)
7.&&(从左到右)
8.||(从左到右)
9.?
:
(条件运算符)(从右到左)
10.=、+=、-=、*=、/=、%=(从右到左)
11.,(逗号运算符)(从左到右)
复习作业题:
1.请编写程序,输入两个整数n和m,计算以下表达式的值:
sum=n+m
diff=n-m
prod=n*m
quot=n/m
并上机时调试完成。
main()
{intm,n,sum,diff,prod;
floatquot;
scanf("%d,%d",&n,&m);
sum=n+m;
diff=n-m;
prod=n*m;
if(m==0)printf("dataerror");
elsequot=1.0*n/m;
printf("%5d,%5d,%5d,%5f\n",sum,diff,prod,quot);
}
2.请编写程序,输入x,计算以下表达式的结果。
fun1(x)=
+
main()
{floatx,y;
printf("x=");
scanf("%f",&x);
y=2*x/(x+1.21)+2/(x-1.54);
printf("fun1(x)=%f\n",y);
}
3.请编写程序,输入x,计算以下表达式的结果。
y=
+
main()
{floatx;
doubley;
printf("x=");
scanf("%f",&x);
y=x*x/sin(x)+2*x/(exp
(2)+1);
printf("y=%10f\n",y);
}
4.请编写程序,输入两个自然数,求它们的商和余数。
main()
{intx,y,a,b;
scanf("%d,%d",&x,&y);
a=x/y;
b=x%y;
printf("%5d,%5d\n",a,b);
}
5.请编写程序,输入一个自然数,判断该数是否能够被3和7同时整除。
main()
{intx;
scanf("%d",&x);
if((x%3==0)&&(x%7==0))
printf("%5dcanbedevideby3and7\n",x);
elseprintf("%5dcannotbedevideby3and7\n",x);
}
第四章顺序程序设计
字符输出函数
–格式:
putchar(c)
–功能:
将c值所对应的字符输出到标准输出设备上(一般为显示器)。
c可以是整型或字符型。
一次只能输出一个字符,也可以输出控制符,如putchar('\n')输出一个换行符,即光标移到下一行。
putchar()函数也可以输出转义字符,如:
putchar(‘\101’)即输出字符‘A’。
字符输入函数
–格式:
getchar()、getch()或getche()
–功能:
从标准设备(一般是键盘)输入一个字符。
字符输入函数没有参数,函数值就是从设备输入的字符。
三个函数有一些差别:
–getchar()函数在由键盘键入一个字符后,必须按回车键,而getch()和getche()函数不需要。
–getche()函数和getchar()会显示出所输入的字符,而getch()函数不响应输入的字符。
格式输出函数
–格式:
printf(格式控制,输出表列)
–功能:
printf函数可以将任意类型的多个数据输出到标准输出设备上(一般为显示器)。
1.d格式字符有以下几种格式字符:
(1)%d按整型数据的实际长度输出。
(2)%mdm为要指定输出字段宽度,若m小于实际长度,则按实际长度输出。
(3)%ld输出长整型数据
2.(字母)o格式符以8进制形式输出整数
3.x格式符以16进制形式输出整数
4.u格式符
用来输出unsigned型数据,即无符号数,以10进制输出。
int型可用%u输出,而unsigned型,也可用%d输出。
5.c格式符用来输出一个字符
6.s格式符用来输出一个字符串,有几种用法:
(1)%s如printf(“%s”,“CHINA”);
输出结果CHINA(注意:
不包括双引号)
(2)%msm<串长,突破;否则按右对齐,左补空格。
(3)%-msm<串长,突破;否则按左对齐,右补空格。
(4)%m.ns输出占m个字符,取自左起n个字符,且向右对齐,左补空格。
(5)%-m.nsm,n含义同上,
不过是左对齐,右补空格。
7.f格式符用来输出实数,以小数形式输出,有以下几种
(1)%f系统指定输出整数部分,小数部分输出6位;
单精度实数有效位数一般为7位。
双精度数也可用%f格式输出,有效位数一般为16位。
(2)%m.nf指定输出占m个字符,小数位占n位,右对齐。
(3)%-m.nf指定输出占m个字符,小数位占n位,左对齐。
8.e格式符
(1)%e
不指定输出数据所占的宽度和数字部分小数的位数,由系统自动指定给出5位小数,指数部分占4位(如e+02),其中,e占1位,指数符号占1位,指数占2位。
数值按规范化指数形式输出(即小数点前必须有且只有1位非零数字)。
(2)%m.ne和%-m.ne
9.g格式符
根据数值输出自动选f格式或e格式(选输出时所占字符长度少的一种)。
注意:
在使用printf函数时,有以下几点要说明:
(1)除X,E,G外,其他格式字符必须用小写,如不能把%d写成%D。
(2)可在格式控制串中用‘转义字符’\n,\b,\377等。
(3)连续用两个%,可输出%字符,
如:
printf(“%f%%”,1.0/3);
输出结果为:
0.333333%
格式输入函数
–格式:
scanf(格式控制,地址表列)
–功能:
scanf函数可以从标准输入设备输入任意类型的多个数据(一般为显示器)。
–注意:
输入数不能规定精度。
当输入一串数据时,系统如何区分每个数据:
(1)根据格式字符的含义分隔字符
(2)系统按格式串指定的长度截取所需的数据
(3)用隐含的分隔符:
在输入数据中用空格或换行符分隔数据。
(4)用%后的“*”附加说明符来表示跳过它相应的数据
(5)使用显示分隔符:
在格式说明符中若还可以有其它字符,在输入字符时应输入与这些字符相同的字符。
(6)用“%c”格式输入字符时,空格字符和转义字符都作为有效字符输入。
注意:
(1)输入时不能规定精度
如scanf(“%6.1f”,&a)是不合法的。
(2)格式控制之后是地址表列而不是变量表列
scanf(“%d,%d”,&a,&b);是正确的,而
scanf(“%d,%*d,%d”,a,b);是错误的。
复习作业题:
1.请编写程序
设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,输出计算结果时保留小数点后两位。
main()
{
floatpi,r,h,l,s,sq,vq,vz;
pi=3.1415926;
printf("pleaseinputtherandh:
\n");
scanf("%f,%f",&r,&h);
l=2*pi*r;
s=pi*r*r;
sq=4*pi*r*r;
vq=4*pi*r*r*r/3.0;
vz=pi*r*r*h;
printf("yuanzhouchangis:
l=%6.2f\n",l);
printf("yuanmianjiis:
s=%6.2f\n",s);
printf("yuanqiubiaomianjiis:
sq=%6.2f\n",sq);
printf("yuanqiutijiis:
vq=%6.2f\n",vq);
printf("yuanzhutijiis:
vz=%6.2f\n",vz);
}
2.请编写程序
输入一个华氏温度,要求输出摄氏温度。
(保留小数点后两位)。
计算公式如下:
c=
(F-32)
main()
{
floatc,f;
printf("pleaseinputahuashiwendu:
\n");
scanf("%f",&f);
c=(5.0/9.0)*(f-32);
printf("sheshiwenduis:
%5.2f\n",c);
}
3.用下面的scanf函数输入数据,问在键盘上应如何输入才能使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8
scanf("%5d%5d%c%c%f%f%*f,%f",
&a,&b,&c1,&c2,&x,&y,&z);
第五章选择结构程序设计
关系表达式
用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式或赋值表达式)连接起来的式子,称为关系表达式。
关系表达式的值为逻辑值“真”或“假”,以1代表“真”,以0代表“假”。
若a=5,b=3,c=1,则
•a>b>c的计算过程是:
先计算a>b,结果为真,值为1
再计算1>c,结果为假,值为0
•f=b>c!
=a的计算过程是:
先计算b>c,结果为真,值为1
再计算1!
=a结果为真,值为1
最后将1赋值给f
逻辑运算符
!
(逻辑非)
&&(逻辑与)
||(逻辑或)
1)&&和||是双元运算符
它要求有两个关系表达式做为操作数,
如:
(a>b)||(x>y)就是一个逻辑表达式。
2)!
是一元运算符
只要求有一个关系表达式做为操作数,
如:
!
(a>b)就是一个逻辑表达式。
请思考:
5>3&&2||8<4-!
0的值。
逻辑表达式
–逻辑表达式的值是一个逻辑量“真”或“假”。
–C语言编译系统在给出逻辑结果时,以数值1代表“真”,以0代表“假”;但是在判断一个量是否为“真”时,以非0代表“真”,以0代表“假”。
–例如:
若x=10,则!
x的值为0。
若a=3,b=2,则a&&b的值为1。
5&&0||8的值为1。
逻辑运算符特点
在逻辑表达式的求解中并不是所有的运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行下一个运算符。
–当a=5,b=3,c=2,d=1,x=1,y=1则表达式(x=a
而“y=c条件运算符?
:
条件表达式的形式为:
表达式1?
表达式2:
表达式3
–先计算表达式1,若其值为非零,则结果为表达式2的值,否则就是表达式3的值。
结合性:
从右到左
例如:
设a=2,b=3,c=4,则:
计算m=a>b?
a:
b>c?
b:
c
先计算b>c?
b:
c,结果为4
再计算m=a>b?
a:
4,结果为4
则m的值为4,整个表达式的值也为4。
if语句的三种形式:
if形式:
–if(表达式)语句;
–例如:
if(x>y)printf(“%d”,x);
if-else形式:
–if(表达式)语句1;
–else语句2;
–例如:
–if(x>y)printf(“%d”,x);
–elseprintf(“%d”,y);
else-if形式
–if(表达式1)语句1;
–elseif(表达式2)语句2;
–……
–else语句n;
例如:
if(number>500)cost=0.15;
elseif(number>300)cost=0.10;
elseif(number>100)cost=0.075;
elseif(number>50)cost=0.05;
elsecost=0;
if语句中的书写问题:
(1)if语句中,在if后面都有“表达式”,一般为逻辑表达式或关系表达式。
执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,为非0,按“真”处理。
(2)在每一个else前面要有一个分号(;),整个语句结束处也要有一个分号(;)。
(3)在if和else后面只能含有一个内嵌的操作语句,如果有多个语句,要用花括号“{}”将几个语句括起来成为一个复合语句。
嵌套的if语句
–在一个if语句中又包含了另一个if语句,称为if语句的嵌套。
C语言规定,else总是和它上面离它最近的if配对。
因此,最好使内嵌的if语句也包含else部分,如果遇到if和else的数目不匹配,可以通过加花括弧来确定配对关系。
例如:
if()
{if()语句1}
else语句2
switch语句的基本格式:
switch(表达式)
{case常量表达式1:
语句1;[break;]
case常量表达式2:
语句2;[break;]
……
case常量表达式n:
语句n;[break;]
default:
语句n+1;
}
注意:
–当表达式的值与某一个case后面的常量表达式的值相等时,就