北京化工大学C语言复习题Word文档下载推荐.docx
《北京化工大学C语言复习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北京化工大学C语言复习题Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
由华氏求摄氏的正确的赋值表达式是____。
A)C=5/9(F-32)
B)C=5*(F-32)/9
C)C=5/9*(F-32)
D)三个表达式都正确
9.若有以下说明和语句:
structworker
{
intno;
char*name;
}work,*p=&
work;
则以下引用方法不正确的是____。
A)work.no
B)(*p).no
C)p->
no
D)work->
no
10.为了判断两个字符串s1和s2是否相等,应当使用____。
A)if(s1==s2)
B)if(s1=s2)
C)if(strcpy(s1,s2))
D)if(strcmp(s1,s2))
11.下述程序的输出是______。
main()
{charc='
A'
;
if('
0'
<
=c<
='
9'
)printf("
YES"
);
elseprintf("
NO"
}
A)YES
B)NO
C)YESNO
D)语句错误
二、读程序写结果(共18分)
1.下面程序段的运行结果是__________.
intn=0;
while(n++<
=2);
printf("
n);
2.下面程序的运行结果是__________.
#include<
stdio.h>
voidmain()
inta=15,b=21,m=0;
switch(a%3)
{
case0:
m++;
break;
case1:
switch(b%2)
default:
case0:
%d\n"
m);
3.下面程序的运行结果是______。
#include<
intx=10,y=20,t=0;
if(x==y)t=x;
x=y;
y=t;
printf(“%d,%d\n”,x,y);
4.下面程序的运行结果是______。
voidmain(){
inti,j,p,s;
s=0;
for(i=1;
i<
=4;
i++){
p=1;
for(j=1;
j<
=i;
j++)
p=p*j;
s=s+p;
printf(“s=%d\n”,s);
5.下面程序的运行结果是______。
string.h>
char*p=“abcdefg\0hjik\0”;
printf(“%d\n”,strlen(p));
6.下面程序的运行结果是______。
intFun(intx)
staticinty=0;
y+=x;
returny;
}
int
x=10,y=0,k;
for(k=0;
k<
2;
k++)
y=Fun(x);
y=%d\n"
y);
}
三、程序填空(共14分)
1.下面程序可求出矩阵a的主对角线上的元素之和。
{inta[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;
for(i=0;
3;
i++)
for(j=0;
if(i==j)sum=sum+
A
printf("
sum=%d\n"
sum);
2.下面程序用于求含有50个元素的一维数组中的最小值及负数的个数;
其中一维数组中的每个元素是由公式y[j]=600*sin(j*0.16)得到的。
math.h>
voidmain()
floaty[50],min;
intj,num=0;
voidfun(floaty[50],float*min,int*num);
for(j=0;
50;
y[j]=600*sin(j*0.16);
A
printf(“min=%f,Thenumberofnegativeis=%d”,min,num);
voidfun(floaty[50],float*min,int*num)
intj;
*min=y[0];
j++){
if(*min>
y[j])
B
;
if(y[j]<
0)
C
3.下面的程序对用户输入的一串字符进行处理,统计出其中小写字母字符的个数。
voidmain(){
chars[100];
intletter=0,i=0;
pleaseinputsomecharacters\n"
);
while(
B
){
if(
)
letter++;
i++;
};
letternum=%d”,letter);
四、改写程序(3分)
1.该程序的功能是根据键盘输入的学生考试分数,判断学生是否通过考试。
(60分以上为通过)
#include<
void
main()
ints;
scanf("
s);
if(s>
=60)
通过考试"
else
没有通过考试"
);
请用条件运算符
?
:
判断结构改写程序中的if
判断结构。
答案:
一、选择题:
CBABDCDBDDA
1.C
只能有字母、数字、下划线,但是第一个字符不可是数字
2.B
3.A
‘’中只能是一个字符,a+b不可以
‘\0’是转义字符,可以
数字是可以的(实际上就是输入了对应字符的ASCII码,char和int是近亲)
4.B
(D中~是位运算符号,40学时中没讲到)
5.D
%两侧必须是整数,注意强制转换符,括号的位置
6.C
数组下标从0开始
7.D
数组在定义的时候,中括号里必须是常量,不能是变量,否则系统不知道在定义的时候应该给这个数组多少存储空间;
但是#define是符号常量,也是常量,可以。
8.B
乘号不可以省略,主页君编程的时候经常忘记乘号;
5/9在C语言中得0;
5.0/9就不是0了。
9.D
结构体引用的三种方式:
(假设有一个结构体work有一个指针p指向work)
work.no
(*p).no
p->
第三种,左边必须是一个指针项,不可以是常项,所以错;
10.D
字符串不可以直接比大小要使用strcmp函数
11.A
‘0’<
=c<
=’9’:
先计算’0’<
=c,得1;
再计算1<
=’9’,得1;
所以输出YES
如果要实现数学上的“区间”概念,应该改写成’0’<
=c&
&
c<
=’9’
注意,一旦出现||和&
运算符,要考虑这两个符号的“短路问题”
即:
如果||的左边非零,||一定成立,右边的就不做了,即使右边有赋值,++符号等也不做了。
如果&
左边为零,%%一定不成立,右边也就不做了,同上。
二、读程序写结果
1.答案:
4
注意:
(1)while后面执行的是空语句;
(2)n++的意义是:
先把n拿出来用,参与运算,运算完了之后n再++
最后一次循环,也就是n等于3的时候,n++<
=2是先判断n<
=2,为假,准备退出循环,这个时候n再++,所以n=4
2.答案:
1
switch(b%2)嵌套在switch(a%3)之内的,所以case0后面执行了break,跳出大的switch,所以第二个switch就不执行了。
3.答案:
20,0
(1)有个逗号;
(2)if后面执行的语句理论上只有一句,如果想要在if后面执行好多句,需要加{}
此处没有加,所以t=x不执行,但x=y和y=t执行,所以答案是那样子。
4.答案:
s=33
(1)相当于求1的阶乘,2的阶乘,3的阶乘,4的阶乘,再把这四个加起来
(2)注意s=不能丢掉
5.答案:
7
strlen字符串长度统计函数,统计到第一个‘\0’之前有多少个字符,‘\0’不算在内
注意sizeof与之不同
charstr[10]=’zhadui\0’;
用sizeof统计,得10;
用strlen统计,得6
6.答案:
y=10
y=20
(1)y=不要丢下,回车不要忘掉
(2)static是静态型,第一次运算完之后,数值不丢掉
三、程序填空
1.a[i][j]或a[i][i]或a[j][j]因为i==j
2.
(1)fun(y,&
min,&
num)
y后面不可加[50],否则代表第五51个数组y的元素(实际上只有50个……)
后面两个,注意要与声明中一致,加取地址符号
(2)*min=y[j]别忘了取值符号
(3)(*num)++
括号一定不能掉,因为++的优先级在*之前,不加括号就变成了地址++
3.
(1)scanf(“%s”,s)或gets(s)
(2)s[i]!
=’\0’这个一定要会!
(3)s[i]>
=’a’&
s[i]<
=’z’
四、改写程序
S>
=60?
printf(“通过考试”):
printf(“没有通过考试”);
最后,主页君友情提示:
(1)写输出结果的时候,一定看看printf中除了你的得数,有没有别的符号,例如s=或者逗号、回车之类的东西,一块写出来;
(2)填语句的时候,看看原来有没有分号,如果没有的话一定要填上,有的话就不要再填上。
理论上说,多一个分号,少一个分号,代表的含义完全不一样……
C语言程序的基本结构
C程序由函数组成,函数是程序的基本单位。
/*程序从main()函数开始执行;
文件包含预处理命令:
#include“文件名”或#include<
文件名>
,将存有库函数的.h头文件包含到编辑中的程序中,可视为在主函数前自定义一堆子函数(当然是程序员定义的,咱即使能根据函数原型声明使用,但也暂时不懂在主函数后头定义啊);
*/
函数由函数首部和函数体两部分组成。
/*void
main()就是函数首部,void表示函数无返回值,忽略了形参表;
函数定义为:
返回类型名
函数名(形参表),形参表格式:
形参数据类型
形参名,多个形参用上述格式的逗号分隔式罗列;
函数体一般包括数据定义部分和执行部分,它们都是C语句。
/*符号常量定义格式为:
#define
符号常量
常量,是个编译预处理命令,用符号代替常量的值;
变量定义格式为:
数据类型
变量名表;
,多个变量名用逗号分隔式罗列于变量名表中;
每条语句用分号“;
”作结束符,分号是C语句必不可少的组成部分。
在C语言中,一行可以写多条语句,一条语句也可写成几行。
可以对C程序中的任何部分做注释。
/*如同本文行文风格;
“/*”和“*/”为注释的开始和结束;
可注释说明程序语句意义或调试程序时括住某些语句达到不同目的等;
C语言的字符集
C语言的字符集由字母、数字、空白符、标点和特殊字符组成。
在字符常量、字符串常量和注释中还可以使用汉字或其他可显示的图形符号。
/*详见P5;
C语言的词法符号
C语言的词法符号分为以下几类:
关键字、标识符、运算符、分隔符、常量和注释符。
/*C语言规定,标识符是英文字母或下划线开始的,英文字母、下划线及阿拉伯数字组成的字符串。
标识符不许与关键字相同,大小写有别,应尽量见名知意;
详见P6*/
运行C程序的步骤
编辑,编译,连接,执行。
/*C源程序经过编译和连接步骤才能生成可执行文件;
数据类型之基本类型
整型数据包括整型常量和整型变量。
整型变量定义格式为:
整型类型
,常用的整型类型有int型。
/*一般int型就够用了,详见P15;
实型数据包括实型常量和实型变量。
实型变量定义格式为:
实型类型
,常用的实型类型有float型和double型。
/*指数形式:
aEn,等价于a*10^n,详见P16;
字符型数据包括字符常量和字符变量。
字符变量定义格式为:
char
。
/*转义字符为字符常量,常用转义字符\n为换行命令,详见P17;
变量赋初值格式:
类型说明符
变量1=值1,变量2=值2,……;
/*根据实际需要使用,对在程序开始就要赋值的情况下省事好多;
运算符与表达式
算术运算符与算术表达式;
赋值运算符与赋值表达式:
变量=表达式;
逗号运算符和逗号表达式:
表达式1,表达式2,……,表达式n。
/*基本算术运算与数学表达式相同但乘号“*”不可省略,“/”整除为向下取整而非四舍五入,“%”为求余运算符,自增自减运算符置于变量左边先自增自减再参与其他运算,置右反之;
逗号表达式自左至右执行,最末一条表达式的值为逗号表达式的值;
详见P18-P20*/
各类数值型数据间的混合运算
自动类型转换包括非符值运算的类型转换和赋值运算的类型转换;
强制类型转换格式:
(数据类型名)表达式。
/*一般在赋值运算的类型转换会有误差,编译有警告,你若容不下一个警告,可以用强制类型转换解决之;
详见P21*/
数据的输入输出
标准字符输出函数格式:
putchar(c)。
标准字符输入函数格式:
getchar()。
格式输出函数格式:
printf(”格式控制字符串”,输出列表),其中格式字符串格式为:
%[附加格式说明符]格式字符。
格式输入函数格式:
scanf(”格式控制字符串”,地址列表),其中格式字符串格式为:
/*其中%d常用于int型数据输出输入,%f常用于float型数据输出输入,%lf常用于double型数据输出输入,附加格式说明符m.n表示以m位总长n位小数的数据格式输出不可用此格式输入,附加格式说明符可缺省;
普通变量地址列表格式:
a,其中&
为取址符;
这些函数需要使用预处理命令#include命令将头文件stdio.h包含到用户源程序中;
顺序结构程序设计
C语言的语句可分为以下5类:
表达式语句、函数调用语句、控制语句、空语句和复合语句。
/*符号常量、变量、函数等遵循先定义后使用原则;
详见P25*/
分支结构程序设计
关系运算和逻辑运算。
/*一般用于条件判断;
“==”才是等于号,但只是用来判断真假,“=”号是赋值号,右边算出来是多少就用它替代左边变量的值;
运算式从左到右算,最后得到非0值为真,0值为假;
逻辑运算符:
“&
”与,“||”或,“!
”非,遵循数学运算规则;
详见P30-P31*/
If语句:
if-else分支结构一般形式:
if(表达式)
语句1;
else
语句2;
if分支结构一般形式:
if语句的嵌套:
if(表达式1)
if(表达式2)
if(表达式3)
语句3;
语句4;
if-else
……else
if(表达式n-1)
语句n-1;
语句n;
条件运算符及条件表达式:
表达式1?
表达式2;
表达式3;
/*上述所说语句皆表示一条语句,若分支有多条语句当用大括号组成复合语句,系统视之为一条语句;
一个else总是与其上面距它最近的,并且没有其他else与其配对的if相配对,而不能单独使用;
条件表达式先判断表达式1,为真执行表达式2,为假执行表达式3;
关于嵌套,个人经验学课本例题那样多打回车,系统常常帮读者分层次,当然读者也得留心*/
Switch语句:
switch分支语句的一般形式为:
switch(表达式e)
case
常量表达式c1:
[break;
]
常量表达式c2:
]……
常量表达式cn:
[default:
语句n+1;
]}
/*此语句中,遇到break或者执行到底才跳出该switch语句,为免错误执行,还是要在适当的地方添加break语句;
根据个人经验,此switch语句中执行到break语句后只跳出switch语句,当switch语句嵌套在循环内时,循环仍旧依循环条件执行而不退出;
循环结构程序设计
while语句的一般形式:
while(表达式)
循环体语句;
do-while语句一般形式:
do{
}while(表达式);
for语句一般形式:
for(表达式1;
表达式3)
break语句一般形式:
break;
continue语句一般形式:
continue;
goto语句一般格式:
语句标号:
可执行语句;
……goto
语句标号;
/*while语句与do-while语句括号内表达式为循环条件表达式,非0时执行循环体语句,否则退出循环,执行下面的语句;
for语句中表达式1用于循环变量赋初值,表达式2用于循环条件判断,表达式3用于改变循环变量的值;
break语句用于跳出循环体,执行循环后面的语句;
continue语句用于结束本次循环,直接执行下一次的循环条件判断;
goto语句用于自动跳转到指定语句,有时会破坏程序结构,不倡导使用,但在特定情况下能带来方便;
注意防止死循环,嵌套注意层次,循环不能交叉*/
数组
一维数组:
一维数组的定义:
类型名
数组名[常量表达式];
,一维数组的引用:
数组名[下标],一维数组的初始化:
数组名[整型常量表达式]={初始化列表};
二维数组:
二维数组的定义:
数组名[常量表达式1][常量表达式2];
,二维数组的引用:
数组名[行下标][列下标],二维数组的初始化:
分行初始化:
数组名[常量表达式1][
常量表达式2]={{第0行元素初值表},{第1元素初值表}……};
,按序初始化:
常量表达式2]={初值表};
字符数组:
一维字符数组的定义:
,字符数组的初始化:
数组名[数组长度]={字符初值表};
,一维字符数组的引用:
数组名[下标]。
用字符串初始化字符数组:
数组名[数组长度]={字符串常量};
字符串处理函数:
字符串输入函数:
gets(字符数组名);
,字符串输出函数:
puts(字符数组名);
,字符串连接函数:
strcat(字符数组1,字符数组2);
,字符串复制函数:
strcpy(字符数组1,字符串2);
,字符串比较函数:
strcmp(字符串1,字符串2);
,检测字符串长度函数:
strlen(字符串);
,字符串小写函数:
strlwr(字符串);
,字符串大写函数:
strupr(字符串);
/*数组可视为类型相同的一串变量,方便循环求算,循环赋值;
字符串数组结束标志是‘\0’;
特别的,使用scanf函数以%s格式输入字符串给字符数组时,字符数组名前无取地址符号&
字符串处理函数作用详见P84-P87*/
函数
函数的定义:
函数名(行参表)
{语句……},函数声明:
函数名(行参表);
,函数的调用:
函数名(实参表);
,return语句:
return
表达式;
或return
(表达式);
函数如果直接或间接地调用自身则构成了递归函数,构成递归程序重点要做好确定问题的形式、找到递归规则以及确定问题结束条件三个要素。
值传递:
函数行参的数据类型为简单数据类型,在调用函数时,会将实参的具体数值传递给被调函数,被调函数利用行参接收这些数据的副本,进行使用。
值传递的特点是,被调函数中对行参的任何操作都是对主调函数中的对应实参数据副本的操作,对原数据不造成任何影响。
地址传递:
函数行参的数据类型为地址类型,如数组类型,在调用此类函数时,行参变量接收到的是主调函数中某变量的地址,从而使得行参变量拥有了对主调函数中该变量的访问权,既包含读也包含写的权利,从而可以在自定义函数中通过行参变量对主调函数相应的变量进行访问和修改。
变量同名使用规则:
如果一个作用域与其所包含的子作用域内都定义了相同的变量,则在子作用域中定义的变量将屏蔽子作用域外部的同名变量;