设 a 和 n 为整型变量,a=10,n=5,则c语言表达式的值 a*=3+4 的值为

模拟试卷(十)
一、单项选择题(本大题共20小题,每小题1分,共20分)
在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括号内。
1.不属于C语言保留字的是【】
for&&& B.goto&&&&& C.if&&&&
2.正确的C语言标识符是【】
A.num(10)&&&& B.file bak&&&&&
C.continue&&&& D.class+2
3.设有定义语句“double d1,d2;”,则表达式“d1=1,d2=d1+5/2”的值是【】
A.1&&&&&& B.3&&&&&
C.3.0&&&&& D.3.5
4.设有定义“int x=8,y,z;”,则执行“y=z=x++,x=y==z;”后,变量x值是【】
A.O&&&&&& B.1&&&&&
C.8&&&&&&& D.9
5.设有“int a=1,b=1;”,“printf(&%d,%d&,(a++,--b),b-1);”的输出是【】
A.1,-1&&&& B.1,0&&&&& C.0,-1&&&&&&
6.设有定义语句“char s[]=&123&;”,则表达式“s[3]”的值是
A.’1’&&& B.’3’&&&& C.0&&&&&
D.语法出错
7.定义一个具有10个元素的整型数组,应当使用语句【】
A.int a[10];&&& B.int a[2,5];  & C.int a[];&
D.int *a[10];
8.设指针变量p1、 p2已经指向同一个数组的元素,则下列表达式中错误的是【】
A.p1=p2&&&&&& B.p1==p2&&&&&&
C.p1-p2&&&& D.p1+p2
9.设有定义语句“int a[]={2, 4,6,8,10},*p=s;”,则值为8的表达式是【】
A.*p+3&&&&&& B.*p+4&&&&&&&&&
C.*(p+4)&&&&&& D.*(s+3)
10.下列数据类型中不属于构造类型的是
A.数组型  B.结构型  C.共用型  D.枚举型
11.函数fopen()的返回值不能是【】
A.NULL&&&& B.O&&&&&& C.1&&&&&&
D.某个内存地址
12.以只写方式打开一个二进制文件,应选择的文件操作方式是【】
A.&a+&&&&& B.&w+&&&&&
C.&rb&&&&& D.&Wb&
13.设有定义语句“char ch='\77';”,则下列说法中正确的是【】
A.ch中含有1个字符&&&&&&& B.ch中含有2个字符
C.ch中含有3个字符&&&&&&& D.语法出错
14.设有函数调用语句“f(x1,x1+x2,(x1,x2));”,正确的说法是【】
A.调用的实际参数是2个&&& B.调用的实际参数是3个
C.调用的实际参数是4个&&& D.调用时会出现语法错误。
15.计算平方数时不可能引起二义性的宏定义是【】
A.#define SOR(x)x*x&&&&&& B.#define SQR(x)(x)*(x)
C.# define
SQR(x)(x*x)&&& D.# define SQR(x)((x)*(x))
16.执行下列程序段后,x的位是【】
&&& int a=8,b=7,c=6,x=1;
&&& if(a>6)if(b>7)if(c>8)x=2;else x=3;
A.O&&&& B.1&&&& C.2&&&&
17.执行下列程序段后,变量y的值为【】
x[]={1,2,3,4},y,*p=&x[1];
&&& y=(*--P)++;
A.1&&&& B.2&&&& C.3&&&&
18.能正确表达逻辑关系“-1<x<1并且-1<y<1”的表达式是【】
A.(-1<x<1)&&(-1<y<1)
B.(-1<x<1)&(-1<y<1)
C.((-1<x)&&(x<1))&&((-1<y)&&( y<1))
D.(-1<x)&&(x<1)&&(-1<y)&&(y<1)
19.函数调用时,下列说法中不正确的是
A.若用值传递方式,则形式参数不予分配内存
B.实际参数和形式参数可以同名
C.主调函数和被调用函数可以不在同一个文件中
D.函数间传送数据可以使用外部全局变量
20.下列关于结构型变量的定义语句中,错误的是【】
typedef struct CCC&&&&& B. #define GGG struct
&&&& { char name[20];GGG
CCC&&& { char name[20];
&&&&&&& int age;&&&&&&&&&&&&&&&&&&
&&&&& }GGG;        &&
&&&&&& GGG
abc ;&&&&&&&&&&&&&&&&
& C.struct&&&&&&&&&&&&&&&&&&
D. struct
&&& { char name[20];&&&&&&&&&
{ char name[20];
&&&&&& int age;&&&&&&&&&&&&&&&&&&
&&&& }ccc;   &&&&&&&&&
二、填充题(本大题共10小题,每小题2分,共20分)
21.以下分别是算术、位、关系和逻辑运算符:+、&、<、!,其优先级最低的是______________________________。
22.设有定义“short k=-1;”,则“ printf(”%O”,k);”语句的输出为______________。
23.设有定义语句“static char s[5」;”,则s[4]的值是_______________。
24.函数调用时,若形、实参数均为数组,则其传递方式是______________________。
25.设有定义“FILE *fp;”,则关闭fp对应文件的操作语句是______________。
26.设有字符型变量x的值是’1’(对应二进制数是),要通过“x^y”运算,使得x的高3位不变,低5位取反,y的值用二进制数来表示应为______________________。
27.能表示“整型变量x的绝对值小于5”的表达式是__________________。(注意本题答案中规定不得使用系统函数)。
28.运行下列程序段时,若从键盘上输入:12345 /(/表示回车换行符),则输出是__________________________________。
While(getchar()!='4')printf(&*&);
29.设有定义“float *p,m=2.718;”,根据下列图示,建立指针变量p和变量m之间的关系的赋值语句是______________________。
30.设有下列结构型变量xx的定义,则表达式“sizeof(xx)”的值是________________。
&&& struct { long num;
&&& char name[20];
&&& union { float y;
&&&&&&&&&&&& short
&&&&&&&&&& }yz;
&&&&&&&&&& }xx;
三、程序分析题(本大题共5小题,每小题5分,共25分)
阅读下列程序,将输出结果写到各题右侧的空白除处。
31.main()
&& { int i,a[5];
&&&&& for(i=0;i&<5;i++)
&&&&& a[i]=9*(i-2+4*(i>2))%5;
&&&&& for(i=4;i>=0;i--)
&&&&& printf(&%3d&,a[i]);
32.main()
&& { char s[][6]={”1234”,”56789”},*p[2];
&&&&& int i,sum=0;
&&&&& p[0]=s[0],p[1]=s[1];
&&&&& for(i=0;p[0][i」!=’\0’;i++,i++)
&&&&& sum=10*sum+p[0][i]-’0’;
&&&&& for(i=1;p[1]「i」!=’\0’;i++,i++)
&&&&& sum=10*sum+p[1][i]-’0’;
&&&&& printf(&%d&,sum);
33.int p(m,n)
&&& int m,n;
&& { int i,pp;
&&&&& for(i=pp=1;i<n十1;i++)
&&&&& PP*= m;
&&&&& return(pp);
&&& main()
&& { printf(&%d&、 p(3,4));
34.struct
&& { int num;char name[10];int age};
&&&&& void py(struct stu *p)
&& { printf(&%s\n&,(*p).name);}
&&& main()
&& { struct stu student[3]={{1001,&Sun&,25},
&& {1002,&Ling&,23},
&& {1003,&Shen&,22};
&&& py(student+2);
35.# include&stdio.h&
&&& main()
&& { char c;
&&&&& while((c=getchar())!=’\n’)
&&&&& switch(c)
&&&&&& {case ’0’:
&&&&&&&& case’1’: putchar(c);
&&&&&&&& case’2’:putchar(c);break;
&&&&&&&& case’3’:putchar(c);
&&&&&&&& default:putchar(c+1);break;
&&&&&&& }
&&&&& printf(&\n&);
假定本程序执行时输入:1357/(其中的/代表回车换行符)。
四、程序填充题(本大题共3小题,每小题6分,共18分)
36.下面函数的功能是返回形参p所指向的、长度为n的整型数组中最小值所在的下标(下标从0开始计算)。
&&& fun(p,n)
&&& int *p,n;
&& { int i,j;
&&&&& for(i=0;i<n;i++)
&&&&& if(p[i]<p[j])______________________
&&&&&& return(____________________);
37.将一字符串中的小写英文字母改成大写。
&&& main()
&& { int i=0;char sir[80];
&&&&& scanf(&%s&,str);
&&&&& while(______________________)
&&&&&&&& { if(___________________) str
[i]=’a’-’A’;
&&&&&&&&&&& _______________________
&&&&&&&&& }
&&& printf(&%s\n&, str);
38.下面程序是一个带参数的主函数,其功能是显示在命令行中输入的文本文件内容。
&& #include&stdio.h&
&& main(argc,argv)
&& char *argv[」;
& {___________________________________
&&& if((fp=fopen(argv[1],”r’’))==NULL)
&&&&& { printf(”file not open!\n”);exit(0);}
&&& while(______________________)
&&&&&& putchar(__________________);
&&& fclose(fp);
五、程序设计题(本大题共3小题,第39小题5分,第40、41小题各6分,共17分)
39.编写一程序,从键盘输入10个实数,计算并输出算术平均值。
40.编程序输入50个学生的学号、姓名、3门课程的成绩存入一个结构型的数组。统计每个学生的总分并输出学生的学号、姓名、总分。
41.编写一程序,输出如下图形。
&&& *****&
&&&& *****
模拟试卷(十)分析与解答
一、单项选择题(本大题共20小题,每小题1分,共20分)
在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括号内。
1.【分析】关于保留字教材中有明确规定。显然for、goto、if都是组成语句的专用语句成份,都
是保留字。本题答案应选D。
【答案】 D
2.【分析】标识符是字母、下划线开头的字母、数字、下划线组成的一串字符,而且不能是保留字。本题的4个备选答案中,只有答案B符合这个规定。本题答案应选B。
【答案】 B
3.【分析】C语言规定,逗号表达式的计算是自左向右进行的,表达式的值等于右边表达式的值,因此,本题的答案应为表达式&d2=d1+5/2&的值。该表达式是赋值表达式,所以其值是赋予变量d2的值,也就是表达式&d1+5/2&的结果。计算时,需要先算&5/2&,结果为整数2,再和double型的d1相加,结果是实数3.0。所以本题答案应选C
【答案】 C
4.【分析】这是逗号表达式组成的语句,要先计算“y=z=x++”,结果变量y和z的值均为8。注意++是后缀运算符,同时x等于9。再计算“x=y==z”,由于“==”优先于“=”,所以x的值等于“y==z”,而y和z值相等,所以运算结果为1,即x值为1。本题答案应选B。
【答案】 B
5.【分析】printf()函数的功能是自右向左依次计算表达式的值,然后再按照自左向右的顺序输出各个表达式的值,所以题目中输出语句执行时,是依次计算下列两个表达式的值:
& b-1 结果为0,注意变量b值不变;
& (a++,--b)这是逗号表达式,先计算a++,结果变量a值为2;
& 再计算--b,结果变量b值为0;
& 整个逗号表达式的值就是--b的值,为0。
& 按照自左向右的顺序输出(a++,--b)和b-1的值,依次为0,0。本题答案应选D。
6.【分析】字符数组s在定义时省略了数组长度,表示给每个数组元素均赋了初值。对本题来说,数组的长度为4;数组元素的值依次为:S[0]为'1'。S[1」为'2'。S[2]为'3'、S[3]为字符率结束标记符'\0',所以“s[3]”的值是'\0'。注意,这个字符的
ASCII代码值是整数 0,所以本题答案应选C。
【答案】 C
7.【分析】分析备选答案 A:显然是正确的,本题答案应选 A。至于备选答案
B:其中的“[2,5]”在语法上是错误的;备选答案C:数组没有给初值而省略了数组长度,语法上也是错误的;备选答案D:定义的是具有10个元素的。指向整型数据的指针型数组。
8.【分析】教材中关于指向同一个数组的元素的指针变量之间可以进行的运算有如下的规定:可以进行关系运算、赋值运算、减法运算,所以本题答案应选D。
9.【分析】分析四个备选答案,可以看出是用指针法来引用数组a的元素。当指针变量p已经指向数组。的首地址后(正如本题那样),*(p+i)和*(s+i)都是数组元素a[i]。对于备选答案A:*p就是数组元素。a[0],其值为2,再加3结果为5,不符合题意。同样道理,备选答案B中的*p十4的值为6,也不符合题意。对于备选答案C:*(p+4)代表数组元素a[4],其值为10,也不符合题意。显然本题答案应选D。因为*(s+3)就是数组元素s[3],其值为8。
【答案】 D
10.【分析】教材中明确指出:构造类型只包括:数组型、结构型。共用型三种,所以本题答案应选D。
11.【分析】函数fope()的返回值有两种可能:一是正确打开了文件,将返回某个地址,程序中一般是用文件型指针变量来接受的;二是打开文件时出现错误,此时返回值是符号常量“NULL”,其值为0。所以本题答案应选C。
12.【分析】打开文件时,如果是“只写方式”,则只能选用字符“
w”;如果要打开的文件是二进制文件,则需要选用字符“b”,所以本题答案应选
【答案】 D
13.【分析】从定义语句中可以看出,变量ch是字符型变量,显然只能存放单个字符,所以备选答案B和C是错误的说法。再分析赋予的初值,'\77'是在“\”符号的后面跟有2位的人进制数,所以'\77'是转义字符,转义字符是单个字符,所以本题答案应选A。
【答案】 A
14.【分析】对函数调用来说,实际参数一般都是表达式,而表达式之间必须用逗号来分隔,所以只要区分调用时的表达式数目,即是实妹参数的数目。对本题来说,第1个表达式是“x1”、第2个表达式是“x1+x2”、第3个表达式是一个逗号表达式“x1,x2”,所以本题的函数调用时,表达式的数目为3,当然实际参数的数目就是3,所以本题答案应选B。
15.【分析】分析备选答案A:如果宏引用是“SQR(2+3)”,则宏替换后的结果是“2+3*2+3”,结果是错误的,因此这个答案可能引起二义性。分析备选答案B:如果宏引用是“
3/SQR(2+3)”,则宏替换后的结果是“3/(2+3)*(2+3)”,结果也是错误的,因此这个答案可能引起二义性。分析备选答案C:如果宏引用是“SQR(2+3)”,则宏替换后的结果是“(2+3*2+3)”,结果也是错误的,因此这个答案可能引起二义性。只有备选答案D不会引起二义性。所以本题答案应选D。
16.【分析】按照&else&只和前面最近的&if&配对的原则,上述程序段可以写成下列更为清晰的程序清单:
&& int a=8,b=7,c=6,x=1;
&& if(a>6)
&& if(b>7)
&& if(c>8)
&&&&& x= 2:
&&&&& x=3:
依据a、b、c的值,很容易看出第1个“if语句”的条件“a>6”是成立的,接着执行第2个“if语句”,该语句的条件“b>7”,是不成立的,所以下面的“if-esle”语句不执行,因此x的值不变,仍为1。所以本题答案应选B。
17.【分析】从数据定义语句中可以得出下列结论:指针变量P指向的数组元素是x[1]。再来分析赋值句的右边表达式“(*--p)++”,其中的“--”优先于“*”先计算“--p”,使得p指向数组元素x[0];所以“(*--p)”就是数组元素a[0],再计算其后的“++”,由于“++”是后缀,所以表达式的值就是数组元素x[0]的值,为1,然后再对数组元素x[0]加1。因此变量y的值是1。本题答案应选A。
18.【分析】注意数学中的“-1<x<1”含义是“-1<x同时x<1”,搞清楚这一点后,再来分析给出的备选答案。对于答案A:其中的-1<x<1不能表示“-1<x同时x<1”,例如,当x为0时,“-1<x<1”的值为0,即结果为假,而x为0时,“-1<x同时x<1”显然为真,所以备选答案A是错误的。对于备选答案B出于同样的理由,也是错误的。对于备选答案C:“-1<x同时x<1”是不能表示成“((-1<x))::(x<1))”,其中的或“::”应该改成与“&&”,显然该答案也是错误的。本题应该选择D。
【答案】 D
19.【分析】分析备选答案A:值传递时,先给形参分配内存,然后把实参值传给形参分配的内存,所以该说法是错误的,本题答案应选A。至于备选答案B:形参和实参是可以同名的,因为它们的作用域不重复。备选答案C:只要被调函数定义时的存储类型选取“extern”,就可以被其他文件中的函数调用。备选答案D:函数间传递数据的方法有4种,其中的一种就是利用外部全局变量来传递的。
【答案】 A
20.【分析】分析备选答案 A:利用“typedef”定义了用户自定义的数据类型符“GGG”,这个用户自定义的数据类型符是含有两个成员的结构型
CCC,所以语句“GGG abc”是定义结构型CCC的变量abc,语法没有错误。分析备选答案B:利用“#define”定义了宏名“GGG”,这个宏名第一次出现是定义结构型CCC,第二次是定义了结构型CCC的变量allc,所以语法上没有错误。分析备选答案C:这是定义一个没有名称的结构型,同时定义了这种结构型的变量CCC,接着的语句“CCC
abc;”显然是错误的,因为CCC是变量名,不是数据类型符,该答案符合题意。至于备选答案D:这是标准的通过定义没有名称的结构型来定义该结构型的变量abc,语法上没有错误。
二、填充题(本大题共10小题,每小题2分,共20分)
21.【分析】教材中有明确规定:单目逻辑运算符“!”优先于算术运算符“+”优先于关系运算符“<”优先于位逻辑运算符“&”的,所以本题答案是“且’。解答该题时,要注意运算符“&”。这个运算符有两种不同的解释,一个是作为“单目的取地址运算符”;二是作为“位逻辑运算符”。前者的级别比较高,和位非运算符“!”、位取反运算符“-”、自增自减运算符“++、--”、指针运算符“*”、取正取负运算符“+、-”。取数据长度运算符“sizeof()”是同一级别的。后者的级别比较低。
【答案】&
22.【分析】短整型数据占用2个字节,即16位二进制数。而在计算机中,-1对应的二进制数是:
。本题输出变量k中的值时,使用的是八进制数据格式,上述二进制数转换成八进制数是:177777。
【答案】177777
23.【分析】存储类型是静态型(static)的变量、数组即使没有赋初值,也有初值,这个初值是空值,对整型来说,空值就是0,对实型来说,空值就是0.0,对字符型来说,空值就是'\0',所以本题答案是'\0'。
【答案】'\0'
24.【分析】教材中有明确说明:当形参是数组名,则实参必须是数组名或某个指针变量,这种数据传递的方式是“地址传递方式”。
【答案】地址传送方式
25.【分析】只能使用关闭文件的系统函数,具体格式为“fclose(fp)”。
【答案】fclose(fp);
26.【分析】要通过“^(按位加)”运算,使得二进制数的某位不变,则只要和0进行按位加。假定原位数字是1,则“1^0”结果为1,原数字不变;假定原位数字为0,则“0^0”的结果为0,原位数字也不变。所以y的前3位数字是0。再来分析y的后5位数字。要通过“^(按位加)”运算,使得二进制数的某位取反,则只要和1进行按位加。假定原位数字是1,则“1^1”结果为0,原数字取反;假定原位数字为0,则“0^1”的结果为互,原位数字也取反。所以y的后5位数字是1。
27.【分析】当x小于5并且x大于-5时,x的绝对值是小于5的,按照这个方法,可以写出表达式“(x<5)&&(x>-5)”。注意,其中的圆括号可以省略,因为关系运算符优先于逻辑运算符&&。
【答案】(<5)&&(x>-5)
28.【分析】程序段中是一条while循环语句,控制循环的条件是读取的单个字符不是’4’则继续循环。从输入来看,第1个输入的字符是’1’,不是字符’4’,所以执行循环体,输出一个“*”;再读取第2个字符是’2’,不是字符’4’,执行循环体输出第2个“*”,;继续读取字符是’3’,执行循环体输出第3个“*”;此时读取的下一个字符是‘4’小,控制循环的条件不满足,退出循环。所以本题的答案是3个“*”。
【答案】***
29.【分析】图示的要求是将指针变量p指向变量m,完成这项工作的语句是赋值语句:p=&m;
【答案】 p=&m;
30.【分析】表达式“sizeof(xx)”的值就是结构型变量xx所占用的内存字节数。结构型变量所占用的字节数等于每个成员占用的字节数之和。xx共有3个成员,第1个成员是长整型的num,长整型数据占用字节数是4。第2个成员是字符型数组name,占用的字节数是数组的长度,等于20。第3个成员名是yx,该成员的数据类型是共用型,而共用型数据占用的字节数等于其成员中占用字节数最多的成员占用的字节数,而yx的成员只有2个,一个是单精度型,占用字节数为4;另一个是短整型,占用字节数是2,所以yz占用的字节数是4。结构型变量xx的3个成员占用的字节数分别为4.20、4,其和为28。
【答案】28
三、程序分析题(本大题共5小题,每小题5分,共25分)
阅读下列程序,将输出结果写到各题右侧的空白除处。
【分析】我们可以按照程序中语句执行的顺序,记录各个变量及数组元素值的方法来解决这种阅读程序写运行结果的问题。首先执行第1个for循环。
&&& i=0, i<5的条件成立,执行循环体。
&&& a[0]=9*(0-2+4*(0>2))%5=9*(-2)%5=-18%5=-3
&&& i=1,1<5的条件成立,执行循环体。
&&& a[1]=9*(1-2十4*(1>2))%5=9*(-1)%5=-9%5=-4
&&& 1=2,i<5的条件成立,执行循环体。
&&& a[2]=9*(2-2十4*(2>2))%5=9*(0)%5=0%5=0
&&& i=3,i<5的条件成立,执行循环体。
&&& a[3]=9*(3-2+4*(3>2))%5=9*(5)%5=45%5=0
&&& 1=4,1<5的条件成立,执行循环体。
&&& a[4]=9*(4-2+4*(4>2))%5=9*(6)%5=54%5=4
&&& i=5,1<5的条件不成立,退出第1个for循环。
&& 注意,计算中的“i>2”是关系运算,结果只能为1或0;“x%5”是模运算,结果是x除5的余数,且余数的符号和x符号相同。
&&& 再执行第2个for循环。
&&& i=4,i>=0的条件成立,执行循环体。输出数组元素a[4]的值,等于4
&&& i=3,i>=0的条件成立,执行循环体。输出数组元素a[3」的值,等于0
&&& i=2,1>=0的条件成立,执行循环体。输出数组元素a[2」的位,等于0
&&& i=1,i>=0的条件成立,执行循环体。输出数组元素a[1]的值,等于-4
&&& i=0,1>=0的条件成立,执行循环体。输出数组元素a[0]的值,等于-3
&&& i=-1,i>=0的条件不成立,退出第2个for循环。
【答案】 4 0 0 -4 -3
32.【分析】本程序的第1条语句是定义2行5列的二维字符型数组s,并且赋了初值如下:
s[0][0]='1's[0][1]='2's[0][2]='3's[0][3]='4's[0][4]='\0'
s[1][0]='5's[1][1]='6's[1][2]='7's[1][3]='8's[1][4]='9'S[1][5]='\0'
& 此外还定义了字符型指针数组p,利用第3条语句赋了值,结果如下:
& p[0]指向以“s[0][i]”为数组名的一维数组首地址,即p[0][i]就相当于s[0][i]
& p[1]指向以“s[1][i]”为数组名的一维数组首地址,即p[1][i]就相当于s[1][i]
第2条语句定义了整型变量i(用于单重循环的控制变量)和sum,并对sum清0。
第4条语句是for循环,控制变量i初值为0,每次加2,控制循环的条件是“p[0」[i]!='\
0',注意其中的“p[0][i]”就是“s[0][i]”,这个控制循环的条件可以理解为“二维字符型数组元素s[0][i]不是字符串的结束标记则继续循环”。从控制变量i的取位来看,二维字符型数组元素只能取s[0][0]、s[0][2],因为下一个数组元素是s[0][4],该元素值是'\0'。再分析循环体中的语句,其中“
p[0][i]-'0'”是将数组元素s[0][i]中存放的数组字符减去'0',结果将是该数字字符对应的一位整数,整个语句是将sum变量中的原值乘以10以后再加上当前的数字。循环结束后的sum值就是s[0」[0」和s[0][2]中的两个数字组成的2位十进制数,结果为13。
&&& 按照同样的道理,可以分析出第2个for循环作用是完全相同的,它是把s[1」[1」、s[1][3]中的两个数字(前者为6,后者为8)拼接到sum的原值中,结果sum中值为十进制整数1368。程序的最后一个语句就是输出变量sum中的整数值。
【答案】 1368
33.【分析】主函数中只有一条输出语句,输出结果是函数调用“p(3,4)”的返回值。所以本题的关键是函数p的功能。
&&& 分析函数p(),有两个参数m、n。函数体中关键的是for循环语句。分析这个循环语句可以看出,控制变量是i,初值为1;,终值为n,每次循环i加1。所以是标准的次数型循环,共计循环n次。循环体中是将参数m的值乘到变量pp中,变量pp在开始循环时已经设置初值为1,所以整个循环是将n个m乘到pp中。显然循环语句的功能是计算m”。而函数的返回值正是这个变量pp中的值。
&&& 由此分析可知,函数调用“p(3,4)”的返回值就是34。结果为
81,也就是本程序的输
【答案】81
34.【分析】本程序是由3段组成的。第1段是结构型stn的定义;第2段是函数py()的定义;第3段是主函数。
&&& 我们先分析主函数。首先定义了结构型stu的数组student[3],并且给3个元素的所有成员都赋了初值。接着调用了函数py,对应的实参是结构型数组元素student[2]的地址。注意,“数组名+k”是数组元素“数组名[k]”的地址。
&&& 再来分析函数调用&py(student+2);&。调用时,首先把实参传递给形参,即把结构型stu的数组元素student[2」的地址&student+2&传递给形式参数“结构型stu的指针变量p”。
&&& 然后执行函数体,输出表达式是&(*p).name&,这是结构型stu的指针变量p指向的结构型stu数据(即结构型stu的数组元素student[2〕)的成员name,其值是字符串&Shen&。这就是本题的答案。
【答案】Shen
35.【分析】本题也可以采用记录的方法。
&&& 执行 while循环。
&&& 输入第1个字符'1',不是'\n',执行switch语句的&case'1'&后的输出语句,输出字符'1';由于其后没有“break”语句,则继续执行&case'2'&后的语句,输出字符'1'。输入第2个字符'3',不是'\n',执行switch语句的&case'3'&后的输出语句,输出字符'3';由于其后没有“break”语句,则继续执行&default&后的语句,输出字符'4'。
&&& 继续while循环。
&&& 输入第3个字符'5',不是'\n',执行switch语句的&default&后的语句,输出字符'6'。
&&& 继续while循环。
&&& 输入第4个字符呼'7',不是'\n',执行switch语句的&default&后的语句,输出字符'8'。
&&& 继续While循环。
&&& 输入第 5个字符'\n',是'\n',退出while循环,输出“回车换行符”。
&&& 注意switch语句的执行过程是:在每个“case”分支之后,可以有多个语句,程序将依次执行这些语句,直到遇见“break”语句或者switch语句的右花括号“}”。如果某个“case”分支的后面没有“break”语句,它在执行完本分支后的所有语句之后,将继续执行下一个分支中的语句,直到出现“break”语句或者switch语句的右花括号“}”后才中止本分支的执行。
【答案】113468
四、程序填充题(本大题共3小题,每小题6分,共18分)
36.【分析】题目中已经明确指出,函数的功能是指针变量p指向了一个整型数组,所以函数中的p[i]和p[j]就是数组的两个元素。从函数体中for循环语句来看,这是标准的次数型循环,依次处理数组中的逐个元素的。从循环体来看,当数组元素p[i]小于数组元素p[j]时,需要重新记录最小值的下标,显然i作为下标是依次代表所有数组元素的,因此,j作为下标就是记录最小值元素的下标,所以第2个空白处应该填写的是“j=i;”。由此得出,在循环执行前,需要设置一个假定当前最小值元素的下标,当然是选择第1个元素的下标,即0。所以第1个空白处应该填写的是“j=0”。最后一个空白处很容易填写,这儿是要返回的最小值元素的下标,循环结束后的最小值元素下标就在变量j中,所以第3个空白处应该填写“j”。
【答案】j=0;
&&&&&&& j=1;
37.【分析】首先可以考虑一个算法。将某个字符串中的小写字母全部换成大写字母,当然要使用一个循环来依次处理字符率中的每个字符,这是标准的单重循环。如果已经知道字符串的长度,则循环是标准的次数型循环;如果不知道字符串的长度,可以采用当型循环,控制循环的条件是当前字符不是字符率结束标记符'\0'(注意其值为就是0)。然后在循环体中判断当前字符,若是小写字母,则将其改成大小字母,修改的方法是减去32,这个“32”是对应小写字母和大小字母的差值,也可成&'a'-'A'&、&b'-'B'&等等。
把算法理清后,再来分析程序,看看程序中是否使用我们设计的常规算法。
&&&& 程序的开始是定义整型变量i(并赋初值0)和字符型数组str。然后输入字符串存入字符型数组str。
接着是一个当型循环语句。注意,和我们设想的第二种算法很相似。要填写的控制循环的条件当然就是“当前字符不是字符率结束标记符”,考虑到字符率是存放在数组str中的,当前字符显然是数组元素str[下标]。由于变量i的初值为0,代表第1次循环时的数组元素下标,所以考虑这儿应该填写的就是“str[i]!=’\0’”,当然也可以使用“str[i]!=0”或者直接使用“str[i]”。这个结论还要看看后面的程序,验证后才能确定我们的填写是否正确。
&&&& 现在来研究循环体。第1条语句是单分支,从分支完成的操作&str[i]=str[i]-('a'-'A')&来看,就是将str[i](当前字符)修改成对应的大写字母。所以第2个空白应填写的是条件“当前字符是小写字母”,具体的表达式应为&str[i]>='a'&&str[i]<='z'&。
&&&& 第3个空白处很容易填写,因为下一次的循环必须处理下一个元素,这里需要修改下标变量i的值,使其加1。可填写&i++;&或&++i;&或&i=i+1;&或&i+=1;&等。
&&&& 填写完3个空白后,需要再重新阅读程序,验证程序的功能。
【答案】str[i]!='\0' 或 str[i]!=0 或 str[i]str[i]>='a'&&str[i]<='z'&
&&&&&& i++或 ++i 或 i=i+1 或 i+=1
38.【分析】从程序功能来看,程序中需要用到文件型指针变量中,而主函数体没有定义,所以第1个空白处应该填写的是“FILE
*fp;”。接下来的证语句是标准的打开只读文本文件的语句。接着的while循环语句中有两处空白。前一个空白是控制循环的条件,从程序功能来看,要将文本文件中的所有字符显示出来,这儿当然只能填写“不是文件尾则继续循环”,具体说,需要填写的是“!feof(fp)”。第3个空白出现在循环体中的语句中,该循环体的功能是从fp指向的文本文件中读取单个字符并显示在屏幕上,此处使用的是putchar函数,该函数的功能是将形参对应的字符显示在屏幕上,所以该处的空白就是要显示的字符,这个字符必须是从文本文件中读取的单个字符,完成这项工作的可以利用fgetc()函数,所以第3个空白一个填写的是“fgetc(fp)”。
【答案】FILE *fp;
&&&&&& !feof(fp),
&&&&&& fgetc(fp)
五、程序设计题(本大题共3小题,第39小题5分,第40、41小题各6分,共17分)
39.【分析】相关的变量和数组:用来存放算术平均值的变量(例如用ave)、存放10个实数的一准数组(例如用a[10」)。因为ave要求和,所以事先要赋初值0.0。第1个次数为10的循环用于输入10个实数存入数组a,可以使用for循环,利用下标变量i来控制循环。第2个次数为10的循环用于求10个数组元素之和存入变量删,可以使用for循环,利用下标变量i来控制循环。最后是输出结果,要注意变量ave中存放的是和,必须除10后才是平均值。
【答案】 main()
&&&&&& { int i;
&&&&&&&&& float ave=0.0,a[10];
&&&&&&&&& for(i=0;i<10;i++)
&&&&&&&&&&&&
scanf(&%f&,&a[i]);
&&&&&&&&& for(i=0;i<10;i++)
&&&&&&&&&&&& ave+=a[i];
&&&&&&&&& printf(&%10.4f\n&,ave/10.0);.
&&&&&&& }
40.【分析】首先要设计一个结构型,其成员包括学号(长整型)、姓名(字符数组)、3个成绩(实型或实型数组)、总分(实型)。定义长度为50的这种结构型数组。用单重50次的次数型循环输出50个学生的信息。再用次数为50的单重循环依次求出每个学生的总分(等于3科成绩之和)存入成员总分中。最后仍然用50次的单重循环输出50个学生的学号、姓名和总分。
【答案】main()
&&&&& { struct{ long num;
&&&&&&&& char name[20];
&&&&&&&& float score1;
&&&&&&&& float score2;
&&&&&&&& float score3;
&&&&&&&& float total;
&&&&&& }stu[50」;
&&&&&&& int i;
&&&&&&& float x1,x2,x3
&&&&&&& for(i=0;i<50;i++)
&&&&&&&&&& { scanf(&%1d,%s&,&stu[i].num,stu[i].name);
&&&&&&&&&&&&&
scanf(&%f,%f,%f&,&x1,&x2,&x3);
&&&&&&&&&&&&&
stu[i].score=x1,stu[i].score2=x2,stu[i].score3=x3;
&&&&&&&&&&& }
&&&&&&& for (i=0;i<50;i++)
&&&&&&&&&&&
stu[i].total=stu[i].scorel+stu[i].score2+stu[i].score3;
&&&&&&& for(i=0;i<50;i++)
&&&&&&&&&&&
printf(&%1d%name%f\n:&, stu[i].num,stu[i].total);
41.【分析】分析题目中给出的图形,可以看出需要使用二重循环结构。外层循环控制行,这是次数为4的次数型循环结构,可以使用for语句,其控制循环的变量i依次等于1、2.3、4,循环体中的工作有两项:一项是输出前面的空格,第二项是输出该行上的符号串”*****”。由此得出外层循环结构如下:
&&& for(i=1;i<=4;i++)&
&& { 输出前面的空格;
&&&&  输出符号串”*****”;
输出前面的空格需要使用循环。我们来看题目中给出的图形,第1行上要输出的空格数目是0,即“1-1”。第2行上要输出的空格数目是1,即“2-1”,…。显然,第i行上要输出的空格数目是“i一1”。由此可以得出这个循环也是次数型循环,控制循环的变量j依次等于
1、2、…、 i-1。其中的i是行数。由此可以得出这个内层循环的结构如下:
&&& for(j=1;i<=i-1;j++)
&&& 输出1个空格;
&& 外层循环体中的第二项是输出本行上的符号串”*****”。这项工作比较简单,用一条输出语句“printf(“*****\n”);”即可。
&&& 依据上述分析,可以很容易写出程序清单。
【答案】 main()
&&&&&& { int i,j;
&&&&&&&&& for(i=1;i<=4;i++)
&&&&&&&&& { for(j=1;j<=i-1;j++)
&&&&&&&&&&&&
printf(&&);
&&&&&&&&&&&&
printf(”*****\n”);
&&&&&&&&&& }
&&&&&&& }}

我要回帖

更多关于 c语言表达式的值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信