admin 管理员组文章数量: 887021
2023年12月16日发(作者:隔爆型三相异步电动机)
全国计算机等级考试二级C语言复习资料
沈阳化工大学
目录
第一章 C语言基础知识 —————————————— 1
第二章 顺序结构 ————————————————— 7
第三章 选择结构 ————————————————— 12
第四章 循环结构 ————————————————— 19
第五章 字符型数据 位运算 ———————————— 26
第六章 函数 ——————————————————— 28
第七章 指针 ——————————————————— 35
第八章 数组 ——————————————————— 37
第九章 数组与指针 ———————————————— 42
第十章 字符串 —————————————————— 47
全国计算机二级C语言考试复习讲义
一、教学讲点
第一章 C语言基础知识
1. C语言的基本构成和格式
#include “stdio.h”
main()
{
int a,b,sum;/* 定义变量*/
a=10; /*把整数10赋值给变量a*/
b=20; /*把整数20赋值给变量b*/
sum=a+b; /*把两数之和赋值给变量 sum*/
printf(“a=%d,b=%d,sum=%dn”,a,b,sum);/*输出计算结果*/
}
(1).C程序由函数组成,一个程序必须且只能有一个主函数(main()),C程序总是从主函数开始执行,在主函数中结束。
(2).定义函数时函数名后必须有一对小括号,函数体必须放在一对花括号内,在函数体中,函数体有两个部分:定义部分和执行部分。定义语句必须出现在执行语句之前,我们先定义了a,b,sum,然后才给它们赋值。
(3).C语言中每条语句都以分号“;”结束,分号时C语句的一部分。即使是程序的最后一个语句也不例外。分号是语句结束的标志。
(4). 一行可以写多条语句,一条语句也可以分在多行上写,但是,不能将一个整体分开。
例如:i nt 是错误的,而int正确。
(5). C语言的注释必须放在“/*”和“*/”之间,“/”和“*”之间不允许有空格。“/*”和“*/”之间不允许再插入“/*”或“*/”。注释可以出现在程序中的任意位置。注释部分不被执行。
(6).C语言程序书写格式自由,语句可以从任一列开始书写,一行内可以写多个语句。但是过于“自由”的程序书写格式往往使人们很难读懂程序,初学者应该从一开始就养成好的习惯,是程序便于阅读。
2. 标识符
(1) 标识符只能由字母、数字和下划线组成。
(2) 标识符的第一个字符必须是字母或下划线。
(3) 标识符的大小写字母是有区别的,如abc和ABC是两个完全不同的标识符。
(3) 标识符的分类:
关键字:关键字是具有特定的含义的、专门用来说明C语言特定成分的一类标识符。详细的查阅附录二。
预定义标识符:在C语言中它也有特定的含义。预定义标识符可以用位“用户表标识符”使用,只是这将使这些标识符失去了原来的意义。
用户标识符:由用户根据需要定义的标识符被成为用户标识符。用户标示符用来给变量、函数、数组或者指针等命名。
3. C语言的数据类型
3.1数据可以分为常量和变量。常量是指在程序执行中不变的量,常量分为:整
- 1 -
型常数、实型常数、字符常量、字符串常量。
整型数据:
进制间的转换
3.11.二、八、十六进制转为十进制
规则:“按权相加”
3.12.十进制转为二、八、十六进制
规则:
整数部分:基数除取余,逆序排列
小数部分:基数乘取整,顺序排列
3.13.二进制转为八、十六进制
规则:三(四)合一,按序相拼(整数部分,从右向左取,小数部分从左向右取,位数不足补零)。
3.14.八、十六进制转为二进制
规则:一分三(四),按序相拼
3.2整型数据在内存中的存放形式
1字节=8位,1Byte=8bit
字长:指CPU能同时处理的二进制位数。由CPU的型号而定。如:16位微机的字长就是16位或2字节。
1GB=1024MB,1MB=1024KB,1KB=1024B
B:表示字节,字节是表示存储容量的最小单位。位(bit):是计算机中信息表示的最小单位。
3.21.正整数在内存中用“原码”形式存放。(直接转换为二进制即可)。
如:5
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
二字节能存放的最大数是:32767
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
对带符号数,最高位是符号位,用0表示正,用1表示负。
3.22.负整数在内存中用“补码”形式存放。
取补码的步骤:
(1)忽略负号,求出原码。
(2)将原码按位取反(0 、1 互换)。
(3)在第二步的基础上加1。
如:取-5的补码。
(1)
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
(2)
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0
(3)
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
- 2 -
将补码转换成相应的整数的步骤:
(1)将补码按位取反加1。
(2)将步骤1得到的二进制数转换成十进制数,然后加上负号即可。
例如:
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
按位取反加1
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
转换成十进制:1×215=32768
加负号:-32768
几个特殊的带符号整数:
1000 -32768
1111 32767
11111 -1
3.23.无符号整数:只有正整数,没有负整数,最高位不表示符号位,每一位均参与转换。
二进制 带符号整数 无符号整数
11111 -1 65535
1000 -32768 32768
例2-12:若有:int a=-1; unsigned b=65535;则
printf(“%d,%u,%d,%u”,a,a,b,b); 输出结果是:-1,65535,-1,65535
数据益出问题:
例2-13:若有int a=32767;则a=a+1的结果是:
-32768
例2-14:若有unsigned b=65536;则b的值是:0
分析:32767:11111
+1
100
将100按照带符号数转为十进制为-32768
65535:11111
+1
1111 1
+1
1 00000000 00000000
65536
unsigned b=655536;而b属于无符号整型,在内存中只占两字节,所以只能包括16位。
标准C没有具体要求规定各类型数据所占内存的字节数, 现以这次考试标准viusal c++6.0为例,说明各类型变量所占的位数。
类型
short
int
所占位数 所占字节 类型
16
32
2
4
所占位数 所占字节数
4
4
unsigned in 32
unsigned lo 32
- 3 -
long 32 4
2
float
double
32
64
4
8 unsigned sho16
3.3实型数据(浮点数)
3.31.实型常量
(1)小数形式:由数字和小数点组成,必须有小数点,小数点的某一侧可以没有数字。如:.23 ,123.876 ,123.
(2)指数形式:用“e”或“E”后接一个整数,表示以10为底的幂数。
注意: “e”或“E”之前之后必须有数字,且之后的数字必须是整数。他们和前后的数字之间不能有空格。
例如:
例2-15:下列合法的常量是( )。
A.-32169 B.0128 C.0XDEFG D.13E0.5
例2-16:下列合法的实型常量是( )。
(A) 0Xff (B)124E (C) 1.23E5.0 (D) 3.E2 (E) 1.25E+2 (F).23e+02
3.32.实型变量
单精度型 float 占 4 字节
双精度型 double 占 8 字节
长双精度 long double 占 16字节(较少用)
4. 表达式与运算符
4.1算术运算符及其表达式:+ - * / %
%:(求余运算)
注意:
(1)%两边必须是整型数据。12.0%3 表达式是错误的。
(2)求余(%)的方法是:忽略符号,求出余数,再将所得余数的符号定为与被除数相同。
例如:17%3 结果是:2
17%-3 结果是:2,-17%3 结果是:-2,-17%-3 结果是:-2
4.2强制类型转换
强制类型表达式:(类型名)表达式
注意:类型名(表达式)这种形式是C++的强制类型表达方式。
5.赋值运算符及其表达式
5.1.赋值运算符 =
格式:变量名=表达式
功能:将表达式的值赋给左边的变量。
注:
(1)赋值运算符左边只能是一个变量,不能是常量,也不能是表达式。
a+b=3 4=3 是非法的表达式
a=6 a+(b=3) 都是合法的表达式
a=b=20 a=(b=10)/(c=2) 都是合法的表达式
- 4 -
(2)实型数据赋给整型变量时,小数部分被舍去,整型数据赋给实型变量时,系统自动将整型数据转换为实型数据。
例如:float a; int b;
表达式a=10%3 的值是1.0
表达式b=a=10%3的值是1
5.2.复合赋值运算符及其表达式:+= -= *= /= %= &= |= ^= >>= <<=
例如:a+=3 相当于a=a+3,a/=b+4 相当a/=(b+4) 或a=a/(b+4)
例:若a=12,则执行表达式a+=a-=a+a后a的值是多少?
分析:a+=a-=(a+a) /*a的值是12*/
a+=a-=24 /*a的值是12*/
a+=a=a-24 /*a的值是12*/
a+=a=-12 /*a的值是12*/
a+=-12 /*a的值是-12*/
a=a+(-12) /*a的值是-12*/
a=-24 /*a的值是-24*/
5.3.自增、自减运算符及其表达式
++ --
注意:
(1)只能用于变量,不能用于常量和表达式。
如:6++ (a+b)-- 都是错误的。
(2)当它们用于变量名前时,表达式的值为变量的值加一或减一。当位于变量名后时,表达式的值为变量原来的值。不论位于变量名前还是变量名后,只要进行了自增、自减运算,变量的值都会在原来的基础上加1或减1。
如:a=3 则 a++ 表达式的值是3 运算之后变量的值是 4
a=3 则 ++a 表达式的值是 4之后变量的值是 4
a=3 则 a-- 表达式的值是3 之后变量的值是 2
a=3 则 --a 表达式的值是2 之后变量的值是 2
(3)口诀:
j=i++;这个表达式是先引用后增值。即:先把i的初始值给变量j,然后 i再自加1。
j=++i;这歌表达式是先增值后引用。即:i先自加1,然后再将我们自加后的值赋值给变量 j。
但是记住它们是一起执行的,就是说:例如j=i++先引用后增值实际上是一起执行的,它们之间不存在先后关系,我们只是位了好记才用到了上面的方法。老师在上课的时候先不要说,但是你们必须知道。j=i--,j=--i和上面j=i++,j=++i的方法是一样。
5.4逗号运算符及其表达式
1.格式:表达式1,表达式2,…,表达式n
注意:1.逗号表达式的值是整个逗号表达式中最后一个表达式的值。
2.求值顺序是从左到右依次求解。
例如:a=(3,b=1)的值是1 运算结束后a的值是1, b的值是 1。
- 5 -
二.相关试题
1.2008年4月相关试题
(11)以下叙述中正确的是
A)C程序中的注释只能出现在程序的开始位置和语句的后面
B)C程序书写格式严格,要求一行内只能写一个语句
C)C程序书写格式自由,一个语句可以写在多行上
D)用C语言编写的程序只能放在一个程序文件中
(12)以下选项中不合法的标识符是
A)print B)FOR C)&a D)_00
(13)以下选项中不属于字符常量的是
A) 'C' B) "C" C)'xCC0' D) '072'
(14)设变量已正确定义并赋值,以下正确的表达式是
A)x=y*5=x+z B)int(15.8%5)
C)x=y+z+5,++y D)x=25%5.0
填空(7)设变量已正确定义为整型,则表达式n=i=2,++i,i++的值为【7】。
2.2007年9月相关试题
(11)C语言源程序名的后缀是
A).exe B).C C).obj
D).cp
(12)可在C程序中用作用户标识符的一组标识符是
A) and B) Date C) Hi
D) case
_2007 y-m-d Big1
(13)以下选项中,合法的一组C语言数值常量是
A) 028 B) 12. C) .177
D) 0x8A
.5e-3 0Xa23 4e1.5 10,000
-0xf 4.5e0 0abc
3.e5
(14)以下叙述中正确的是
A)C语言程序将从源程序中第一个函数开始执行
B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行
C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束
D)main可作为用户标识符,用以命名任意一个函数作为主函数
(16)以下关于long、int和short类型数据占用内存大小的叙述中正确的是
A)均占4个字节 B)根据数据的大小来决定所占内存的字节数
C)由用户自己定义 D)由C语言编译系统决定
(17)若变量均已正确定义并赋值,以下合法的C语言赋值语句是
A)x=y==5; B)x=n%2.5; C)x+n=i; D)x=5=4+1;
3.2007年4月相关考题
(12)下列叙述中错误的是(D )
A)计算机不能直接执行用C语言编写的源程序
- 6 -
B)C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件
C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件
D)后缀为.obj和.exe的二进制文件都可以直接运行
(13)按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(B )
A)大写字母 B)连接符 C)数字字符 D)下划线
(14)以下叙述中错误的是(C )
A)C语言是一种结构化程序设计语言
B)结构化程序有顺序、分支、循环三种基本结构组成
C)使用三种基本结构构成的程序只能解决简单问题
D)结构化程序设计提倡模块化的设计方法
(15)对于一个正常运行的C程序,以下叙述中正确的是(A)
A)程序的执行总是从main函数开始,在main函数结束
B)程序的执行总是从程序的第一个函数开始,在main函数结束
C)程序的执行总是从main函数开始,在程序的最后一个函数中结束
D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束
(19)有以下程序,其中%u表示按无符号整数输出(B )
main()
{unsigned int x=0xFFFF; /* x的初值为十六进制数 */
printf(“%un”,x);
}/*注意:x是占两个字节*/
程序运行后的输出结果是
A)-1 B)65535 C)32767 D)0xFFFF
第二章 顺序结构
一.教学重点、难点
知识点
C语句分类
字符输出函数putchar()
字符输入函数getchar()
格式输入函数printf()
格式输出函数scanf()
所占分值 考核几率 专家点评
0-1
1-2
1-2
3-4
3-4
30%
70%
70%
100%
100%
简单识记
难度适中,重点掌握
难度适中,重点掌握
难度适中,重点理解重点掌握
难度适中,重点理解重点掌握
二.教学内容
1.语句
C语句共分为5类:
1.1控制语句
1.2函数调用语句:
printf(“this is a c statement”);
1.3表达式语句
每一个合法的表达式后加上分号(;)就构成了表达式语句。
++a;i+j;
语句和表达式的区别:
表达式有唯一确定的值,而语句没有值。
- 7 -
1.4赋值语句
格式:赋值表达式;
i=1,j=2是逗号表达式
i=1; j=2;是两条赋值语句
i++; i--;++i;--i;都是赋值语句
等价于i=i+1;或i=i-1;
1.5空语句:只有一个单独的分号构成的语句。如: ;就是一条空语句。
1.6复合语句:用一对{}将若干语句括起来构成一条复合语句。
2.输入输出语句
在使用库函数时必须先用预编译命令#include<头文件名> 或 #include“头文件名”将相应的头文件包含到源程序中。
如:#include
()函数
格式:printf(“格式控制”,输出列表);
功能:按格式控制指定的格式输出数据。
注意:格式控制包括以%开头的“格式说明符”和原样输出的普通字符。
如:printf(“a=%d,a+b=%d”,30,4+7);
输出结果是:a=30,a+b=11
(1)d格式
%d:按实际长度输出十进制整数。
%md:输出占m列,若小于m列,左边补空格,若大于m列,按实际输出。
%-md:输出占m列,若小于m列,右边补空格,若大于m列,按实际输出。
%ld:输出长整型数据,输入输出长整型数据时必须用该格式。
例如:printf(“%d,%6d,%-6d,%ld”,386,1234,3456,12345L);
输出结果:386, 1234,3456 ,12345
printf(“%2d”,12345);
输出结果:12345
(2)u格式
%u:以无符号十进制形式输出整数。
printf(“%u”,-1); 65535
ptintf(“%u”,-32768);32768
(3)o格式
%o:以无符号八进制形式输出整数,不输出前导符0。
printf(“%d,%o”,-1,-1); -1,177777
(4)x或X格式
%x或%X以无符号十六进制形式输出整数。不输出前导符0x或0X,小写对小写,大写对大写。
printf(“%d,%x,%X,%x”,-1,-1,0xabc,0XAbc);
-1,ffff,ABC,abc
注:若要输出十六进制和八进制的前导符,则要用%#o和%#x、%#X格式。
printf(“%#o,%#x,%#X”,-1,-1,0xaBc);
0177777,0xffff,0XABC
(5)c格式
%c用来输出一个字符,不输出单引号定界符。%c和%d可以相互转换。
printf(“%c,%d”,’a’,’a’); a,97
printf(“%c,%d”,100,100); d,100
- 8 -
(6)s格式
用来输出一个字符串,不输出双引号和字符串结束符。
%s:输出字符串的有效字符。
printf(“%s”,”china0yunnan”); china
%ms:输出占m列,若小于m列,左边补空格,大于m列,按实际输出。
printf(“%5s,%-5s,%2s”,”swfc”,”swfc”,”swfc”);
swfc,swfc ,swfc
%:输出占m列,只输出字符串的左n个字符到m列的右端。
如:printf(“%7.5s”,”yunnan”);
yunna
(7)f格式:按小数形式输出实型数据。
%f:默认输出6位小数。
如:printf(“%f,%f”,543.12,5.4312e+2);
543.120000,543.120000
%:输出占m列,其中有n位小数。若超过m列,确保n位小数后按实际输出。注意四舍五入问题。
如:printf(“%7.3f,%-7.3f,%4.2f”,3.1415726,3.1415926,314.5926);
3.142,3.142 ,314.59
(8)e格式
以指数形式输出一个实数。小数点前只有一位非零数,5位小数,3位指数。
如:printf(“%e,%e”,123.4,123.45e-7);
234000e+002,1.234500e-005
(9)g格式
自动在%f和%e中选择较短的一种输出,对于小数部分不输出无意义的0。
如:printf(“%g,%g”,123.45,123.45e-2);
123.45,1.2345
printf(“%g”,123000000.0);
23e+08
小结:
(1)%%表示输出一个%。
如:printf(“%%d=%d”,10,10);
%d=10
(2)除了x,e,g大小写均可外,其它都只能小写。
如:printf(“%d=%D”,20,20);
20=%D
(3)输出格式说明符所能操作的数据类型必须与输出项的类型一致。
如:printf(“%d”,1.234);/*出错*/
2.2. scanf()函数
格式:scanf(“格式控制”,地址列表);
注意:
(1)可指定数据所占的列数,输入后由系统自动截取相应的位数。
如:scanf(“%3d%2d”,&a,&b);
若输入:3863018
则:a的值是:386
b的值是:30
若输入:3863
- 9 -
a的值是:386
b的值是:3
scanf(“%3c%2d”,&ch,&c);
若输入:3863018
则: ch的值是:’3’
b的值是:30
(2)%*md:表示跳过m列不读。
如:scanf(“%*3d%3d%4d”,&a,&b);
若输入:123456
则:a的值是:456
b的值是:原来的值。
(3)不能在scanf()函数中指定输入数据的小数位数。
如:scanf(“%7.5f”,&a);/*出错*/
在scanf()函数中,输入时普通字符原样输入。
如:scanf(“a=%d,b=%d”,&a,&b);
若要给a赋值5,b赋值10,正确的输入是:a=5,b=10
scanf(“%d*,%d#,%d”,&a,&b,&c);
若要让a,b,c分别得到1,2,3,正确的输入是:1*,2#,3<回车>
若两个格式说明符之间没有其它字符,则在输入数据时,两数据之间要用回车或空格分隔,回车或空格可以是多个。但是,%c格式除外。
如:scanf(“%d%d”,&a,&b);
若想让a的值为5,b的值为10。则正确的输入是:
5 空格10<回车> 或 5<回车>
10<回车>
或5空格 空格 空格10<回车>
(6)多个%c格式之间没有其它字符,仍然不能用回车或空格来分隔。
如:scanf(“%c%c%c”,&a,&b,&c);
若输入:a空格b空格c<回车>
a的值是’a’,b的值是空格,c的值是’b’。
(7)格式说明符所能操作的数据类型必须与对应变量的类型相同。
如:int a; scanf(“%f”,&a); /*出错*/
总结:
1.普通字符原样输入,原样输出。
2.对于%d格式,指定宽度小于输出宽度,原样输出。
3.%#o,%#x,%#X表示要输出八进制的前导符数字0,和十六进制的前导符0x,0X。
4.%x,%X格式,小写对小写,大写对大写。
5.%*md:表示跳过相应的输入项。
6.注意进制间的转换,以及无符号数和带符号数之间的转换。
7.在scanf()函数中,给double类型变量输入数据时,应该使用%lf类型说明符,而输出时,可以用%lf,也可以用%lf。
三. 试题分析
1.2008年4月试题分析
(16)有以下程序段
char ch; int k;
- 10 -
ch='a'; k=12;
printf("%c,%d,",ch,ch,k); printf("k=%dn",k);
已知字符a的ASCll十进制代码为97,则执行上述程序段后输出结果是
A)因变量类型与格式描述符的类型不匹配输出无定值
B)输出项与格式描述符个数不符,输出为零值或不定值
C)a,97,12k=12
D)a,97,k=12
2.2007年9月试题分析
(15)若在定义语句:int a,b,c,*p=&c; 之后,接着执行以下选项中的语句,则能正确执行的语句是
A)scanf("%d",a,b,c); B)scanf("%d%d%d",a,b,c);
C)scanf("%d",p); D)scanf("%d",&p);
(18)有以下程序段
int j; float y; char name[50];
scanf("%2d%f%s", &j, &y, name);
当执行上述程序段,从键盘上输入55566 7777abc 后,y的值为
A)55566.0 B)566.0 C)7777.0 D)566777.0
填空(6)执行以下程序时输入1234567
#include
main()
{ int a=1,b;
scanf("%2d%2d",&a,&b); printf("%d %dn",a,b);
}
3.2007年4月试题分析
(16)设变量均已正确定义,若要通过scan(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)( D)
A)10□X□20□Y〈回车〉 B)10□X20□Y〈回车〉
C)10□X〈回车〉 D)10X〈回车〉
20□Y〈回车〉 20Y〈回车〉
填空(6) 执行以下程序后的输出结果是 。
main()
{int a=10;
a=(3*5,a+4); printf(“a=%dn”,a);
}
第三章 选择结构
一.教学重点、难点
知识点
关系运算符及优先次序
关系表达式
逻辑运算符及优先级
所占分值
0-1
0-1
1-2
考核几率
40%
50%
50%
专家点评
简单识记
简单,属重点识记知识点
简单识记
- 11 -
逻辑表达式
if语句的几种形式
if语句的嵌套
条件运算符
switch语句
语句标号
goto
1-2
1-2
1-2
0-1
2-4
0-1
1-2
50%
100%
100%
100%
100%
10%
10%
简单,属重点识记知识点
简单识记
难度适中,重点掌握
难度适中,重点掌握
简单,重点掌握重点理解
偏难,不是重点
简单识记
二.教学内容
1.关系运算与逻辑运算
1.1逻辑值
真(非零值) 假(零)
1.2关系运算符及其表达式
< <= > >= == !=
关系运算符优先级别低于算术运算符,高于赋值运算符。
( < <= > >=)优先级别高于(== !=)
如:a>b+c 等价于a>(b+c)
a==b a=b 4==4 表达式的值为“真”。 4=4 表达式不合法 关系表达式的值只有1和0,其中1表示“真”,0表示“假”。 1.3逻辑运算符及其表达式 && 逻辑“与” || 逻辑“或” !逻辑“非” 优先级别:! 》&& 》|| 运算规则: 逻辑&&:遇假则假 逻辑||:遇真则真 逻辑!:真假互换 逻辑表达式的值:1(真)、0(假) 例如:3>4 结果是:0 3&&4结果是:1 !3&&4结果是:0 0||3结果是:1 注意:在求解逻辑与(&&)表达式时,若&&运算符左边表达式的值为0(假),则不再进行&&右边表达式的运算,且将整个&&表达式的值定为0;在求解逻辑或(||)表达式时,若||左边表达式的值为非0值(真),则不再进行||右边表达式的运算,且将整个逻辑||表达式的值定为1(真)。 - 12 - 语句 2.1.if语句格式: 1) if(表达式) 2)if(表达式) 语句1; 语句1; else 语句2; 称为:全if 单if 注意: (1)if 后的表达式必须用()括起,else后没有表达式。 (2)if和else都只能控制紧跟它的一条语句,若要控制多条语句,必须用一对{}括起构成一条复合语句。 2.2执行方式: 2.21 if语句的执行方式:首先判断表达式的值是否为“真”,若“真”,则执行语句部分。如果表达式的值为“假”,则“跳过”语句部分执行if语句后面的其它语句。 2.22 if-else语句的执行方式:首先判断表达式的值是否为“真”,若“真”,则执行语句部分。如果表达式的值为“假”,则执行else语句后面的语句。 例1:main() {int m=5; if(m++>5) printf(“m=%d”,m); else printf(“m=%d”,m--); } 例2:main() {int m=5; if(++m>5) printf(“m=%d”,m); else printf(“m=%dn”,m--); printf(“m=%d”,m); } 2.3 if 语句的嵌套 if(表达式1) if(表达式2) 语句1; else 语句2; else if(表达式3) 语句3; else 语句4; else总是与前面最近的且未配对的if语句配对,组成一对if-else语句。 if(表达式1) if(表达式2) 语句1; else if(表达式3) 语句2; else 语句3; 第一个else语句有的同学会把它误以为和第一个if配对,但是实际的情况是和第二个if语句配对,即: - 13 - if(表达式1) if(表达式2) 语句1; else if(表达式3) 语句2; else 语句3; 例1.请分析下列程序的输出结果。 main() { int s,t,a,b; sanf(“%d%d”,&a,&b); s=1;t=1; if(a>0) s=s+1; if(a>b) t=s+1; else if(a==b) t=s; else t=2*s; printf(“%dn”,t); } 若运行时输入5 10 回车,则程序的执行结果是? main() { int s,t,a,b; sanf(“%d%d”,&a,&b); s=1;t=1; if(a>0) {s=s+1; if(a>b) t=s+1;} else if(a==b) t=s; else t=2*s; printf(“%dn”,t); } 若运行时输入5 10 回车,则输出结果是? 例2.分析下列程序的输出结果 main() { int a=4,b=3,c=5,t=0; if(a if(a printf(“%d %d %dn”,a,b,c); } main() { int a=4,b=3,c=5,t=0; if(a if(a printf(“%d %d %dn”,a,b,c); } 联想交换的思想:若要交换a和b的值,通常的做法是:{t=a;a=b;b=t;} 3.条件运算符和条件表达式 - 14 - 条件运算符:? : 是唯一一个三目运算符。优先级别高于赋值运算,结合方向自右向左。 格式:表达式1 ?表达式2 :表达式3 执行方式:先求“表达式1”的值,若其值为“真”,求出“表达式2”的值作为整个条件表达式的值;若其值为“假”,求出“表达式3”的值作为整个表达式的值。 例如:max=a>b?a:b; 相当于:if(a>b) max=a; else max=b; a>b?a:c>d?c:d 相当于a>b?a:(c>d?c:d) 注意:表达式1、2、3的值不要求具有相同的类型,最后结果的类型为表达式2、3中较高类型的一种。如:(x=6)>(y=5)?1:1.5 表达式的值是 1.0而不是1。 语句 格式: switch(表达式) { case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; … case 常量表达式n:语句n;break; default :语句n+1;break; } 说明: (1) switch、case、default、break都是关键字。花括号里面的语句叫做switch语句体。Switch语句体中可以没有break语句和default部分。 (2) Switch语句的圆括号中表达式的值必须是整型或是字符型,不能为实型。case后的表达式可以是求得整型量的常量表达式,但是常量表达式中不能含有变量。 (3) 执行Switch语句时,首先计算Switch后圆括号的表达式的值,然后将这个值与语句体中case后的常量表达式的值相比较,如果某个常量表达式的值与之相等,则执行该case后的语句块;如果没有任何一个常量表达式的值与之相等,则执行default后的语句块。 (4) 在执行的时候如果遇到break语句,则跳出switch语句。如果执行完一个case或者default语句块后没有遇到break,则继续顺序往下执行,知道遇到break语句或者语句体被执行完毕为止。 (5) default最多只能有一个,通常出现在switch语句的最后部分,但也可以出现在case之间或所有的case之前。 四.试题分析 1.2008年4月试题分析: (17)已知字母A的ASCⅡ代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是 A)kk>='A'&&kk<='Z' B)!(kk>='A'||kk<='Z') - 15 - C)(kk+32)>='a'&&(kk+32)<='z' D)isalpha(kk)&&(kk<91) (18)当变量c的值不为2、4、6时,值也为“真”的表达式是 A)(c==2)||(c==4)||(c==6) B)(c>=2&&c<=6)||(c!=3)||(c!=5) C)(c>=2&&c<=6)&&!(c%2) D)(c>=2&&c<=6)&&(c%2!=1) (19)若变量已正确定义,有以下程序段 int a=3,b=5,c=7; if(a>b) a=b; c=a; if(c!=a) c=b; printf("%d,%d,%dn",a,b,c); 其输出结果是 A)程序段有语法错 B)3,5,3 C)3,5,5 D)3,5,7 (20)有以下程序 #include main() { int x=1,y=0,a=0,b=0; switch(x) { case 1: switch(y) { case 0: a++; break; case 1: b++; break; } case 2: a++; b++; break; case 3: a++; b++; } printf(“a=%d,b=%dn”,a,b); } 程序的运行结果是 A)a=1,b=0 B)a=2,b=2 C)a=1,b=1 D)a=2,b=1 2.2007年9月试题分析 (20)有以下计算公式 若程序前面已在命令行中包含math.h文件,不能够正确计算上述公式的程序段是 A) if(x>=0) y=sqrt(x); B) y=sqrt(x); else y=sqrt(-x); if(x<0) y=sqrt(-x); C) if(x>=0) y=sqrt(x); D) y=sqrt(x>=0?x :-x); if(x<0) y=sqrt(-x); (21)设有条件表达式:(EXP)? i++ :j-- ,则以下表达式中与(EXP)完全等价的是 A)(EXP==0) B)(EXP!=0) C)(EXP==1) D)(EXP!=1) (23)已有定义:char c; ,程序前面已在命令行中包含ctype.h文件。不能用于判断c中的字符是否为大写字母的表达式是 A)isupper(c) B)'A'<=c<='Z' C)'A'<=c&& c <='Z' D)c <=('z'-32)&&('a'-32)<= c (7)以下程序的功能是:输出a、b、c三个变量中的最小值。请填空。 #include main( ) { int a,b,c,t1,t2; - 16 - scanf("%d%d%d",&a,&b,&c); t1= a t2= c printf("%dn", t2 ); } 3.2007年4月试题分析 (20)设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是(C ) A)if(x++); B)if(x>y&&y!=0); C)if(x>y) x- - D)if(y<0) {;} else y++; else x++; (21)以下选项中,当x为大于1的奇数时,值为0的表达式( ) A)x%2==1 B)x/2 C)x%2!=0 D)x%2==0 (22)以下叙述中正确的是(C ) A)break语句只能用于switch语句体中 B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环 C)break 语句只能用在循环体内和switch语句体内 D)在循环体内使用break语句和continue语句的作用相同 (23)有以下程序( ) main() {int k=5,n=0; do {switch(k) {case1: case3:n+=1; break; default;n=0;k--; case2: case4:n+=2;k--;break; } printf(“%d”,n); }while(k>0&&n<5); } 程序运行后的输出结果是 A)235 B)0235 C)02356 D)2356 第四章 循环结构 一.教学重点、难点 知识点 while语句 do...while语句 for语句 循环嵌套 循环比较 所占分值 2-3 2-3 5-7 4-6 0-1 考核几率 100% 100% 100% 100% 20% 专家点评 重点理解重点掌握 重点理解重点掌握 重点理解重点掌握 重点理解重点掌握 简单识记 - 17 - break语句 continue语句 2-3 2-3 70% 50% 难度适中,重点掌握 难度适中,重点掌握 注意:循环在这一章中的知识点比较少,但是它贯穿了整个的C语言的章节中,老师在教学中一定要把它它当做重点中的重点来抓! 二.教学内容 语句 格式: while(表达式) { 循环体语句 } 注意: 是C语言的关键字。 后必须有小括号将表达式括起,里面的表达式是C语言中任意的表达式,作用是控制循环。其值为“真”(非0)则执行循环体语句,否则跳出while循环。 语句也只能控制紧跟它的一条语句。若需要控制多条语句,必须用{}括起,构成一条复合语句。 1.4.圆括号内的表达式不能省略。循环体中的可以由一条空语句构成,表示循环体部分不做任何的操作。如:while(表达式);/*;是循环体,它是一条空语句*/ 例如:分析下列程序的输出结果。 1.5.执行过程: (1)计算圆括号中表达式的值。若为非0则执行循环体语句,若为0则跳出循环。 (2)执行完循环体语句后重复过程(1)。 main() { int i=1,sum=0; while(i<=100){ sum=sum+I; i++; } printf(“sum=%d”,sum); } 这是学习C语言基础循环的最好的练习,老师让学生练习的时候可以把i控制在10以内,让学生知道什么是循环. 2.d0-while语句 格式: do 循环体 while(表达式); 注意: 是C语言的关键字,需要和while一起搭配使用。 后必须有小括号将表达式括起,里面的表达式是C语言中任意的表达式,作用是控制循环。其值为“真”(非0)则执行循环体语句,否则跳出while循环。 语句也只能控制紧跟它的一条语句。若需要控制多条语句,必须用{}括起, - 18 - 构成一条复合语句。 2.4.圆括号内的表达式不能省略。循环体中的可以由一条空语句构成,表示循环体部分不做任何的操作。如: do{;}while(表达式);/*;是循环体,它是一条空语句*/ 2.5.由于do-while循环结构整个语法上也是C语言语句,因此最后的分号必不可少,它同样表示语句的结束。 2.6.执行过程: (1)执行循环体语句。 (2)计算圆括号中表达式的值。若为非0则重复(1),否则跳出循环。 语句 格式: for(表达式1;表达式2;表达式3) 循环体 是C语言的关键字. 3.2for之后的圆括号内一共有三个表达式,以分号“;”隔开。一般情况下,表达式1的作用是赋初值;表达式2的作用是控制循环;表达式3的作用是赋值。 语句也只能控制紧跟它的一条语句。若需要控制多条语句,必须用{}括起,构成一条复合语句。 3.4. 表达式1、2、3均可以省略,若省略表达式2,则认为表达式2的值始终为真。而两个分号绝不能省。 3.5执行过程: (1)计算表达式1; (2)计算表达式2,若其值为非0,转步骤(3);若其值为0则转步骤(5); (3)执行一次for循环体。 (4)计算表达式3,转步骤(2)。 (5)结束循环,执行for语句后面的语句。 4.循环结构的嵌套 在一个循环体内,又包含另一个循环。 三种循环语句可以相互嵌套。 main() { int i,j; for(i=1;i<3;i++) for(j=1;j<4;j++) printf(“ni=%d,j=%d”,i,j); printf(“ni=%d,j=%d”,i,j); } for(i=1; ;i++) printf(“%d”,i); /*表达式2的值始终为真,这是死循环*/ 和 continue 语句 break 语句用于结束循环或switch结构。 continue 语句用于结束本次循环,跳过循环中continue后尚未执行的语句,继续进行下一次循环条件的判断。 注意:break 语句只能控制直接包含它的switch结构或循环。 - 19 - continue语句只能控制直接包含它的循环。 例1: main( ) { int i,s1=0,s2=0,s3=0; for(i=1;i<=10;i++) {switch(i%5) {case 1:s1++; case 2:s2++;break; case 3:s3++;contiune; } s1++; } printf(“%d,%d,%d”,s1,s2,s3); } 例2: 把1~100之间能被4整除的数输出。(老师一定要教会学生这中方法!) main() { int i; for(i=1;i<=100;i++) { if(i%4!=0) continue; printf(”%3d”,i); } } 三.试题分析 1.2008年4月试题分析 (21)有以下程序 #include main() { int x=8; for( ; x>0; x--) { if(x%3) {printf(“%d,”,x--); continue;} printf(“%d,”,--x); } } 程序的运行结果是 A)7,4,2 B)8,7,5,2 C)9,7,6,4 D)8,5,4,2 (22)以下不构成无限循环的语句或者语句组是 A)n=0; B)n=0; do{++n;}while(n<=0); while(1){n++;} C)n=10; D)for(n=0,i=1; ;i++) n+=i; while(n);{n--;} (31)有以下程序 #include main() - 20 - { int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i; for(i=0;i<12;i++) c[s[i]]++; for(i=1;i<5;i++) printf(“%d”,c[i]); printf(“n”); } 程序的运行结果是 A)1 2 3 4 B)2 3 4 4 C)4 3 3 2 D )1 1 2 3 (32)有以下程序 #include void fun(int *s,int nl,int n2) { int i,j,t; i=nl; j=n2;
版权声明:本文标题:全国计算机二级C语言考试复习讲义 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1702712312h427731.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论