《c语言程序设计第四次讨论.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第四次讨论.ppt(125页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/1/16第四次讨论第四次讨论组长:何锦梁组长:何锦梁组员:王煜组员:王煜 王欢琦王欢琦(发言人)(发言人)钱轲昱钱轲昱2023/1/161、有以下程序:#includemain()intn;scanf(%d,&n);if(n+5)printf(%xn,n);elseprintf(%xn,n-);若执行程序时从键盘上输入9,则输出的结果是()。(A)11 (B)A (C)9 (D)8分析:输入9,95成立,则n=10。“%x”表示结果要以十六进制形式输出无符号整数。所以n=A。B2023/1/162023/1/16为了避免在嵌套的条件语句if-else中产生二义性,C语言规定:else
2、子句总是与()配对。(A)缩排位置相同的if (B)其之前最近的if (C)其之后最近的if (D)同一行上的ifB2023/1/16下列程序段的输出结果是()。#include main()int k=1;switch(k)case 1:putchar(P);case 2:case 3:putchar(Q);break;case 4:putchar(R);default:putchar(S);(A)P (B)PQ (C)PQR (D)PQRS分析:在switch语句中,若case后语句组不跟随break语句,则在执行第一个复合条件的语句组后,将不判断后面的条件,直接执行后面的个语句组。B20
3、23/1/162023/1/16若当程序运行输入字母H,则下面程序运行结果是()。#include main()char ch;ch=getchar();switch(ch)case H:printf(Hello!n);case G:printf(Good morning!n);default:printf(Bye-Bye!n);分析:由于整个switch语句均无break语句,且由键盘得到的字母为H,所以结果为Hello!Good morning!Bye-Bye!2023/1/162023/1/16任意输入一数,若为正数,求其平方根,若为负数,求其绝对值,否则输出“Bye-Bye!”。分析:
4、由题意得,有3中不同的情况,需要用if语句的嵌套。2023/1/16源程序:源程序:#include#includemain()float n;printf(请输入一个数:,n);scanf(%f,&n);if(n0)n=sqrt(n);printf(%f,n);else if(n=0)printf(Bey,Bye);else n=fabs(n);printf(%f,n);2023/1/16开始输出“请输入一个数”输入nn0n=0N输出”Bye-Bye”n=sqrt(n)YY输出nn=fabs(n)输出nN结束框图:框图:2023/1/162023/1/16输入一个大写字母,改用小写字母输出分
5、析:在ASCII码与字符对照表中,小写字母与大写字母相差32个字符。所以只需令输入的大写字母+32即可转换为小写字母。2023/1/16源程序:源程序:#includemain()char n;printf(请输入一个大写字母:);scanf(%c,&n);if(n=A&n=A&n=Zn=n+32输出n输出“Error”结束YN2023/1/162023/1/16给出百分制成绩分数,输出对应等级AE。分数score公式score/100等级grade10010A99909A89808B79707C69606D60以下5以下E分析:结合表格,利用switch语句将各个分数段的等级输出。2023/
6、1/16源程序:源程序:#includemain()int score;printf(请输入成绩:);scanf(%d,&score);score/=10;switch(score)case 10:printf(A);break;case 9:printf(A);break;case 8:printf(B);break;case 7:printf(C);break;case 6:printf(D);break;default:printf(E);2023/1/16框图:框图:开始输出“请输入成绩”输入scorescore/=10score输出A输出C输出D输出E输出A输出B1098765以下结
7、束2023/1/162023/1/16输入一个四位正整数,求各位数字之和。分析:通过 j=n%10得到这个数的个位数字,再 n/=10结合for循环逐步向前得到各个位上的数。2023/1/16源程序:源程序:#includemain()int n,i,j,s=0;printf(请输入一个四位正整数:);scanf(%d,&n);for(i=1;i=4;i+)j=n%10;s+=j;n/=10;printf(%d,s);2023/1/16框图:框图:开始输出“请输入一个四位正整数”输入nS=0i=1i=4j=n%10s+=j;n/=10i+输出s结束YN2023/1/162023/1/16输入一
8、个职工的月薪salary,计算并输出应交的个人所得税tax=rate*(salary-850)。其中rate的计算方式如下:当salary=850时,rate=0;当850salary=1350时,rate=5%;当1350salary=2850时,rate=10%;当2850salary=5850时,rate=15%;当5850salary时,rate=20%。分析:为使用switch语句,必须将salary与rate的关系转换为某些整数与rate的关系。Rate的变化点减去350后都是500的整数倍,但会有相邻两个区间的重叠问题。所以令(rate-351)/500,即salary=850,
9、对应0;850salary=1350,对应1;1350salary=2850,对应2、3、4;2850salary=5850,对应5、6、7、8、9、10;5850salary,对应11、12、13。2023/1/16源程序:源程序:#includemain()int salary,sal;float rate,tax;printf(请输入月薪:);scanf(%d,&salary);sal=(salary-351)/500;switch(sal)case 0:rate=0;break;case 1:rate=0.05;break;case 2:case 3:case 4:rate=0.10;
10、break;case 5:case 6:case 7:case 8:case 9:case 10:rate=0.15;break;default:rate=0.20;tax=rate*(salary-850);printf(%f,tax);2023/1/16框图:框图:开始输出“请输入月薪”输入salarysal=(salary-351)/500salRate=0Rate=0.10Rate=0.05Rate=0.15Rate=0.20012345678910Tax=rate*(salary-850)输出tax结束2023/1/162023/1/16输入一个字符,如果它是小写字母,则把它变成大写
11、字母;如果它是大写字母,则把它变成小写字母;其他字符不变。分析:大小写字母在ACSII码表中相差32。若是大写,+32;若是小写,-32。2023/1/16源程序:源程序:#includemain()char c;c=getchar();if(c=a&c=A&c=a&c=A&c=ZNC-=32C+=32YY输出c结束N2023/1/162023/1/16设有程序段:Int k=10;While(k=0)k=k-1;则下面描述中正确的是()。(A)while循环执行10次 (B)循环式无限循环 (C)循环体语句一次也不执行 (D)循环体语句执行一次C分析:在while语句中,判断条件是把0赋值给
12、k,即为逻辑假,直接退出循环,循环体语句一次也不执行。2023/1/16下面程序段的运行结果是()。Int a,b,c,t;a=1;b=2;c=2;while(abc)t=a;a=b;b=t;c-;Printf(“%d,%d,%d”,a,b,c);(A)1,2,0 (B)2,1,0 (C)1,2,1 (D)2,1,1A分析:初值:a=1;b=2;c=2;第一次循环后:a=2;b=1;c=1;结束循环后:a=1;b=2;c=0;2023/1/16对for(表达式1;表达式3)可理解为()。(A)for(表达式1;0;表达式3)(B)for(表达式1;1;表达式3)(C)for(表达式1;表达式1
13、;表达式3)(D)for(表达式1;表达式3;表达式3)分析:for(表达式1;1;表达式3),1表示恒为真,即该循环为死循环,其中1可以省略,所以选B正确。A中0为否命题,所以循环体一次也不会执行;而CD选项中的循环体是需要进行判断的,与题目不符B2023/1/16下面程序段的运行结果是(C )。For(y=1;y10;)y=(x=3*y,x+1),(x-1);Printf(“x=%d,y=%d”,x,y);(A)x=27,y=27 (B)x=12,y=13 (C)x=15,y=14 (D)x=y=27分析:分析:由已知可得三个等式:x=3y,x=x+1,y=x-1,所以第一次得3,4,2
14、第二次得6,7,5 第三次得15,16,14 因为y=14不满足条件y10,所以输出的结果为x=15,y=14,所以选C下面程序段的运行结果是()。For(y=1;y10;)y=(x=3*y,x+1),(x-1);Printf(“x=%d,y=%d”,x,y);(A)x=27,y=27 (B)x=12,y=13 (C)x=15,y=14 (D)x=y=27分析:逗号表达式注意以下两点:1、逗号表达式的运算顺序是从左向右运算2、逗号表达式的值取逗号中最右表达式的值第一个循环:(x=0,y=1)首先对于(x=3*y,x+1)和(x-1)来说,按照从左向右运算先计算(x=3*y,x+1)。这个逗号表
15、达式中先计算x=3*y,此时x=3*1=3再计算x+1,此时x+1=4,但并没有赋值。再看x-1,此时x-1=2.根据上述第2点注意,y=x-1=2.以此循环。C C2023/1/16执行语句for(i=1;i+4;);后变量i的值是()。(A)3 (B)4 (C)5 (D)不定分析:i+是先参与运算,再自增1。所以for(i=1;i+4;)相当于for(i=1;i4;i+)。B2023/1/16阅读下列程序,写出运行结果。#includemain()int j=0,k=0,a=0;while(j2)j+;a+;k=0;while(k=3)k+;if(k%2!=0)continue;a+;a+
16、;printf(%dn,a);结果:5.2023/1/16框图:框图:开始j=0,k=0,a=0j2j+;a+;k=0;K=3K+k%2!=0A+YNYNA+输出a结束NY2023/1/162023/1/16阅读下列程序,指出运行结果。#includemain()int a,b;for(a=1,b=1;a=20)break;if(b%3=1)b+=3;continue;b-=5;printf(a=%dn,a);分析:这是一个用来区别break语句与continue语句作用差别的程序结果:a=8。2023/1/16框图:框图:开始A=1,b=1A=20NB%3=1B+=3YB-=5NY结束NY2
17、023/1/162023/1/16阅读下列程序,指出运行结果。#includemain()int i,a=0;for(i=1;i=5;i+)doi+;a+;while(i3);i+;printf(a=%d,i=%d,a,i);分析:for循环和do while循环的嵌套是本程序的核心。结果:a=3,i=7.2023/1/16框图:框图:开始A=0,i=1i=5i+,a+Yi3Yi+Ni+输出a,i结束N2023/1/162023/1/16输入4后,下列程序的输出结果是()。#includemain()int j,k,n;float f,s;scanf(%d,&n);s=0;f=1;for(k=
18、1;k=n;k+)for(j=1;jk;j+)f=f*k;s=s+f;printf(%.0f#,s);分析:此程序是一个for循环的嵌套。“.0f”表示结果的形式为小数点后0位的浮点型。还有,非格式字符串在输出时原样照印。1#3#21#1173#2023/1/16框图:框图:开始输入nS=0,f=1,k=1K=nJ=1JkF=f*kJ+S=s+f输出s#K+结束YYNN2023/1/162023/1/16下列程序段的输出是()。#includemain()int k;for(k=1;k5;k+)if(k%2)printf(*);else continue;printf(#);*#*#2023/
19、1/16框图:框图:开始K=1K5K%2输出*K+输出#结束YNNY2023/1/162023/1/16设计程序:计算2的平方根、3的平方根10的平方根之和,要求计算结果具有小数点后10位有效位数,并输出。分析:应用sqrt函数求平方根,再把各平方根加和即可。题目要求结果有小数点后10位有效数字。只需以“%.10f”输出即可。2023/1/16源程序:源程序:#include#includemain()float s=0.0;int i;for(i=2;i=10;i+)s+=sqrt(i);printf(%.10f,s);2023/1/16框图:框图:开始S=0;i=2i=10S+=sqrt(
20、i)i+输出s结束YN2023/1/162023/1/16一球从100米高空自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时,共经过多少米,第10次反弹多高?分析:j=j/2表示每次落地后反跳回原高度的一半。反弹再落下,这是一个循环的过程,用for语句达到目的。J表示落下的高度,因要反弹,所以要*2.而第10次反弹的高度就是循环结束后j的值。2023/1/16源程序:源程序:#includemain()int i;float j=100,s=100;for(i=2;i=10;i+)j=j/2;s+=j*2;printf(共经过%f米,第10次反弹%f米,s,j);2023/
21、1/16框图:框图:开始J=100;s=100;i=2i=10J=j/2S*=j*2i+输出s,j结束YN2023/1/162023/1/16设计程序:数列第1项为81,此后各项均为它前1项的正平方根,统计该数列前30项之和并输出。分析:分析:先定义x,z为浮点型,再根据z=z+x;x=sqrt(x)即可求得最后结果。因为是浮点型所以应为printf(%f,z);2023/1/16源程序:源程序:#include#includemain()int i;float j=81,s=0;for(i=1;i=30;i+)s+=j;j=sqrt(j);printf(%f,s);2023/1/16框图:框
22、图:开始J=81;s=0;i=1is2)(B)if(strcmp(s1,s2)(C)if(strcmp(s1,s2)0)(D)if(strcmp(s2,s1)0)分析:在字符串中必须用字符串比较strcmp函数比较大小。B2023/1/16若有说明“int a4=1,1;”,则下面不正确的叙述是()。二维数组a的第一维大小为1数组a的每个元素都可得到初值1a00和a01可得到初值1,其余元素均得到初值0二维数组a的第一维大小不确定分析:由int a4=1,1可知,a00=1,a01=1,其余元素初值均为0,所以选B,D的答案是错的,数组a的第一维大小是1,确定的。B、D2023/1/16若有说
23、明:int a3=1,2,3,4,5,6,7;则数组a的第一维大小为()。(A)3 (B)2 (C)1 (D)不确定分析:a3说明一行有3个元素,而只有1,2,3,4,5,6,7七个元素,说明还有两个0,共3行3列。A2023/1/16对两个数组a和b进行如下初始化:char a=“you”;char b=y,o,u;则以下叙述正确的是()。a与b数组完全相同a与b数组长度相同a与b数组中存放地都是字符串a数组比b数组长度长分析:数组a中存放的是字符串,其长度为4;数组b中存放的是字符,其长度为3.D2023/1/16假设字符数组a和b中均存有字符串,判断a与b中字符串是否相等,应使用()。i
24、f(a=b)If(a=b)If(strcmp(a,b)=0If(strcpy(a,b)分析:Strcpy函数为字符串复制,Strcmp函数的功能为逐个比较两个字符串中的对应字符,直到对应字符不等或遇到字符串结束符。所以选C.C2023/1/16下面程序段运行的结果是()。Char c=“tv0willn”;Printf(“%d”,strlen(c);14 (B)9 (C)4 (D)3分析:C语言规定在遇到字符0时表示字符串结束,strlen函数为计算字符串长度,但不包括字符串结束符0.t,v,是三个字符。所以选D.D2023/1/16对以下说明语句的正确理解是()。Int a10=1,2,3,
25、4,5;将5个初值依次赋给a1a5(A)将5个初值依次赋给a6a10(C)将5个初值依次赋给a0a4(D)因为数组长度与初值个数不同,语句有错分析:对一维数组的部分元素赋初值,则从数组的第一个元素起按顺序赋值a0、a1、a2 所以选C.C2023/1/16下面程序段运行的结果是()。Int i;Int a33=1,2,3,4,5,6,7,8,9;For(i=0;i3;i+)printf(“%3d”,ai2-i);(A)3 5 7 (B)3 6 9 (C)1 5 9 (D)1 4 7 分析:定义i,定义数组a33.执行for语句,i=0,i3成立,输出ai2-i即a02=3,再i+,此时i=1,
26、判断i3成立,输出ai2-i=a11=5,再i+,i=2,判断i3成立,输出ai2-i=a20=7再i+,i=3,判断i3不成立,结束for循环。所以选A.A2023/1/16以下正确的数组定义语句是()。(A)Int a14=1,2,3,4,5;(B)float x3=1,2,3(C)Float x33=1,2,3,4 (D)float x33=1,2,3A中有五个数与题意不符,所以错。B中没有确定一行中有几列,不明确。C中有五列预报题意不符。所以只能选C.D2023/1/16下面程序段运行的结果是(A )。Float x33=1,2,3;Printf(“%6.2f”,x11);Printf
27、(“%6.2f”,x20);3.00 0.00 (B)2.00 3.00(C)0.00 3.00 (D)1.00 3.00 2023/1/16源程序:源程序:#include main()char str30;scanf(%s,str);printf(%s,str);分析:scanf(%s,str);表示只能读取输入的一串字符串,多了不读取。hello everybody之间有空格表示两个字符,计算机只读取一个字符,所以输出的只有hello.2023/1/162023/1/16源程序:源程序:#include main()char str30;gets(str);printf(%s,str);
28、分析:gets表示输入的整体,不管其中间包括有多少的空格,计算机都输出0之前的所有的字符,所以答案是 hello everybody.2023/1/162023/1/16源程序:源程序:#include#include main()char s20,str320;int i;for(i=0;i3;i+)gets(stri);strcpy(s,stri);for(i=0;i3;i+)if(strcmp(stri,s)0)strcpy(s,stri);printf(%sn,s);?#include#includemain()char s20,str320;int i;for(i=0;i3;i+)g
29、ets(stri);strcpy(s,str0);for(i=0;i3;i+)if(strcmp(stri,s)0)strcpy(s,stri);printf(%sn,s);2023/1/162023/1/16分析:输入字符串s20,str320,整数i,进入for语句,i若3,则输出stri。strcpy(s,str0)。再进入for语句,i=0,i若3,如果strcmp(stri,s)0,则strcpy(s,stri),输出s.2023/1/16源程序:源程序:#include#include main()int m,i,k,h=0,leap=1;printf(n);for(m=100;m
30、=200;m+)k=sqrt(m+1);for(i=2;i=k;i+)if(m%i=0)leap=0;break;if(leap)printf(%-4d,m);h+;if(h%10=0)printf(n);leap=1;printf(nThe total is%d,h);2023/1/162023/1/16源程序:源程序:#include main()char s80;int i,j;printf(input a string:);scanf(%s,s);for(i=0,j=0;si!=0;i+)if(si!=c)sj=si;j+;sj=0;puts(s);2023/1/162023/1/16
31、不使用库函数strcat,编写程序实现将字符串str2连接到字符串str1后。2023/1/16源程序:源程序:#include char mystrcat(char*p1,char*p2)while(*p1)p1+;while(*p2)*p1+=*p2+;*p1=0;main()char str1100,str2100;printf(input two strings:);gets(str1);gets(str2);mystrcat(str1,str2);puyuts(str1);2023/1/16框图:框图:2023/1/162023/1/16现定义一个含有30个整型元素的数组,按顺序分别
32、赋予从2开始的偶数,然后按顺序每5个元素求一个平均值,放在另一个数组中并输出该数组中各元素值。2023/1/16源程序:源程序:#include main()int i,j=0,a30,b10;printf(请按顺序输入从2开始的偶数:n);for(i=0;i30;i+)scanf(%d,&ai);for(i=0;i=25;i+=5)bj=(a0+i+a1+i+a2+i+a3+i+a4+i)/5;printf(%dn,bj);j+=1;2023/1/16框图:框图:2023/1/162023/1/162023/1/16 1.以下正确的 函数首部定义形式是(D )。A.Double f(a,b)
33、B.double f(int a,b)C.double f(int a;int b)D.double f(int a,int b)分析:函数首部定义一般形式为函数类型 函数名(参数类型1参数名1 ,参数类型n,参数名n)2023/1/162.C语言允许函数定义时缺省值类型,此时该函数值类型默认为(D )。A.Double型 B.long型 C.void型 D.int型分析:在函数定义中,若缺少函数类型时,则默认为int2023/1/163.下面函数调用语句中实参的个数为()。max(3+5,sqrt(4),(7,8);A.3 B.5 C.4 D.2分析:3个实参分别是3+5和sqrt(4)和(
34、7,8)。每个实参都以逗号隔开。3+5 是一个表达式实参Sqrt(4)是一个函数实参(7,8)是一个数组实参A2023/1/164.在函数调用func(x+2,y),z*2)中的实参个数是()。A.3 B.2 C.4 D.5B分析:(x+2,y)是一个数组实参 z*2是一个表达式实参2023/1/165.C语言规定,当函数调用中实参为简单变量时,它与对应形参之间的数据传递方式是()。A.单向传数值B.双向传数值,即由实参将值传给形参,再由形参传回给实参C.可以由用户选择传递方式D.传地址A分析:当实参为简单变量时,它与形参间采用传值方式,即形参复制实参的值,而不能改变实参所在存储单元中的值。2
35、023/1/166.以下程序的正确运行结果是()#include main()int a=2;printf(“%4d”,f(a+1);int f(int x)int a=0;a+;x+;return(x+a);A.4 B.5 C.6 D.7B分析:主函数中实参a+1等于3,对应形参x,即x=3.自定义函数f中,a=0,a+即a=1;x=3,x+即x=4.所以返回值为4+1即5.2023/1/167.凡是函数中未指定存储类型的局部变量,其隐含的存储类型为()A.外部型(extern)B.自动型auto型 C.静态型(static型)D.寄存器型(register)B变量有四种存储方式:自动变量(
36、auto),静态变量(static),寄存器变量(regisiter),外部变量(extern),其中自动变量又称为普通变量,其可以省略.所以选B2023/1/168.以下程序的正确运行结果是(A )#include main()int k=4,m=1,p,i;for(i=0;i2;i+)p=f(k,m);printf(“%d”,p);f(int a,int b)static int m=0,i=2;i+=m+1;m=i+a+b;return m;A.17 B.16 C.20 D.8分析:注意static函数的使用。其函数调用后其值不会消失而保留在原值。2023/1/169.若用数组名作为函数
37、调用的实参,则传递给形参的是()A.数组的首地址B.数组第一个元素的值C.数组中全部元素的值D.数组元素的个数A分析:当实参为数组时,它使用传址方式。而数组的数组名就是地址常量,也是数组的首地址。2023/1/1610.若调用一个函数,该函数定义中函数值类型缺省,且此函数中没有return语句,则正确的说法是该函数(A)A.没有返回值 B.返回若干个系统默认值C.能返回一个用户所希望的函数值 D.返回一个不确定的值分析:在该题中说这个函数中没有return语句,所以该函数没有返回值。2023/1/1611.以下不正确的说法为()A.在不同函数中可以使用相同名字的变量B.形式参数是局部变量C.在
38、函数内定义的变量只在本函数范围内有效D.在函数内的复合语句中定义的变量在本函数范围内有效D分析:局部变量是指在函数内定义的变量,只在该函数范围内有效。所以形参是局部变量。在函数内的复合语句中定义的变量在本复合语句范围内有效。2023/1/1612.以下程序的正确运行结果是(C )#include void num()extern int x,y;int a=15,b=10;x=a-b;y=a+b;int a=7,b=5;x=a+b;y=a-b;num();Printf(“%d,%dn”,x,y);A.12,2 B.不确定 C.5,25 D.1,12使用extern函数即外部变量,该函数的意思是
39、,在每个文件中都定义一次。在主函数中a=7,b=5,然后执行,x=a+b,y=a-b,后面又调用了num函数,定义了x=15,b=10然后执行x=a+b,y=a-b,所以这里输出的是5,25.2023/1/1613.在一个c源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类型是(A )A.Extern B.register C.auto D.static分析:加关键字extern声明,该全局变量在其他文件中已说明。所以c语言源程序文件中,若要定义一个只允许本源文件中所有函数的全局变量,使用。2023/1/1614.以下程序的正确运行结果是(D )main
40、()int a=2,i;for(i=0;i3;i+)printf(“%4d”,f(a);f(int a)int b=0;static int c=3;b+;c+;return(a+b+c);A.7 7 7 B.7 10 13 C.7 9 11 D.7 8 9分析:定义整型变量b值为0.c=3,这里使用了static函数,所以第一次是c=4,第二次c=5,第三次c=6,最后返回的是a+b+c,在 主函数中定义a=2,然后用for函数分别输出当c=4,c=5,c=6时的a+b+c的值。2023/1/16源程序:源程序:#include main()int f1();int f2();f1();f2
41、();f1();f2();int f1()int a=0;printf(a=%dn,+a);int f2()static int b=0;printf(b=%dn,+b);2023/1/162023/1/16源程序:源程序:#include int func(int n)if(n=1)return 1;else return(n*func(n-1);main()int x;x=func(3);printf(%6d,x);2023/1/162023/1/16#includevoid swap(int x)x0=x0+x1;x1=x0-x1;x0=x0-x1;main()int a2=5,6;swap(a);printf(%d,%d,a0,a1);源程序:源程序:2023/1/162023/1/16源程序:源程序:#includevoid tp(int x,int y)x+;y-;void main()int x=0,y=3;tp(x,y);printf(%d,%d,x,y);2023/1/162023/1/16源程序:源程序:#includemain()int p(int);printf(%d,p(3);int p(int n)return(n=0)?n:p(n-1)+p(n-2);2023/1/16
限制150内