• 517.03 KB
  • 2022-04-22 11:51:40 发布

《C语言程序设计习题与上机指南》答案.doc

  • 78页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第一部分习题篇第一章C语言概述一.单选题1.以下说法中正确的是(C)。A)C语言程序总是从第一个函数开始执行B)在C语言程序中,要调用函数必须在main()函数中定义C)C语言程序总是从main()函数开始执行D)C语言中的main()函数必须放在程序的开始部分2.一个C语言程序是由(B)。A)一个主程序和若干子程序组成B)函数组成C)若干过程组成D)若干子程序组成3.C语言规定,在一个源程序中,main函数的位置(C)。A)必须在最开始B)必须在系统调用的库函数的后面C)可以任意D)必须在最后4.以下叙述不正确的是(D)。A)一个C源程序可由一个或多个函数组成B)一个C源程序必须包含一个main函数C)C程序的基本组成单位是函数D)在C程序中,注释只能位于一条语句的后面5.下列关于C语言的说法不正确的是(D)。A)C语言既有高级语言的功能,也具有低级语言的一些功能B)C语言中的一条执行语句都必须用分号结束C)注释可以出现在程序中任意合适的地方D)include命令行后面必须加分号6.用C语言编写的代码程序(B)。A)可以立即执行B)是一个源程序C)经过编译即可执行D)经过编译解释才能执行7.用高级语言(如C语言)编写的程序称为(A)A)源程序B)目标程序C)可执行程序D)编译程序8.一个函数的组成有(A)。A)函数首部和函数体B)函数名和函数的声明部分C)主函数和子函数D)声明部分和执行部分9.在C语言中,用来表示“取地址”的符号是(B)。A)#B)&C)*D)@10.C语言是计算机高级语言,它适合于作为系统描述语言,它(A)。A)既可用来写系统软件,也可用来写应用软件B)只能写系统软件,不能用来写应用软件C)不能写系统软件,只能用来写应用软件D)既不能写系统软件,也不能写应用软件二.填空题1.C语言用函数作为程序的模块单位,便于实现程序的模块化。2.C语言允许直接访问物理地址,能进行位操作。 3.用C语言编写的程序,每一个语句和数据定义的结尾必须要有一个分号。4.每个C程序中必须有一个main()函数。5.C程序中的函数体由{}括起来。6.C程序中的“n”表示在程序运行中换行。7.C程序中,“/*……*/”表示注释部分。8.C程序中,一个函数由函数首部和函数体组成。9.一个C程序总是从main()函数开始执行的,不论该函数在整个程序中的位置如何。10.在纸上编好一个C源程序后,要经过编辑、编译、连接、运行这几个步骤进行上机运行。三.判断题1.C语言不具有低级语言的特性。(错)2.C语言之所以也被称为中级语言,是因为它比高级语言的功能要少,而比低级语言的功能多。(错)3.C语言与其他高级语言一样具有结构化的控制语句。(对)4.C语言允许直接访问物理地址。(对)5.每一个C程序必须有一个main函数。(对)6.C程序的语句最后应有一个分号。(对)7.C程序中的main函数必须放在整个程序的最前头。(错)8.计算机高级语言对源程序进行翻译有两种方式:编译和解释。(对)四.编程题1.编写一个C程序,输出以下信息:************Iamastudent.************#include/*包含头文件,为了使用printf和scanf语句,注意句末无分号*/voidmain(){printf(“***********n”);/*n的作用相当于回车*/printf(“Iamastudent.n”);printf(“***********n”);}2.编写一个C程序,输入a、b两个数,输出其中大的数。(只用一个主函数)#includevoidmain(){inta,b;printf(“Pleaseinputa,b:n”);scanf(“%d,%d”,&a,&b);/*注意输入两个数之间用逗号分隔*/if(a>b)printf(“%d”,a);elseprintf(“%d”,b);}3.编写一个C程序,输入a、b、c三个数,输出其中最大数。(只用一个主函数)#includevoidmain(){inta,b,c,max;printf(“Pleaseinputa,b,c:n”);scanf(“%d,%d,%d”,&a,&b,&c); max=a;if(avoidmain(){inti=5,j=9;floatx=2.3,y=4.5;printf("%8.2fn",i%(int)(x+y)*j/2/3+y);}三.判断题1.C语言中,字符常量可以用单引号或双引号括起来。(错)2.C语言中,字符常量只能包含一个常量(字符)。(对)3.在C语言中,字符串常量隐含处理成以‘’结尾。(对)4.下面程序段的输出结果是9。(错)inta=9;printf(“%on”,a);(注意:%o中的o是字母o,不是数字0)5.C语言中,用户所定义的标识符允许使用关键字。(错)6.C语言中,用户所定义的标识符中,大、小字母代表不同标识。(对)7.C语言中,符号常量的值在程序运行过程中可以改变。(错)8.C语言中,不要求对程序中所用到的变量进行强制定义。(错)9.C语言中,一个整数如果其值在-323768~32767范围内,认为它是int型,只能赋值给int型变量。(错)10.设一个C系统的float型有效数字是7位,则超过7位数的运算是不准确的。(对)四.计算题1.求下面表达式的值。1)x+a%3*(int)(x+y)%2/4设x=2.5,a=7,y=4.7第1步:(int)(x+y)=(int)(7.2)=7第2步:a%3*7%2/4=7%3*7%2/4=1*7%2/4=1/4=0第3步:x+0=x=2.5(计算机显示为2.500000)2)(float)(a+b)/2+(int)x%(int)y设a=2,b=3,x=3.5,y=2.5第1步:(float)(a+b)/2=(float)(2+3)/2=(float)(5)/2=5.0/2=2.5第2步:(int)x%(int)y=(int)(3.5)%(int)(2.5)=3%2=1第3步:2.5+1=3.5(计算机显示为3.500000)2.写出下面赋值表达式运算后a的值,设原来a=12,n=5。1)a+=aa=a+a=12+12=242)a-=2a=a-2=12-2=103)a*=2+3a=a*(2+3)=12*5=60 4)a/=a+aa=a/(a+a)=12/24=0注意a是整型5)a%=(n%=2)已知:n=5a=06)a+=a-=a*=a从右向左解:a=a*a=144;a=a-a=0;a=a+a=0五.编程题1.要将“China”译成密码,规律是:用原来的字母后面第4个字母代替原来的字母。例如,“A”用字母“E”来替代。因此,“China”应译为“Glmre”。编程:用赋初值的方法使c1.c2.c3.c4.c5这五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,这五个变量分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。#includevoidmain(){charc1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;printf(“passwordis%c%c%c%c%cn”,c1,c2,c3,c4,c5);}运行结果:passwordisGlmre也可以用循环和数组:#includevoidmain(){charc[]={“China”};printf(“passwordis“);for(inti=0;i<=4,i++)printf(“%c”,c[i]+=4);printf(“n”);}2.请编程,要求用赋初值的方法使c1.c2这两个变量的值分别为97和98,然后分别按整型和字符型输出。#includevoidmain(){charc1=97,c2=98;printf(“%d,%dn”,c1,c2);printf(“%c,%cn”,c1,c2);}3.编写程序,从键盘输入三个单精度数a、b、c,计算总和、平均值、x=a2+b2+c2的值,并计算x平方根的值。所有运行数据保留三位小数,第四位四舍五入。#include#includevoidmain(){doublea,b,c,total,average,square,squareroot;printf("请输入三个单精度实数:");scanf("%f%f%f",&a,&b,&c);total=a+b+c;average=total/3.0;square=a*a+b*b+c*c;squareroot=sqrt(square); printf("三个数的和=%-15.3f,三个数的平均值=%-15.3fn",total,average);printf("三个数的平方和x=%.3f,x的平方根=%.3fn",square,squareroot);}运行结果:请输入三个单精度实数:1.234.567.89三个数的和=13.680,三个数的平均值=4.560三个数的平方和x=84.559,x的平方根=9.1964.输入三角形的三个边长,计算并输出三角形的面积。#include#includevoidmain(){floata,b,c,k,area;printf("请输入三角形三条边的边长:");scanf("%f%f%f",&a,&b,&c);if((a+b<=c)||(a+c<=b)||(b+c<=a))printf("您输入的三条边无法构成三角形。n");else{k=(a+b+c)/2;area=sqrt(k*(k-a)*(k-b)*(k-c));/*函数sqrt(x)是求x的平方根*/printf("该三角形的面积是%6.2fn",area);}}5.输入两个长整型数,输出它们(整数除的)商和余数。#includevoidmain(){longa1,a2,a3,a4;printf("请输入两个整数:");scanf("%ld%ld",&a1,&a2);a3=a1/a2;a4=a1%a2;printf("两数进行整数除的商是%ld,余数是%ldn",a3,a4);}运行结果:请输入两个整数:654321789两数进行整数除的商是829,余数是2406.输入两个整数,输出它们(实数除)的商,并输出商的第二位小数位(例如:15/8.0=1.875,1.875的第二位小数位是7)。#includevoidmain(){inta,b,c;floatf;printf("请输入两个整数:"); scanf("%d%d",&a,&b);f=1.0*a/b;c=(int)(f*100)%10;printf("两数进行实数除,商是%f,商的第二位小数位是%dn",f,c);}运行结果:请输入两个整数:158两数进行实数除,商是1.875000,商的第二位小数位是77.输入一个(unsigned类型)无符号整数,分别输出它的低四位和高四位。#includevoidmain(){unsignedu,high4,low4;printf("请输入一个无符号整数:");scanf("%u",&u);low4=(u&0xf);/*u的低四位保留原值,其余位置0*/high4=(u&0xf000)>>12;/*u的高四位保留原值,其余位置0,并右移12位*/printf("%u的十六进制是%xn",u,u);printf("十六进制表示%u的低四位是%x,高四位是%xn",u,low4,high4);}运行结果:请输入一个无符号整数:5433254332的十六进制是d43c十六进制表示54332的低四位是c,高四位是d8.输入两个小写字母分别赋值给字符变量ch1与ch2,将它们转换成大写字母,并交换ch1与ch2的值,最后输出ch1与ch2的值。#includevoidmain(){charc1,c2,t;printf("请输入两个半角的小写英文字母:");c1=getchar();c2=getchar();c1-=32;c2-="a"-"A";/*与32等价*/t=c1;c1=c2;c2=t;printf("%c%cn",c1,c2);}运行结果:请输入两个半角的小写英文字母:dbBD9.输入秒数,将它转换,用小时、分钟、秒来表示。例如输入7278秒,则输出:2小时1分18秒。#include voidmain(){intk;inthour,minute,second;printf("请输入秒数:");scanf("%d",&k);hour=k/3600;k%=3600;minute=k/60;second=k%60;printf("%d小时%d分钟%d秒。n",hour,minute,second);}运行结果:请输入秒数:72782小时1分钟18秒。10.输入两个复数的实部和虚部,输出这两个复数积的实部和虚部。两复数的积按下面的公式计算:(a+bi)·(c+di)=(ac-bd)+(ad+bc)i。#includevoidmain(){floata,b,c,d,real,imag;printf("请输入第一个数的实部和虚部:");scanf("%f%f",&a,&b);printf("请输入第二个数的实部和虚部:");scanf("%f%f",&c,&d);real=a*c-b*d;imag=a*d+b*c;printf("两个复数积的实部和虚部分别是%f,%fn",real,imag);}运行结果:请输入第一个数的实部和虚部:1.12.2请输入第二个数的实部和虚部:3.34.4两个复数积的实部和虚部分别是-6.050000,12.100000第三章C程序的基本控制结构一.单选题1.若变量已经正确定义为float型,要通过语句scanf(“%f%f%f”,&a,&b,&c)。给a输入10.0,n输入20.0,c输入30.0,下列不正确的输入形式是(B)。A)10<回车>20<回车>30<回车>B)10.0,20.0,30.0<回车>C)10.0<回车>20.030.0<回车>D)1020<回车>30<回车>2.若有说明语句:charc=’65’;则变量c(D)。A)包含1个字符B)包含2个字符C)包含3个字符D)说明不合法,c的值不确定3.若w=1,x=2,y=3,z=4,则条件表达式wvoidmain(){chara1=’A’,a2=’a’;printf(“%cn”,(a1,a2));}以下叙述中正确的是(B)。A)程序输出大写字母AB)程序输出小写字母aC)格式说明符不足,编译出错D)程序运行时产生出错信息6.以下程序的输出结果是(A)。#includevoidmain(){inta=2,b=3,c=0,d;d=!a&&!b||!c;printf(“%dn”,d);}A)1B)0C)非0的数D)-17.以下程序的输出结果是(B)。#includevoidmain(){inta=6,b=5;printf(“%dn”,--a+b,--b+a);}A)8B)9C)10D)118.下面程序输出的结果是(D)。#includevoidmain(){inta=55,b=50,c=60,d;d=a>20?b:c;switch(d){case40:printf(“%d,”,a);case50:printf(“%d,”,b);case60:printf(“%d,”,c);default:printf(“$n”);}}A)50,60B)50,$C)60,$D)50,60,$9.如果从键盘输入数据666,下面程序输出的结果是(C)。#includevoidmain(){intx;scanf(“%d”,&x);if(x>300)printf(“%d”,x);if(x>200)printf(“%d”,x); if(x>100)printf(“%d”,x);}A)666B)666666C)666666666D)以上都不对10.有如下程序。#includevoidmain(){inta=5,b=6,c=1;switch(c){case0:b++;case1:a++;case2:a++;b++;}printf(“a=%d,b=%dn”,a,b);}该程序的输出结果是(C)A)a=5,b=6B)a=6,b=7C)a=7,b=7D)a=7,b=811、下面的程序中:inti=9;while(i=0)i=i-1;则下列描述正确的是(C)A)while循环执行9次B)循环体语句执行一次C)循环体语句一次也不执行D)循环是无限循环(注意:i=0是赋值语句,不是对i中值和0进行比较,因此程序执行后i的值是0而不是9)12、下面的程序中:inti=-1;do{i=i*i;}while(!i);则下列描述正确的是(B)A)循环体一次也不执行B)循环体执行一次C)循环体执行两次D)是无限循环13、下面的程序中:inti=0;while(i=1){…}则下列描述正确的是(C)A)循环控制表达式不合法B)循环控制表达式为0C)循环控制表达式为1D)以上都不对14、下面的程序中:intx=0,total=0;while(!x!=0)total+=++x;printf(“%d”,total);则下列描述正确的是(D)A)程序段的控制表达式是非法B)程序段是无限循环 C)运行程序段后输出0D)运行程序段后输出115、若变量已正确定义,要求以下程序段完成6!的运算,不能完成的程序段是(D)。A)B)i=1;i=1;x=1;x=1;while(i﹤=6)do{x=x*i;{x=x*i;i++;}i++;}while(i﹤=6);C)D)for(x=1,i=1;i﹤=6;i++)for(i=1;i﹤=6;i++)x=x*i;{x=1;x=x*i;}16、设n为整型变量,则for(n=10;n>=0;n--)循环次数为(C)A)9B)10C)11D)1217、对表达式for(表达式1;;表达式3)可以理解为(B)A)for(表达式1;0;表达式3)B)for(表达式1;1;表达式3)C)for(表达式1;表达式1;表达式3)D)for(表达式1;表达式3;表达式3)18、下面的程序运行结果是(B)#includevoidmain(){intx=10;dox--;while(--x);printf("%dn",x--);}A)-1B)0C)1D)8二.填空题1.下面程序的输出结果是16.00,请填空。#includevoidmain(){inta=9,b=2;floatx=6.6,y=1.1,z;z=a/2+b*x/y+1/2;printf(“%5.2fn”,z);}2.下面程序输出的结果是Z。#includevoidmain(){charc=’A’;printf(“%c”,c+25);}3.有以下程序。#include voidmain(){chara,b,c,d;scanf(“%c,%c,%d,%d”,&a,&b,&c,&d);printf(“%c,%c,%c,%cn”,a,b,c,d);}若从键盘上输入5,6,65,66<回车>。则输出结果是5,6,A,B。4.已知字母A的ASCII值是65,运行下面程序时输入B35<回车>,输出结果是1F。#includemain(){chara,b;a=getchar();scanf(“%d”,&b);a=a-‘A’+’0’;b=b*2;printf(“%c%cn”,a,b);}5.下面程序的输出结果是22。#includevoidmain(){intx=13,y=22;printf(“%d”,y/=(x%=6));}6.下列程序的功能是把从键盘上输入的整数取绝对值后输出。#includevoidmain(){intx;scanf(“%d”,&x);if(x<0)x=-x;printf(“%dn”,x);}7.下面程序的输出结果是9。#includevoidmain(){inta=3,b=6,c=9;a=a>b?a:b;a=a>c?a:c;printf(“%d”,a);}8.从键盘用数字输入月份,然后用英文单词输出显示月份。#includevoidmain(){intmonth;charch;while(1){printf(“npleaseinputmonth(1-12):”);scanf(“%d”,&month); switch(month){case1:printf(“Januaryn”);break;case2:printf(“Februaryn”);break;case3:printf(“Marchn”);break;case4:printf(“Apriln”);break;case5:printf(“Mayn”);break;case6:printf(“Junen”);break;case7:printf(“Julyn”);break;case8:printf(“Augustn”);break;case9:printf(“Septembern”);break;case10:printf(“Octobern”);break;case11:printf(“Novembern”);break;case12:printf(“Decembern”);break;default:printf(“inputdataerrorn”);}getchar();printf(“ncontinue?(Y/N):");ch=getchar();if(ch!="y"&&ch!="Y")break;}}9.下面程序的输出结果是!!!。#includevoidmain(){intx=1,y=0;switch(x){case1:switch(y){case0:printf(“!!!n”);break;case1:printf(“@@@n”);break;}break;case2:printf(“###n”);}}10.下面程序的输出结果是27。#includevoidmain(){intsum=0,i;for(i=1;i<=4;i++){switch(i){case0:case1:sum=sum+2;case2:case3:sum=sum+3;default:sum=sum+4;}}printf(“%d”,sum);} 11.下面程序的输出结果是3,3,3。#includevoidmain(){inti=2,j=2,k=3;if((j++||k++)&&i++)printf(“%d,%d,%dn”,i,j,k);}12.若从键盘输入15,则下面程序输出的结果是151515。#includevoidmain(){intx;scanf(“%d”,&x);if(x>10)printf(“%d”,x);if(x>8)printf(“%d”,x);if(x>6)printf(“%d”,x);}13、下面程序的输出结果是0。#includevoidmain(){inti,t=1;for(i=5;i>=0;i--)t=t*i;printf("%dn",t);}14、下面程序的输出结果是D。#includevoidmain(){charch;while((ch=getchar())!="n"){if(ch>="a"&&ch<="z")ch=ch-32;printf("%c",ch);}}输入内容:d15、下面的程序为大写字母转换为小写字母。#includevoidmain(){charch;while((ch=getchar())!="n"){if(ch>="A"&&ch<="Z")ch=ch+32;printf("%cn",ch);}}16、输入某班级10名同学5门课程的成绩,分别统计每个学生5门课程的平均成绩。#includevoidmain(){inti,j;floatgrade,sum,average; for(i=1;i<=10;i++){sum=0;for(j=1;j<=5;j++){scanf("%f",&grade);sum=sum+grade;}average=sum/5;printf("No.%daverage=%5.2fn",i,average);}}17、输入若干字符数据,分别统计其中A,B,C的个数。#includevoidmain(){charc;intk1=0,k2=0,k3=0;while((c=getchar())!="n"){switch(c){case"A":k1++;break;case"B":k2++;break;case"C":k3++;break;}}printf("A=%d,B=%d,C=%dn",k1,k2,k3);}18、下面程序是将从键盘输入的小写字母转变成大写字母。#includevoidmain(){intc;while((c=getchar())!="n"){if(c>=’a’&&c<=’z’)putchar(c-"a"+"A");elseputchar(c);}}19、输出如下方阵。12345678910111213141516#includevoidmain(){inti,j,x;for(i=1;i<=4;i++){for(j=1;j<=4;j++){x=(i-1)*4+j;printf("%4d",x);} printf("n");}}/*第一行输出j加0的值,第二行输出的是j加4,第三行输出的是j加8,第四行输出的是j加12,0、4、8、12由(i-1)*4求得*/三.改错题1、下面程序的功能是判断某一年是否闰年。#includevoidmain(){intyear,leap;scanf(“%d”,&year);if(year%4==0){if(year%100==0){if(year%400!=0)leap=1;elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf(“%dis”,year);elseprintf(“%disnot”,year);printf(“aleapyear.n”);}错误语句:if(year%400!=0)正确语句:if(year%400==0)2.下面的功能是输出一个4位整数的后两位数值,例如输入1234,输出34。#includevoidmain(){intx,y;printf(“ninputainteger<1000--9999>:”);scanf(“%d”,x);y=x%100;printf(“%dn”,y);}错误语句:scanf(“%d”,x);正确语句:scanf(“%d”,&x);3.输入三个整数,输出其中最大的数。#includevoidmain(){inta,b,c,temp,max; scanf(“%d,%d,%d”,&a,&b,&c);temp=(a>b)?a:b;max=(tempc)?temp:c;4.下面程序判断输入的一个整数是否能被5和7同时整除,若能整除,输出“YES”,否则,输出“NO”。#includevoidmain(){intx;scanf(“%d”,&x);if(x%5==0||x%7==0)printf(“YES”);elseprintf(“NO”);}错误语句:if(x%5==0||x%7==0)正确语句:if(x%5==0&&x%7==0)5、求10到100之间能被3整除的数的个数。#includevoidmain(){inti,num;for(i=10;i<100;i++)if(i%3==0)num++;printf("nThereare%dnumbers!",num);}错误语句:inti,num;正确语句:inti,num=0;6、用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于10-6为止。#include#includevoidmain(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)>10-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi); }错误语句:while(fabs(t)>10-6)正确语句:while(fabs(t)>1e-6)7、求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。#includevoidmain(){intf1,f2;inti;f1=1;f2=1;for(i=1;i<=40;i++){printf("%15ld%15ld",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}错误语句:for(i=1;i<=40;i++)正确语句:for(i=1;i<=20;i++)四.编程题1.从键盘输入一个圆的半径,输出圆的面积。输出时要有文字说明,取小数点后2位。#includevoidmain(){floatr,s;scanf(“%f”,&r);s=3.14*r*r;printf(“s=%.2f”,s);}2.输入一个整数,判断是奇数还是偶数。#includevoidmain(){inti;scanf(“%d”,&i);if(i%2==0)printf(“%d是一个偶数”,i);elseprintf(“%d是一个奇数”,i);}3.从键盘输入一个三角形的边长,输出三角形面积,取2位小数。当三角形不成立时输出“它不是一个三角形”。#include #includevoidmain(){floata,b,c,s,area;scanf(“%f,%f,%f”,&a,&b,&c);if(a+b>c&&b+c>a&&c+a>b){s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“area=%.2fn”,area);}elseprintf(“它不是一个三角形”);}4.从键盘输入一个字符,判断其是否是大写字母,如果是大写字母,则转换为小写字母,否则不转换。#includevoidmain(){charc;c=getchar();if(c>=’A’&&c<=’Z’)c=c+32;printf(“%c”,c);}5.从键盘输入一个百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。其中‘A’对应的是90分(含90分)以上的成绩,‘B’对应的是80~89分的成绩,‘C’对应的是70~79的成绩分,‘D’对应的是60~69分的成绩,‘E’对应的是小于60分的成绩。如果输入的数值小于0或大于100要有“输入成绩错误”的信息显示。#includevoidmain(){intscore,c;scanf(“%d”,&score);c=score/10;switch(c){case0:case1:case2:case3:case4:case5:printf(“E”);break;case6:printf(“D”);break;case7:printf(“C”);break;case8:printf(“B”);break;case9:case10:printf(“A”);break; default:printf(“error”);}}6、编写程序,求1+2+3+…+200。#includevoidmain(){inti,s;i=1;s=1;for(i=1;i<=200;i++)s=s+i;printf("1+2+3+…+200=%dn",s);}运行结果:201017、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…求出这个数列的前20项之和。#includevoidmain(){inti,temp;floatf2=2,f1=1,sum=0;for(i=1;i<=20;i++){sum=sum+f2/f1;temp=f2;f2=f2+f1;f1=temp;}printf("sum=%9.6fn",sum);}运行结果:32.6602598、求1!+2!+3!+4!+…+20!#includevoidmain(){inti;floatsum=0,f=1;for(i=1;i<=20;i++){f=f*i;sum=sum+f;}printf("sum=%en",sum);}运行结果:2.561327e+0189、用牛顿迭代法求方程4x3-8x2+6x-12=0在1.5附近的根。#include#includevoidmain(){floatx=1.5,x0,y,f1; do{x0=x;y=((4*x0-8)*x0+6)*x0-12;f1=(12*x0-16)*x0+6;(f1是导数)x=x0-y/f1;}while(fabs(x-x0)>=1e-6);printf("x=%10.2fn",x);}运行结果:x=2.0010、编写程序,打印出以下图案。*************************#includevoidmain(){inti,j,k;for(i=1;i<=4;i++)/*输出上面四行*号*/{for(j=1;j<=4-i;j++)/*输出*号前面的空格*/printf("");for(k=1;k<=2*i-1;k++)printf("*");/*输出每行*号*/printf("n");/*输出每行*号后换行*/}for(i=1;i<=3;i++)/*输出下面三行*号*/{for(j=1;j<=i;j++)printf("");/*输出*号前面的空格*/for(k=1;k<=5-2*(i-1);k++)printf("*");/*输出每行*号*/printf("n");/*输出每行*号后换行*/}}第四章数组一.选择题1.以下能正确定义一维数组的选项是(B)。A)inta[5]={0,1,2,3,4,5};B)chara[]={0,1,2,3,4,5};C)chara={"A","B","C"};D)inta[5]="0123";2.已有定义intx[3][2];以下能正确引用数组元素的选项是(C)。A)x[2][2]B)x[1][2]C)x[2][1]D)x[0][2]3.有以下语句:intx;charc[10];,则正确的输入语句是(D)。A)scanf("%d%s",x,&c);B)scanf("%d%s",&x,&c); C)scanf("%d%s",x,c);D)scanf("%d%s",&x,c);4.以下叙述中错误的是(C)。A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出B)数组名代表的是数组所占存储区的首地址,其值不可改变C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出"下标越界"的出错信息(VC:可以运行但会显示:遇到问题需要关闭)D)可以通过赋初值的方式确定数组元素的个数5.已有定义:chara[]="xyz",b[]={"x","y","z"};,以下叙述中正确的是(C)。A)数组a和b的长度相同B)a数组长度小于b数组长度C)a数组长度大于b数组长度D)上述说法都不对6.以下能正确定义一维数组的选项是(B)。A)intnum[];B)#defineN100intnum[N];C)intnum[0..100];D)intN=100;intnum[N];7.有以下程序#includevoidmain(){chara[]={"a","b","c","d","e","f","g","h",""};inti,j;i=sizeof(a);j=strlen(a);printf("%d,%dn",i,j);}程序运行后的输出结果是(D)。A)9,9B)8,9C)1,8D)9,88.下面程序的运行结果是(B)。#includevoidmain(){charch[7]={"65ab"};inti,s=0;for(i=0;ch[i]>="0"&&ch[i]<"9";i++)s=10*s+ch[i]-"0";printf("%dn",s);}A)12ba56B)65C)6D)629.有以下程序#includevoidmain(){intaa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};inti,s=0;for(i=0;i<4;i++)s+=aa[i][1];/*求每行第1列的数的和*/printf("%dn",s);}程序运行后的输出结果是(B)。A)11B)19C)13D)2010.以下不能正确定义二维数组的选项是(A)。.A)inta[2][]={{1,2},{3,4}};B)inta[][2]={1,2,3,4}; C)inta[2][2]={{1},{2}};D)inta[2][2]={{1},2,3};二.填空题1.C语言规定数组名代表数组的首地址。2.C语言中二维数组中元素排列的顺序是:按行存放。3.字符数组中的一个元素存放一个字符。4.C语言规定了“字符串结束标志”,以字‘’来表示。5.用"%s"格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。6.若有以下定义:floata[10];则a数组元素下标的上限是9,下限是0。7.下列程序运行结果是6。#include#includevoidmain(){charstr[12]={"s","t","r","i","n","g"};printf("%dn",strlen(str));}8.以下程序的功能是:使一个字符串按逆序存放,请填空。#include#includevoidmain(){charm;charstr[]="abcdefg";inti,j;’for(i=0,j=strlen(str);ivoidmain(){inta[2][3]={40,25,-8,6,62,39};inti,j,max;max=a[0][0];for(i=0;i<2;i++)for(j=0;j<3;j++)if(a[i][j]>max)max=a[i][j];printf("%dn",max);}10.下面程序的功能是,将字符数组S2中的全部字符拷贝到字符数组S1中。不用strcpy函数。请填空#include#include voidmain(){chars1[80],s2[80];inti;scanf("%s",s2);for(i=0;i<=strlen(s2);i++)s1[i]=s2[i];printf("复制字符串为:%sn",s1);}三.改错题1.下面程序求矩阵a的主对角线元素之和,请改错。#includevoidmain(){inta[3][]={2,4,6,8,10,12,14,16,18};intsum=0,i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)if(i==j)sum=sum+a[i][j];printf("sum=%dn",sum);}错误语句:inta[3][]={2,4,6,8,10,12,14,16,18};正确语句:inta[][3]={2,4,6,8,10,12,14,16,18};2.有3个字符串,要求找出其中最大者,请改错。#include#includevoidmain(){charstring[20];charstr[3][20];inti;for(i=0;i<3;i++)gets(str[i]);if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);elsestrcpy(string,str[1]);if(str[2]>string)string=str[2];printf("nthelargeststringis:n%sn",string);}错误语句:if(str[2]>string)string=str[2];正确语句:if(strcmp(str[2],string)>0)strcpy(string,str[2]);3.以下程序输出一个字符串:China,请改错。#includevoidmain(){charc[5]={"C","h","i","n","a"};inti; for(i=0;i<=5;i++)printf("%c",c[i]);printf("n");}错误语句:for(i=0;i<=5;i++)正确语句:for(i=0;i<5;i++)4.下面程序为数组输入数据并输出结果;判断下面程序的正误,请改错。#includevoidmain(){inta[3]={3*0};inti;for(i=0;i<4;i++)scanf(“%d”,&a[i]);for(i=0;i<4;i++)printf(“%d”,a[i]);}错误语句:inta[3]={3*0};正确语句:inta[4];5.下面程序为数组输入数据并输出结果,判断下面程序的正误,请改错。#includevoidmain(){inta[3]={1,2,3},i;scanf(“%d%d%d”,&a);for(i=0;i<3;i++)printf(“%d”,a[i]);}错误语句:scanf(“%d%d%d”,&a);正确语句:scanf(“%d%d%d”,&a[0],&a[1],&a[2]);或者for(i=0;i<3;i++)scanf(“%d”,&a[i]);四.编程题1.用数组来处理,求解Fibonacci数列前40项:1,1,2,3,5,8,13,21…。#includevoidmain(){inti;intt[40]={1,1};for(i=2;i<40;i++)t[i]=t[i-2]+t[i-1];for(i=0;i<40;i++){if(i%5==0)printf("n");printf("%15d",t[i]);}}2.用选择法对20个整数排序。#includevoidmain(){inti,j,min,t,x[20]; for(i=0;i<20;i++)scanf("%d",&x[i]);for(i=0;i<19;i++){min=i;for(j=i+1;j<20;j++)if(x[min]>x[j])min=j;t=x[i];x[i]=x[min];x[min]=t;}for(i=0;i<20;i++)printf("%6d",x[i]);}3.有一个3×5的矩阵,要求编程序求出其中值最小的那个元素的值,以及其所在的行号和列号。#includevoidmain(){inti,j,s=0,t=0,min;inta[3][5];for(i=0;i<3;i++)for(j=0;j<5;j++)scanf("%d",&a[i][j]);min=a[0][0];for(i=0;i<3;i++)for(j=0;j<5;j++)if(a[i][j]voidmain(){charstr1[80],str2[20];inti=0,j=0;scanf("%s",str1);scanf("%s",str2);printf("str1:%sn",str1);printf("str2:%sn",str2);while(str1[i]!="")i++;/*循环后i为最后一个字符之后*/while(str2[j]!="") {str1[i]=str2[j];i++;j++;}str1[i]="";printf("%sn",str1);}5.求一个5×5矩阵对角线元素之和(左上至右下之对角线)。#includevoidmain(){floata[5][5],sum=0;inti,j;for(i=0;i<5;i++)for(j=0;j<5;j++)scanf("%f",&a[i][j]);for(i=0;i<5;i++)sum=sum+a[i][i];printf("sum=%f",sum);}6.编一程序,求数列的前10项:1,5,14,30…,即f[1]=1;…;f[i]=f[i-1]+i*i。#includevoidmain(){inti;intf[10]={0};for(i=1;i<10;i++)f[i]=f[i-1]+i*i;for(i=1;i<10;i++){if(i%5==0)printf("n");printf("%15d",f[i]);}}第五章函数一、选择题1.阅读下面程序段,则执行后输出的结果是(C)。#include“stdio.h”main(){charfun(char,int);chara=‘A’;intb=13;a=fun(a,b);putchar(a); }charfun(chara,intb){chark;k=a+b;returnk;}A)AB)MC)ND)L1.阅读下面程序段,则执行后的结果是(C)。#include“stdio.h”main(){intm=4,n=2,k;k=fun(m,n);printf(“%dn”,k);}fun(intm,intn){return(m*m*m-n*n*n);}A)64B)8C)56D)03.阅读下面程序段,则执行后的结果是(A)。#include“stdio.h”longfun(intn){if(n>2)return(fun(n-1)+fun(n-2));elsereturn(2);}main(){printf(“%ld﹨n”,fun(5));}A)10B)15C)20D)以上3个答案都不正确4.阅读下面程序段,则执行后的结果是(D)。#include“stdio.h”fun(){staticintx=5;/*只赋一次*/x++;returnx;}main(){inti,x;for(i=0;i<3;i++)x=fun();printf(“%dn”,x);}A)5B)6C)7D)85.阅读下面程序段,则执行后的结果是(D)。#include“stdio.h”intfun(intx){printf(“%dn”,++x);}main(){fun(12+5);}A)12B)13C)17D)186.阅读下面程序段,则执行后的结果是(A)。#include“stdio.h”intaa(intx,inty); main(){inta=24,b=16,c;c=aa(a,b);printf(“%dn”,c);}intaa(intx,inty){intw;while(y){w=x%y;x=y;y=w;}returnx;}A)8B)7C)6D)57.阅读下面程序段,则执行后的结果是(C)。#include“stdio.h”fun(inta){intx=5;x+=a++;print(“%d”,x);}main(){inta=3,x=1;fun(a);x+=a++;printf(“%dn”,x);}A)82B)83C)84D)858.阅读下面程序段,则执行后的结果是(D)。#include“stdio.h”intx=1;main(){intmd=4;fun(md);printf(“%d,%dn”,md,x);}fun(intk){k+=x;x+=k;{charx=’B’;printf(“%d,”,x-‘A’);}printf(“%d,%d,”,k,x);}A)1,6,5,4,6B)1,5,4,6,4C)1,4,6,5,4D)1,5,6,4,69.阅读下面程序段,则执行后的结果是(C)。#include“stdio.h”main(){fun3(fun1(),fun2());}fun2(){inta=15; returna;}fun1(){intk=20;returnk;}fun3(inta,intb){intk;k=(a-b)*(a+b);printf(“%dn”,k);}A)0B)184C)175D)编译不通过10.阅读下面程序段,则执行后的结果是(D)。#include“stdio.h”main(){inta=4,b=6,c=7;doubled,fun(int,int,int);d=fun(a,b,c);printf(“%lfn”,d);}doublefun(inta,intb,intc){doubles;s=a%b*c;returns;}A)27B)27.000000C)28D)28.00000011.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是(D)。a)函数调用可以作为独立的语句存在b)函数调用可以作为一个函数的实参c)函数调用可以出现在表达式中d)函数调用可以作为一个函数的形参12.以下不正确的说法是(D)。a)在不同的函数中可以使用相同名字的变量b)函数中的形参是局部变量c)在一个函数内定义的变量只在本函数范围内有效d)在一个函数内的复合语句中定义的变量只在本函数范围内有效13.以下正确的说法是(C)。a)定义函数时,形参的类型说明可以放在函数体内b)return后面的值不能为表达式c)如果函数值的类型与返回值类型不一致,以函数值类型为准d)如果形参与实参的类型不一致,以实参类型为准14.以下正确的说法是(D)。a)函数可以嵌套定义但不能嵌套调用b)函数既可以嵌套调用也可以嵌套定义c)函数既可以不嵌套调用也不可以嵌套定义d)函数可以嵌套调用但不可以嵌套定义15.C语言规定,函数返回值的类型是由(D)。 a)return语句中的表达式类型所决定的b)调用该函数时的主调函数类型所决定c)调用该函数时系统临时决定d)在定义该函数时所指定的函数类型所决定16.以下不正确的说法是(C,D)。a)c程序中,函数可以直接或间接的调用自己b)函数调用时,函数名必须与所调用的函数名一致c)函数说明语句中的类型必须与函数返回值的类型一致d)实参个数可以与形参个数不一致17.以下不正确的说法是(C)。a)C语言规定,不能在一个函数的内部再定义函数b)在没有声明函数返回值类型的情况下,默认的函数返回值类型为int型c)函数的类型可以是整型,实型,字符型,但不能是指针型d)函数可以没有形参,但函数名后的一对括号不能省略18.在函数调用过程中,如果如果funA调用了函数funB,函数funB又调用了函数funA,则(B)。a)称为函数的直接递归调用b)称为函数的间接递归调用c)称为函数的循环调用d)C语言中不允许这样的递归调用19.言中规定,若对函数类型未加显式说明,函数的隐含类型为(C)。(A)void(B)double(C)int(D)char20.以下叙述正确的是(C)。a)在c程序中,main函数位于程序的最前面b)c程序的每一行只能写一个语句c)c语言本身没有输入输出语句d)在对c程序进行编译的过程中,可以发现注释中的错误二.填空题1.一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。一个源程序是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。2.所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main()函数。main()函数是系统调用的。3.从用户使用的角度看,函数有两种:标准函数、用户定义的函数用以解决用户的专门需要。4.从函数的形式看,函数分两类:无参函数、有参函数。5.在C语言中,实参向形参的数据传递是值传递,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同单元。6.如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。 7.声明的作用是把函数名、函数参数的类型和参数个数等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。8.在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归。9.在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为局部变量。10.形式参数也是局部变量。11.求两个数中较大的一个数。#includevoidmain(){intmax(intx,inty);inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“maxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}12.求两个数中较小的一个数。#includevoidmain(){intmin(intx,inty);inta,b,c;scanf(“%d,%d”,&a,&b);c=min(a,b);printf(“minis%d”,c);}intmin(intx,inty){intz;z=x0)fun(k-1);elsereturn(2)printf(“%d”,k);}main(){intw=5;fun(w);printf(“n”);}错误语句:void(intk)elsereturn(2)正确语句:voidfun(intk)elsereturn(2);4.#include“stdio.h”voidfun(i,j){intx=7;printf(“i=%d;j=%d;x=%dn”,i,j,x);}main(){inti=2,x=5,j=7;fun(j,6);printf(“i=%d;j=%d;x=%dn”,i,j,x);}错误语句:voidfun(i,j)运行结果:i=7;j=6;x=7正确语句:voidfun(inti,intj)i=2;j=7;x=55.#include“stdio.h”inta,b;voidfun() {inta,b;a=100;b=200;}main(){inta=5,b=7;fun(a,b);printf(“%d%dn”,a,b);}错误语句:inta,b;fun(a,b);运行结果:57正确语句:inta,b;fun();6.#include“stdio.h”main(){intm=4,n=2,k;k=fun(m,n,k);printf(“%dn”,k);}fun(intm,intn){return(m*m*m-n*n*n);}错误语句:k=fun(m,n,k);运行结果:56正确语句:k=fun(m,n);7.#include“stdio.h”main(){chara=A;intb=13;a=fun(a,b);putchar(a);}charfun(chara,intb){chark;k=a+b;return(k);}错误语句:chara=A;运行结果:N正确语句:chara=’A’;8.#include“stdio.h”fun(){staticintx=5;x++;(x);}main(){inti,x;for(i=0;i<3;i++) x=fun();printf(“%dn”,x);}错误语句:(x);运行结果:8正确语句:return(x);9.#include“stdio.h”fun(inta){intx=5;x+=a++;printf(“%d”,x);}main(){inta=3,x=1;f(a);x+=a++;printf(“%dn”,x);}错误语句:f(a);运行结果:84正确语句:fun(a);四.编程题1.写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。#includevoidmain(){intprime(int);intn;printf(“请输入一个整数:”);scanf(“%d”,&n);if(prime(n))printf(“n%d是一个素数。n”,n);elseprintf(“n%d不是一个素数。n”,n);}intprime(intn){intflag=1,i;for(i=2;iintfac(intn){intc,i;c=1;if(n>=0){for(i=1;i<=n;i++)c=c*i; }return(c);}voidmain(){ints;s=fac(6)+fac(7)+fac(8);printf(“%d”,s);}运行结果:460803.编一个函数求n个数中最大值.主函数求10个数中最大值.#includeintmaxm(inta[],intn){intm,i;m=a[0];for(i=1;ivoidmain(){voidconvert(intn);intnumber;printf(“请输入一个整数:”);scanf(“%d”,&number);printf(“输出:“);if(number<0){putchar(‘-‘);number=-number;}/*负数时先输出一个‘-’号*/convert(number);putchar(‘n’);}voidconvert(intn){inti;if((i=n/10)!=0)convert(i);putchar(n%10+’0’);}/*一个数+‘0’的ASCII码值为该数的ASCII码值*//*先输出个位,再通过递归输出十位,以此类推*/5.编写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个整数由键盘输入。#include voidmain(){inthcf(int,int);intlcd(int,int,int);intu,v;scanf(“%d,%d”,&u,&v);printf(“最大公约数=%dn”,hcf(u,v));printf(“最小公倍数=%dn”,lcd(u,v,hcf(u,v)));}inthcf(intu,intv){intt,r;if(v>u){t=u;u=v;v=t;}/*让u>v*/while((r=u%v)!=0){v=r;}return(v);}/*大数除小数的余数如果不为0,则将余数赋给v,否则如果大数整除小数时,v中是两个数中小的数。V中的数则为最大公约数。*/intlcd(intu,intv,inth){return(u*v/h);}6.定义一个函数,根据给定的三角形三条边长,函数返回三角形面积。#include“stdio.h”#include“math.h”floatss(inta,intb,intc){floats,p;p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));return(s);}voidmain(){floata,b,c,area;scanf(“%f,%f,%f”,&a,&b,&c);if(a+b>c&&b+c>a&&c+a>b){area=ss(a,b,c);printf(“area=%.2fn”,area);}elseprintf(“它不是一个三角形”);}7.编写一个函数,输入一个4位数字,要求输出这4个数字字符,使每两个数字字符间空一个空格。如输入2008,则应输出“2008”。#include"stdio.h"#include"string.h"voidmain(){charstr[80];voidinsert(charstr[]);printf("inputfourdigits:"); scanf("%s",str);insert(str);printf("%s",str);}voidinsert(charstr[]){inti;for(i=strlen(str);i>0;i--){str[2*i]=str[i];str[2*i-1]="";}}8.编写一个函数,其功能是判断给定的正整数是否是素数,若是素数则返回函数值1,否则返回函数值0。#include"stdio.h"#include"math.h"sushu(intn){intk,i,flag;k=sqrt((double)n);i=2;flag=0;while((i<=k)&&(flag==0)){if(n%i==0)flag=1;i=i+1;}return(!flag);}voidmain(){inta,b;printf("n请输入一个正整数:");scanf("%d",&a);b=sushu(a);if(b)printf("%d是一个素数n",a);elseprintf("%d不是一个素数n",a);}9.有五个人坐在一起,问第五个人多少岁,他说比第四个人大2岁,问第四个人多少岁,他说比第三个人大2岁,问第三个人多少岁,他说比第二个人大2岁,问第二个人多少岁,他说比第一个人大2岁,问第一个人多少岁,他说10岁,问第五个人多少岁?#include"stdio.h"intf(intn){inta;if(n==1)a=10;elsea=f(n-1)+2;return(a);}voidmain(){printf("age=%dn",f(5));} 第六章指针一.选择题1.一个变量的指针就是(B)。A)变量的名称B)变量的地址C)变量的类型D)变量的值2.两个指针变量不能(B)。A)相减B)相加C)比较D)指向同一地址3.在C语言中,对变量的访问方式是(A)。A)能直接访问,能间接访问B)能直接访问,不能间接访问C)不能直接访问,能间接访问D)不能直接访问,不能间接访问4.在C语句:int(*pa)[5];中,pa表示的是一个(C)。A)指针数组的名字B)指向整型变量的指针C)指向包含5个整型元素的一维数组的指针D)指向函数的指针5.在C语句:int*function();中,function表示的是一个(A)。A)返回值为指针的函数名字B)指向整型变量的指针C)指向数组的指针D)指向函数的指针6.有以下程序(假设从键盘输入数据1,2)。#includevoidswap(int*p1,intp2){*p1=*p1+p2;p2=p2+*p1;}voidmain(){inta,b,*pointer1;scanf("%d,%d",&a,&b);pointer1=&a;swap(pointer1,b);printf("a=%d,b=%d",a,b);}程序执行后的输出结果是(D)。A)3,5B)a=3,b=5C)3,2D)a=3,b=27.有以下程序。#includemain(){intarray[]={1,2,3,4,5,6,7};inti,j,*pointer1,*pointer2;pointer1=&array[1];pointer2=&array[5];i=*pointer1**pointer2;j=*(pointer1+2)+*(pointer2+1);printf("%d,%dn",i,j);}程序执行后的输出结果是(C)。A)5,9B)9,5C)12,11D)11,128.有以下程序。#includemain() {staticintarray[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j,sum[3];p=array;for(i=0;i<3;i++){sum[i]=0;for(j=0;j<4;j++)sum[i]=sum[i]+*(*(p+i)+j);printf("%d,",sum[i]);}}程序执行后的输出结果是(A)。A)16,48,80,B)164880C)144D)809.有以下程序。#includevoidfun(intx,inty,int*z){*z=x-y;}voidmain(){inta,b,c;fun(11,5,&a);fun(8,a,&b);fun(a,b,&c);printf("%d,%d,%d",a,b,c);}程序执行后的输出结果是(C)。A)2,4,6B)2,6,4C)6,2,4D)6,4,210.有以下程序。#include#includemain(){chara[]="ABCDEFGHI";char*ch_pointer=&a[9];while(--ch_pointer>=&a[0])putchar(*ch_pointer);}程序执行后的输出结果是(D)。A)ABCDEFGHIB)ABCDEFGHC)HGFEDCBAD)IHGFEDCBA二.填空1.在C语言中,指针++运算的意义是使指针指向下一个数据元素的位置。指针--运算的意义是使指针指向上一个数据元素的位置。在指针变量中具体增加或减少的字节数则是由系统自动根据指针变量的基类型决定。2.单目运算符&后面跟上变量名字来表示该变量的地址。3.在C语言中,对于int*pa[10],表示定义pa是一个指针数组。因为*比[]优先级低,所以pa先要与[]结合成为pa[10]的数组形式,它有10个数组元素;然后再与前面的int*结合来表示数组元素的类型是指向整型变量的指针,就是说,每个数组元素都可以指向一个整型变量。4.在C语言中,对于int(*fun_p)(intx),表示定义fun_p为一个指向函的指针变量 。因为fun_p首先要与*结合成为指针变量;然后再与后面的()结合,表示该指针变量指向函数,该函数的返回值(即函数值)为整型。5.指向函数的指针变量在使用之前必须要先定义,而且也必须进行初始化,使它指向某个函数。指向函数的指针变量定义中的返回值类型和参数表内容应该与该函数的返回值类型和参数表内容保持一致。同时注意,指向函数的指针变量只能指向函数的入口地址,而不能指向函数中间的某一条语句。6.使用指针的方法编写程序,求两个浮点数的和以及差。#includevoidsub_add(floatx,floaty,float*sub,float*add);main(){floata,b;floatsub_result,add_result;printf("pleaseinputdata(a,b):n");scanf("%f,%f",&a,&b);sub_add(a,b,&sub_result,&add_result);printf("a-b=%f,a+b=%fn",sub_result,add_result);}voidsub_add(floatx,floaty,float*sub,float*add)/*差、和的函数定义*/{*sub=x-y;/*两个浮点数的差赋值给指针sub所指向的变量*/*add=x+y;/*两个浮点数的和赋值给指针add所指向的变量*/return;}7.使用指针编写程序,从键盘输入一个字符串,然后统计字符串中字符的个数。#includeintlength(char*p);main(){charstring[30];intl;printf("pleaseinputastring(lessthan30characters):n");scanf("%s",string);l=length(string);printf("thestringlengthis:%dn",l);}intlength(char*p)/*定义函数,统计字符串中字符的个数*/{intlen=0;while(*p!=""){len++;p++;}return(len);}8.使用指针编写程序,按照正反两个顺序打印一个字符串。#includevoidmain(){char*p_string1,*p_string2;p_string1="computerlanguage";/*定义字符指针变量并且指向一个字符串*/ p_string2=p_string1;while(*p_string2!="")/*正序输出字符串*/putchar(*p_string2++);putchar("n");while(--p_string2>=p_string1)/*反序输出字符串*/putchar(*p_string2);putchar("n");}9.使用指向指针的指针的方法,完成对n个整数(例如10个整数)排序后输出。要求从键盘输入n个整数并且把排序单独编写成函数。#includevoidbubble_sort(int**p,intn);voidmain(){inti,n,number[30];int**pp,*pointer[30];printf("pleaseinputintegernumber(lessthan30):n");scanf("%d",&n);for(i=0;i**(p+j+1)){temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;}/*交换整数的地址*/}}10.使用指针数组编写程序,从键盘输入一个星期几(例如7),则程序输出对应星期几的英文名字(Sunday)。#include#includechar*day_name(intn);/*英文星期几函数的原型声明*/voidmain() {intn;char*pointer;printf("pleaseenteranumberofweekn");scanf("%d",&n);pointer=day_name(n);printf("DayNo:%2d-->%sn",n,pointer);}char*day_name(intn)/*英文星期几函数的定义*/{staticchar*english_name[]={"illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};if(n<1||n>7)return(english_name[0]);elsereturn(english_name[n]);}三.程序改错1.有一个班级有n个学生,开设m门课程。使用指针的方法编写程序,查找有课程不及格的学生,并且打印他们的成绩。#include#defineN4#defineM5voidsearch_fail(int(*p)[M]);/*函数的原型声明*/voidmain()/*主函数*/{inti,j;intscore[N][M];printf("pleaseinputdata(splitby""):n");for(i=0;i#defineN10intmax,min;/*全局变量*/voidmax_min_value(intarray[],intn);main(){inti,number[N];printf("pleaseenterintegernumbers(splitby","):n");for(i=0;imax)max=*p;/*为全局变量max赋值*/elseif(*pmain(){charstring[30],*pointer;printf("pleaseinputastring(lessthan30characters):n");scanf("%s",&string);pointer=string;while(*pointer!="")pointer++;printf("thestringlengthis:%dn",pointer-string);}错误语句:scanf("%s",&string);正确语句:scanf("%s",string);4.使用指针编写程序,在输入的字符串中查找是否存在字符‘x’。#includemain(){charstring[30],*p;inti;p=string;printf("pleaseinputastring(lessthan30characters):n"); scanf("%s",p);for(i=0;p[i]!="";i++)/*p[i]等价与*(p+i)*/if(p[i]=="x"){printf("thereisa"characterx"inthestringn");break;}if(p[i]!="")printf("Thereisno"characterx"inthestringn");}错误语句:if(p[i]!="")正确语句:if(p[i]="")5.使用指针数组编写程序,从键盘输入一个星期几(例如7),则程序输出对应星期几的英文名字(Sunday)。#include#includevoidmain(){intn;char*day_name[]={"illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};while(1)/*无限循环,由break语句退出*/{printf("pleaseenteranumberofweekn");scanf("%d",&n);if(n<1&&n>7){printf("DayNo:%2d-->%sn",n,day_name[0]);break;}printf("DayNo:%2d-->%sn",n,day_name[n]);}}错误语句:if(n<1&&n>7)正确语句:if(n<1||n>7)四.编程1.从键盘输入3个整数,按照从小到大的顺序输出。使用指针的方法并且用3种不同方式实现。#includemain(){inta,b,c;int*pointer_1,*pointer_2,*pointer_3,*p;printf("pleaseinputdata(a,b,c):n");scanf("%d,%d,%d",&a,&b,&c);pointer_1=&a;pointer_2=&b;pointer_3=&c;if(a>b){p=pointer_1;pointer_1=pointer_2;pointer_2=p;}/*指针交换*/if(a>c){p=pointer_1;pointer_1=pointer_3;pointer_3=p;}/*指针交换*/if(b>c){p=pointer_2;pointer_2=pointer_3;pointer_3=p;}/*指针交换*/printf("a=%d,b=%d,c=%dn",a,b,c);/*a、b、c之间未交换*/printf("Thesortedresultis:%d,%d,%dn",*pointer_1,*pointer_2,*pointer_3);}2.将数组中n个整数按相反的顺序存放后输出。使用指针的方法并用2种不同方式实现。 #include#defineN10voidinverted(int*x,intn);main(){inti,array[N];printf("pleaseinputdata(splitby","):n");for(i=0;icharswap(char*p1,char*p2);voidmain(){charstring1[30],string2[30],string3[30];printf("pleaseinputdata(string1,string2,string3):n");scanf("%s",string1);scanf("%s",string2);scanf("%s",string3);if(strcmp(string1,string2)>0)swap(string1,string2);/*若string1>string2,则交换*/if(strcmp(string1,string3)>0)swap(string1,string3);/*若string1>string3,则交换*/if(strcmp(string2,string3)>0)swap(string2,string3);/*若string2>string3,则交换*/printf("Thesortedresultis:n");/*输出排序后的结果*/printf("%sn",string1);printf("%sn",string2);printf("%sn",string3);}charswap(char*p1,char*p2)/*交换字符串的函数,采用传地址的方法传递函数参数*/{char*p[30];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}4.使用指针编写程序,完成字符串的复制。要求不能使用strcpy函数。 #includevoidcopy_string(char*to,char*from);voidmain(){char*a="oneworld,onedream.";char*b="oneworld,oneeconomic.";printf("stringa=%snstringb=%sn",a,b);printf("copystringatostringb:n");copy_string(b,a);printf("stringa=%snstringb=%sn",a,b);}voidcopy_string(char*to,char*from)/*形参from指向源字符串,to指向目标字符串*/{inti=0;for(;*from!="";from++,to++)*to=*from;*to="";}本题执行过程中断异常5.使用指向一维数组的指针的方法,完成从键盘输入n个字符串(例如10个国家名)并按字典顺序排列后输出。#include"string.h"#defineN10voidselect_sort(char(*name)[80],intn);voidprint(char(*name)[80],intn);voidinput(char(*name)[80],intn);main(){charcountry_name[N][80];input(country_name,N);/*输入字符串*/select_sort(country_name,N);/*排序字符串*/print(country_name,N);/*输出排序后的字符串*/}voidinput(char(*name)[80],intn)/*char(*name)[80]等价于charname[][80]*/{inti;printf("pleaseinputcountryname(splitbyenter):n");for(i=0;i0)k=j;if(k!=i){strcpy(temp,name[i]);strcpy(name[i],name[k]);strcpy(name[k],temp);}}} voidprint(char(*name)[80],intn)/*char(*name)[80]等价于charname[][80]*/{inti;printf("thesortresultis:n");for(i=0;i#defineN5voidmove(int*p);voidmax_value(intarray[][N],intn);voidmain(){inta[N][N],*pointer,i,j;printf("pleaseinputdata:n");for(i=0;imax){max=array[i][j];row=i;column=j;}printf("nmax=%d,itisat%drow%dcolumnn",max,row,column);}7.使用指向指针的指针的方法,完成对n个字符串(例如10个城市名)进行排序并输出。要求从键盘输入n个字符串并且把排序单独编写成函数(用冒泡法和选择法2种方式排序)。 方法1:冒泡法排序。#include#includevoidbubble_sort(char**p,intn);voidmain(){inti,n;char**pp,*p_str[20],string[20][30];/*字符串的最大长度为30*/printf("pleaseinputstringnumber(lessthan20):n");scanf("%d",&n);for(i=0;i0){temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;}/*交换字符串的地址*/}}方法2:选择法排序1。#include#includevoidselect_sort(char**p,intn);voidmain(){inti,n;char**pp,*p_str[20],string[20][30];/*字符串的最大长度为30*/printf("pleaseinputstringnumber(lessthan20):n");scanf("%d",&n);for(i=0;i0)k=j;/*小值的下标*/if(k!=i){temp=*(p+i);*(p+i)=*(p+k);*(p+k)=temp;}/*交换字符串的地址*/}}8.使用指针并利用矩形法编写计算定积分的通用函数。然后利用它分别计算以下三种数学函数的定积分:(1)f(x)=x2-5x+1(2)f(x)=x3+2x2-2x+3(3)f(x)=x/(2+x2)#include#include/*调用数学函数库*/doubleintegral(doubles,doublet,intm,double(*p)(doublex));/*函数的原型声明*/doublefunction1(doublex);/*函数的原型声明*/doublefunction2(doublex);/*函数的原型声明*/doublefunction3(doublex);/*函数的原型声明*//*主函数*/voidmain(void){intn,select;doublea,b,value=0.0;printf("pleaseinputthecountrange(fromatob)andthenumberofsections(n).n");scanf("%lf,%lf,%d",&a,&b,&n);printf("pleaseenteryourchoice:"1"forfunction1,"2"forfunction2,"3"forfunction3n");scanf("%d",&select);if(select==1)value=integral(a,b,n,function1);/*调用integral函数*/elseif(select==2)value=integral(a,b,n,function2);/*调用integral函数*/elsevalue=integral(a,b,n,function3);/*调用integral函数*/printf("value=%fn",value);}/*integral函数的定义*/doubleintegral(doubles,doublet,intm,double(*p)(doublex)){inti;doublex,h,area,f;f=0.0;h=(t-s)/m;x=s;for(i=1;i<=m;i++){x=x+h; area=(*p)(x)*h;/*用指向函数的指针p调用函数*/f=f+area;}return(f);}/*function1函数的定义*/doublefunction1(doublex){doublefx;fx=x*x-5.0*x+1.0;return(fx);}/*function2函数的定义*/doublefunction2(doublex){doublefx;fx=x*x*x+2*x*x-2*x+3.0;return(fx);}/*function3函数的定义*/doublefunction3(doublex){doublefx;fx=x/(2.0+x*x);return(fx);}结果为0?第七章结构体与共用体一.选择题1.有以下程序#includestructSTU{intnum;floattotalscore;};voidfun(structSTUp){structSTUs[2]={{20044,550},{20045,537}};p.num=s[1].num;p.totalscore=s[1].totalscore;}main(){structSTUs[2]={{20041,703},{20042,580}};fun(s[0]);printf("%d%3.0fn",s[0].num,s[0].totalscore);}程序运行后的输出结果是(D)。(A)20045537(B)20044550(C)20042580(D)200417032.已知职工记录描述为:structworkers{intnum; charname[20];charsex;struct{intday;intmonth;intyear;}birth;}structworkersw;设变量w中的“生日”是“1991年8月11日”,下列对“生日”的正确赋值方式是(C)。(A)day=11;(B)w.day=11;Month=8;w.month=8;Year=1991;w.year=1991;(C)w.birth.day=11;(D)birth.day=11;w.birth.month=8;birth.month=8;w.birth.year=1991;birth.year=1991;3.设有以下定义:typedefunion{longi;intk[5];charc;}DATE;structdate{intcat;DATEcow;doubledog;}too;DATEmax;则下列语句的结果是(B)。printf(“%d”,sizeof(structdate)+sizeof(max));(A)25(B)52(C)18(D)84.设有如下定义structss{charname[10];intage;charsex;}std[3],*p=std;下面各输入语句中错误的是(B)。(A)scanf("%d",&(*p).age);(B)scanf("%s",&std.name);(C)scanf("%c",&std[0].sex);(D)scanf("%c",&(p->sex));5.有以下程序structSTU{charname[10];intnum;floatTotalScore;};voidfun(structSTU*p){structSTUs[2]={{"SunDan",20044,550},{"Penghua",20045,537}},*q=s;++p;++q;*p=*q;}main(){structSTUs[3]={{"YangSan",20041,703},{"LiSiGuo",20042,580}};fun(s);printf("%s%d%3.0fn",s[1].name,s[1].num,s[1].TotalScore);}程序运行后的输出结果是(B)。(A)SunDan20044550(B)Penghua20045537 (C)LiSiGuo20042580(D)SunDan200417036.设有如下定义:structsk{inta;floatb;}data,*p;若有p=&data;,则对data中的a域的正确引用是(B)。(A)(*p).data.a(B)(*p).a(C)p->data.a(D)p.data.a7.设有以下说明语句:typedefstruct{intn;charch[8];}PER;则下面叙述中正确的是(B)。(A)PER是结构体变量名(B)PER是结构体类型名(C)typedefstruct是结构体类型(D)struct是结构体类型名8.以下对枚举类型名的定义中正确的是(A,B)。(A)enuma{sun,mon,tue};(B)enuma={sun=9,mon=-1,tue};(C)enuma{“sun”,”mon”,”tue”};(D)enuma{‘sun’,’mon’,’tue’};9.当定义一个结构体变量时,系统分配给它的内存是(A)。(A)各成员所需内存量的总和(B)成员中占内存量最大者所需的容量(C)结构中第一个成员所需内存量(D)结构中最后一个成员所需内存量10.当定义一个共用体变量时,系统分配给它的内存是(B)。(A)各成员所需内存量的总和(B)成员中占内存量最大者所需的容量(C)结构中第一个成员所需内存量(D)结构中最后一个成员所需内存量11.若有以下说明和定义uniondt{inta;charb;doublec;}data;以下叙述中错误的是(C)(A)data的每个成员起始地址都相同(B)变量data所占的内存字节数与成员c所占字节数相等(C)程序段:data.a=5;printf("%fn",data.c);输出结果为5.000000(D)data可以作为函数的实参12.下面对typedef的叙述中不正确的是(C)。(A)用typedef可以定义各种类型名,但不能用来定义变量(B)用typedef只是将已存在的类型用一个新的标识符来代表(C)用typedef可以增加新类型(D)使用typedef有利于程序的通用和移植13.设有如下说明typedefstruct{intn;charc;doublex;}STD;则以下选项中,能正确定义结构体数组并赋初值的语句是(A,C)。(A)STDtt[2]={{1,"A",62},{2,"B",75}};(B)STDtt[2]={1,"A",62,2,"",75}; (C)structtt[2]={{1,"A"},{2,"B"}};(D)structtt[2]={{1,"A",62.5},{2,"B",75.0}};14.有以下程序main(){union{unsignedintn;unsignedcharc;}ul;ul.c="A";printf("%cn",ul.n);}执行后输出结果是(C)。(A)产生语法错(B)随机值(C)A(D)6515.若要说明一个类型名STP,使得定义语句STPs;等价于char*s;,以下选项中正确的是(D)A)typedefSTPchar*s;B)typedef*charSTP;C)typedefSTP*char;D)typedefchar*STP;二.填空题1.若有以下的说明和语句,已知int类型占4个字节,则以下的输出结果为__22____。main(){structst{chara[10];intb;doublec;};printf(“%dn”,sizeof(structst));}2.若有如下结构体说明;请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。structSTRU{inta,b;charc;doubled:structSTRUp1,p2;};_structstru___t[20];3.若有以下的说明、定义和语句,则输出结果为__随机值__(已知字母A的十进制数为65).(说明:int为2B时,输出结果为24897(0110000101000001是aA的存储形式)int为4B时,由于高两位为随机值,所以最后的输出结果为随机值)main(){unionun{shortinta;charc[2];}w;w.c[0]=’A’;w.c[1]=’a’;printf(“%dn”,w.a);}4.下面程序的运行结果是:_80_。typedefunionstudent{charname[10]; longsno;charsex;floatscore[4];}STU;main(){STUa[5];printf(“%dn”,sizeof(a));}5.以下程序输出结果是13。(低字节在低位,高字节在高位)#include“stdio.h”unionpw{inti;charch[2];}a;main(){a.ch[0]=13;a.ch[1]=0;printf(“%dn”,a.i);}6.设有一个3个结点的单链表,请完成以下输出结点数据的函数:voidoutput_list(structperson*head){structperson*h;h=head;while(h!=NULL){printf("%d,%sn",h->num,h->name);h=h->next;}}7.结构数组中存有三个联系人的姓名和年龄,以下程序输出三个联系人中年龄最大的联系人的姓名和年龄。请在__________内填入正确内容。structcontact{charname[30];intage;}PER[3]={{"liming",18},{"wang-hua",19},{"zhang-ping",20}};main(){structcontact*p,*q;intold=0;p=PER;for(;_page){q=p;old=p->age}printf("%s,%d",q->name,q->age);} 8.完成以下程序将链表的结点链接起来:structNODE{intnum;structNODE*next;};main(){structNODEs[3]={{1,""},{2,""},{3,""}},*p,*q,*r;intsum=0;s[0].next=s+1;s[1].next=s+2;s[2].next=s;p=s;q=p->next;r=q->next;sum+=q->next->num;sum+=r->next->next->num;printf("%dn",sum);}9.已有定义:double*p;,请写出完整的语句,利用malloc函数使p指向一个双精度型的动态存储单元(double*)malloc(sizeof(double))。10.以下程序段用于构成一个简单的单向链表,请填空。structSTRU{intx,y;floatrate;structSTRU*p;}a,b;a.x=0;a.y=0;a.rate=0;a.p=&b;b.x=0;b.y=0;b.rate=0;b.p=NULL;三.改错题1.输出结构体成员的程序:#includemain(){structperson{longnum;charname[30];intage;charsex;charaddress[200];};structm1,m2;m1.num=1;strcpy(m1.name,"ZhaoJun");printf("inputageandsexn");scanf("%d%d",&m1.age,&m1.sex);m2=m1;printf("Number=%ldnName=%sn"m2.num,m2.name);printf("age=%dnsex=%cn",m2.age,m2.sex);}错误语句:structm1,m2; 正确语句:structpersonm1,m2;2.下面程序有一处错误,请更正:structjam{inta;int*b;}m[4],*p;main(){intn=1;printf("n");for(i=0;i<4;i++){m[i].a=n;m[i].b=m[i].a;n=n+2;}p=&m[0];p++;printf("%d,%dn",(++p)->a,(p++)->a);}错误语句:m[i].b=m[i].a;正确语句:m[i].b=&m[i].a;3.用链表输出“13431”的程序:structNODE{intk;structNODE*link;};main(){structNODEm[5],*p=m,*q=m+4;inti=0;while(p!=q){p->k=++i;p++;q->k=i++;q++;}q->k=i;for(i=0;i<5;i++)printf("%d",m[i].k);printf("n");错误语句:q++;正确语句:q--;4.统计学生成绩的程序:structSTU{charnum[10];floatscore[3];};main(){structstus[3]={{“20021”,90,95,85},{“20022”,95,80,75},{“20023”,100,95,90}},*p=s; inti;floatsum=0;for(i=0;i<3,i++)sum=sum+p.score[i];printf(“%6.2fn”,sum);}错误语句:sum=sum+p.score[i];正确语句:sum=sum+p->score[i];5.输出链表结点数据的函数:structperson{intnum;charname[30];structperson*next;};voidoutput_list(structperson*head){structperson*h;h=head;if(h==NULL)printf("thelistisemptyn");while(h!=NULL){printf("%d,%sn",h->num,h->name);h=head->next;}}错误语句:h=head->next;正确语句:h=h->next;四.编程题1.定义一个自行车结构体,其成员项包括编号、颜色、型号(24.26.28等);建立一个自行车结构体数组并初始化赋值,然后将结构体数组元素打印输出。#includestructbicycle{longnum;charcolor;inttype;};voidmain(){staticstructbicyclebye[5]={{2000,"B",22},{2001,"R",28,},{2002,"G",30,},{3001,"W",26,},{3002,"W",24}};inti;printf("numbercolortypen");printf("__________________________________n"); for(i=0;i<=4;i++)printf("%-10ld%-6c%-4dn",bye[i].num,bye[i].color,bye[i].type);}1.编写一个处理存储运动员的个人记录的程序,要求:定义一个名叫player的结构体,用于存储运动员的个人记录,其中的数据项有三个项目:运动员姓名“name”运动队名“team”平均运动成绩“avg”。●编写一个名为input_player的函数,输入运动员的记录,要求以结构体作为参数。●编写一个名为input_player的函数,输入运动员的记录,要求以结构体指针作为参数。#includestructplayer{charname[30];charteam[30];longavg;};voidinput_player_1(structplayer*p){printf("pleaseinputnamen");scanf("%s",p->name);printf("pleaseinputteamn");scanf("%s",p->team);printf("pleaseinputavgn");scanf("%ld",&p->avg);}voidinput_player_2(structplayerp){printf("pleaseinputnamen");scanf("%s",p.name);printf("pleaseinputteamn");scanf("%s",p.team);printf("pleaseinputavgn");scanf("%ld",&p.avg);}voidmain(){structplayercur;structplayerpp;input_player_1(&cur);input_player_2(pp);} 3.编写一个程序,从键盘上输入3个学生的编号、姓名、年龄、家庭住址,并存放在一个结构数组中,从中查找出年龄最小和年龄最大的学生的信息。#includestructSTU{intnum;charname[10];intage;charaddress[100];};structSTU*MaxAgeStudent(structSTUs[],intn)//查找年龄最大的学生{inti,pos=0;for(i=0;is[i].age)pos=i;return&s[pos];}voidPrintStudent(structSTUs){printf("%d,%s,%d,%sn",s.num,s.name,s.age,s.address);}main(){structSTUstud[3];structSTU*p;inti;for(i=0;i<3;i++)//输入3个记录{printf("pleaseinputnumn");scanf("%d",&stud[i].num);printf("pleaseinputnamen");scanf("%s",stud[i].name);printf("pleaseinputagen");scanf("%d",&stud[i].age);printf("pleaseinputaddressn");scanf("%s",stud[i].address);}p=MaxAgeStudent(stud,3);PrintStudent(*p);p=MinAgeStudent(stud,3); PrintStudent(*p);}4.定义一个结构体变量,其成员项包括员工号、姓名、工资;然后通过键盘输入所需的具体数据,再进行打印输出。#include#defineNUM3structemployee{intnum;charname[30];intgl;//工龄floatsalary;//工资};voidPrintEmployee(structemployees){printf("%d,%s,%d,%8.2fn",s.num,s.name,s.gl,s.salary);}main(){inti;structemployeeemp[NUM];//定义NUM元素结构体数组for(i=0;i#defineNUM3structemployee{ intnum;charname[30];intgl;//工龄floatsalary;//工资};voidPrintEmployee(structemployees){printf("%d,%s,%d,%8.2fn",s.num,s.name,s.gl,s.salary);}main(){inti;floattotal=0;//统计总工资变量floatavg=0;//平均工资变量structemployeeemp[NUM];//定义NUM元素结构体数组for(i=0;istructperson{charname[30];intcount;}leader[3]={{"ZhaoHong",0},{"ZhangJun",0},{"LiuQiang",0}};voidmain(){inti,j;charleader_name[3][50]; for(i=0;i<=2;i++){printf("pleaseinputZhaoHongorZhangJunorLiuQiangn");scanf("%s",leader_name[i]);for(j=0;j<3;j++){if(strcmp(leader_name[i],leader[j].name)==0)leader[j].count++;}}for(i=0;i<3;i++)printf("%s:%dn",leader[i].name,leader[i].count);}7.设有3名考生,每个考生的数据包括学号、姓名、性别和成绩。编一程序,要求用指针方法找出女性考生中成绩最好的并输出。structSTU{intnum;charname[10];charsex;floatscore;};structSTU*BestStudent(structSTUs[],intn){inti,pos=0;for(i=0;istructemployee{charname[30];floatsalary;floatwg;floatkk;}YG[4]={{"liqun",870.0,500.0,85.0},{"majing",1250,800,63},{"dongfang",1520,1000,72},{"liudong",2050,1500,120}};main(){inti;floatyfgz=0;for(i=0;i<=3;i++){yfgz=0;yfgz=YG[i].salary+YG[i].wg-YG[i].kk;printf("%s"ssalaryis%8.2fn",YG[i].name,yfgz);}}9.从键盘输入10个整数分别作为链表的数据域建立一个单链表,并编写一个删除结点的函数。#include#includestructNODE/*链表结点结构类型定义*/{intnum;structNODE*next;};structNODE*createlist(intn){structNODE*head,*cur,*tail;/*head为头结点;cur为新建的结点;tail为尾结点*/inti;for(i=0;inum);if(i==0)tail=head=cur;/*第一个节点*/elsetail->next=cur;/*建立中间结点*/cur->next=NULL; tail=cur;}return(head);/*函数返回新建链表的头结点*/}structNODE*delete_node(structNODE*head,longnum){structNODE*cur;/*指向要删除的结点*/structNODE*m1;/*指向cur的前一个结点*/if(head==NULL)/*空表*/{printf("nListisemptyn");return(head);}cur=head;while(num!=cur->num&&cur->next!=NULL)/*查找要删除的结点*/{m1=cur;cur=cur->next;}if(num==cur->num)/*找到了*/{if(cur==head)/*要删除的是头结点*/head=cur->next;else/*要删除的不是头结点*/m1->next=cur->next;free(cur);/*释放被删除结点所占的内存空间*/printf("deletelistnodewhosenumis:%ldn",num);}else/*在表中未找到要删除的结点*/printf("nodenotfoundn");return(head);/*返回删除结点后新的表头*/}voidoutput_list(structNODE*head){structNODE*h;h=head;if(h==NULL)printf("thelistisemptyn");while(h!=NULL){printf("%dn",h->num);h=h->next;}}main() {structNODE*head;/*链表的头结点*/head=createlist(10);/*创建10个节点的链表*/output_list(head);}10.试写出统计通讯录链表中结点的个数的程序。#include#includestructperson/*链表结点结构类型定义*/{intnum;charname[30];structperson*next;};structperson*createlist(intn){structperson*head,*cur,*tail;/*head为头结点;cur为新建的结点;tail为尾结点*/inti;for(i=0;inum,cur->name);if(i==0)tail=head=cur;/*第一个节点*/elsetail->next=cur;/*建立中间结点*/cur->next=NULL;tail=cur;}return(head);/*函数返回新建链表的头结点*/}intcount_node(structperson*head){intc=0;structperson*h;h=head; if(h==NULL)printf("thelistisemptyn");while(h!=NULL){c=c+1;h=h->next;}return(c);/*返回节点个数*/}voidoutput_list(structperson*head){structperson*h;h=head;if(h==NULL)printf("thelistisemptyn");while(h!=NULL){printf("%d,%sn",h->num,h->name);h=h->next;}}main(){intc=0;structperson*head;/*链表的头结点*/head=createlist(3);/*创建3个节点的链表*/c=count_node(head);printf("listhas%dnodesn",c);}第八章文件一.单选题1.下列关于c语言数据文件的叙述中正确的是(D)。A)文件由ASCI码字符序列组成,c语言只能读写文本文件B)文件由二进制数据序列组成,c语言只能读写二进制文件C)文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件D)文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件2.为写而打开二进制文件wr.dat的正确写法是(C) A)fopen(“wr.dat”,”rb”)B)fp=fopen(“wr.dat”,”r”)C)fopen(“wr.dat”,”wb”)D)fp=fopen(“wr.dat”,”w”)3.已知函数的调用形式:fread(buf,size,count,fp),参数buf的含义是(C)。A)一个整型变量,代表要读入的数据总数B)一个文件指针,指向要读的文件C)一个指针,指向要读入数据的存放地址D)一个存储区,存放要读的数据项4.若fp是指向某文件的指针,且读取文件时已读到文件末尾,则库函数feof(fp)的返回值是(A)。A)1B)NULLC)0D)EOF5.标准库函数fgets(buf,n,fp)的功能是(D)。A)从fp所指向的文件中读取长度为n的字符串存入缓冲区bufB)从fp所指向的文件中读取长度不超过n-1的字符串存入缓冲区bufC)从fp所指向的文件中读取n个字符串存入缓冲区bufD)从fp所指向的文件中读取长度为n-1的字符串存入缓冲区buf6.函数rewind的作用是(B)。A)将文件位置指针指向文件中所要求的特定位置B)使文件位置指针重新返回文件的开始位置C)使文件位置指针指向文件的末尾D)使文件位置指针自动移至下一个字符位置7.函数调用语句fseek(fp,5L,0);的含义是(B)。A)将读写位置指针从文件末尾处向文件开始处移动5个字节B)将读写位置指针从文件开始处向文件末尾处移动5个字节C)将读写位置指针从当前位置向文件开始处移动5个字节D)将读写位置指针从当前位置向文件末尾处移动5个字节8.阅读下面的程序,程序实现的功能是(C)。#include#includevoidmain(){FILE*fp;chara[10],*p=a;fp=fopen("str.txt","w");while(strlen(gets(p))>0){fputs(a,fp);fputs("n",fp);}fclose(fp);}A)从键盘输入若干行字符,按行号倒序写入文本文件str.txt中B)从键盘输入若干行字符,取前2行写入文本文件str.txt中C)从键盘输入若干行字符,依次写入文本文件str.txt中D)从键盘输入若干行字符,第一行写入文本文件str.txt中9.表达式~a>b&&c^d的运算顺序是(D)。A)~,^,>,&&B)~,&&,^,>C)~,>,^,&&D)~,^,&&,> 10.整型变量x和y的值相等、且为非0值,则以下选项中,结果为零的表达式是(B)。A)x|yB)x^yC)x&yD)x||y11.以下程序的功能是进行位运算main(){unsignedchara,b;a=7^3;b=~4&3;printf("%d%dn",a,b);}程序运行后的输出结果是(A)。A)43B)73C)70D)4012.有以下程序main(){intc=35;printf("%dn",c&c);}程序运行后的输出结果是(C)。A)0B)70C)35D)1二.填空题1.按数据的组织形式文件分为ASCII文件,二进制文件。2.按文件的处理方法文件分为缓冲文件系统,非缓冲文件系统。3.下面程序将已经存在的文件file1打开,先显示在屏幕上,再将其复制到file2文件中,请填空。#include#includevoidmain(){FILE*fp1,*fp2;fp1=fopen("file1","r");fp2=fopen("file2","w");while(!feof(fp1))putchar(fgetc(fp1));rewind(fp1);fputc(fgetc(fp1),fp2);while(!feof(fp1))fclose(fp1);fclose(fp2);}4.下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为file.dat的新文件中,请填空。#include#includevoidmain(){FILE*fp;charch;if((fp=fopen("file.dat","w"))==NULL)exit(0);while((ch=getchar())!="@")fputc(ch,fp);fclose(fp);} 5.以下程序将数组a的4个元素和数组b的6个元素写到名为abc.txt二进制文件中,请填空。#include#includevoidmain(){FILE*fp;chara[]="1234",b[]="abcdef";if((fp=fopen("abc.dat","wb"))==NULL)exit(0);fwrite(a,sizeof(char),4,fp);fwrite(b,6*sizeof(char),1,fp);fclose(fp);}6.下面的程序执行后,文件test中的内容是apple。#include#includevoidfun(char*fname,char*st){FILE*myf;inti;myf=fopen(fname,"w");for(i=0;i#includevoidmain(){FILE*fpIn,*fpOut;charch;fpIn=fopen("da.txt","r");fpOut=fopen("db.txt","w");if(fpIn==NULL) {printf("无法打开数据源文件!n");exit(0);}if(fpOut==NULL){printf("无法打开转换文件!n");exit(0);}while(!feof(fpIn)){ch=fgetc(fpIn);ch=ch+32;fputc(ch,fpOut);}fclose(fpIn);fclose(fpOut);}2.从键盘输入5种商品的信息,包括商品名称、单价、数量和产地,把它们转存到磁盘文件中。#include#includestructgoods{charname[10];floatprice;intvolume;charadd[10];};voidmain(){FILE*fp;structgoodsgds[5];inti;if((fp=fopen("goods.txt","wb"))==NULL){printf("无法打开文件!n");exit(0);}printf("请输入商品信息:n");for(i=0;i<5;i++){scanf("%s%d%d%s",gds[i].name,&gds[i].price,&gds[i].volume,gds[i].add);}for(i=0;i<5;i++){fwrite(&gds[i],sizeof(structgoods),1,fp);}fclose(fp);}3.输入10个学生的数据,存入文件std.txt中。 #include#includestructstu{charname[10];intnum;intage;};voidmain(){FILE*fp;structstust[10];inti;if((fp=fopen("std.txt","wb"))==NULL){printf("无法打开文件!n");exit(0);}printf("请输入学生信息:n");for(i=0;i<10;i++){scanf("%s%d%d",st[i].name,&st[i].num,&st[i].age);}fwrite(st,sizeof(structstu),10,fp);fclose(fp);}4.打开上题中的文件std.txt,添加两个同学的数据,再将第2,4,6,8,10,12个学生数据输出到显示器上。#include#includestructstu{charname[10];intnum;intage;};voidmain(){FILE*fp;structstust[12];inti;if((fp=fopen("std.txt","ab+"))==NULL){printf("无法打开文件!n");exit(0);}printf("请添加学生信息:n");for(i=0;i<2;i++) {scanf("%s%d%d",st[i].name,&st[i].num,&st[i].age);}fwrite(st,sizeof(structstu),2,fp);rewind(fp);fread(st,sizeof(structstu),12,fp);printf("nnametnumbertagen");for(i=1;i<12;i+=2){printf("%st%dt%dn",st[i].name,st[i].num,st[i].age);}fclose(fp);}5.从键盘上输入1个正整数给int变量num,输出由8~11位构成的数(从低位、0号开始编号)。#includevoidmain(){intnum,mask;printf("Inputaintegernumber:");scanf("%d",&num);num>>=8;/*右移8位,将8~11位移到低4位上*/mask=~(~0<<4);/*间接构造1个低4位为1、其余各位为0的整数*/printf("result=0x%xn",num&mask);}结果总为0?6.实现16进制数的循环左移输出,每次移动一位,直至回到原值。如将16进制数5678进行循环左移输出则结果为6785、7856、8567、5678。#includevoidmain(){introtate(intx,inti);inti;shortintx=0x5678;printf("resultn");for(i=0;i<=4;i++)printf("%15d%xn",i,rotate(x,i));}introtate(intvalue,intn){intbits;shortintresult;result=0;bits=value>>(16-n*4);result=value<<(n*4)|bits;return(result);} 3时结果:ffff8567'