第一篇:大学C语言课本课后习题相应答案及详细解答
5-1
#include“stdio.h” void main(){ char c1,c2;printf(“c1:”);c1=getchar();if(c1>='a'&&c1<='z')c2=c1-32;else if(c1>='A'&&c1<='Z')c2=c1+32;else c2=c1;printf(“=>%cn”,c2);}
5-2 #include“stdio.h” void main(){ char c;printf(“c:”);c=getchar();if(c>='A'&&c<='Z')
if(c=='A')printf(“没有前面的字母!”);
else if(c=='Z')printf(“没有后面的字母!”);
else printf(“前面的字母=%c,后面的字母=%c”,c-1,c+1);printf(“n”);}
5-3 #include“stdio.h” void main(){ int s;char g;printf(“s:”);scanf(“%d”,&s);if(s>=0&&s<=100){
switch(s/10){
case 9:
case 10: g='A';break;
case 8: g='B';break;
case 7: g='C';break;
case 6: g='D';break;
default: g='E';
}
printf(“g=%cn”,g);} else printf(“成绩不在百分制范围内!n”);} 5-4 #include“stdio.h” void main(){ int y,m,d,dok;int yy,mm,dd;printf(“y,m,d:”);scanf(“%d,%d,%d”,&y,&m,&d);
switch(m){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(d>0&&d<=31)dok=4;
else dok=0;
break;
case 4: case 6: case 9: case 11:
if(d>0&&d<=30)dok=3;
else dok=0;
break;
case 2: if(y%4==0&&y%100!=0||y%400==0)
if(d>0&&d<=29)dok=2;
else dok=0;
else
if(d>0&&d<=28)dok=1;
else dok=0;
break;
default: dok=0;
}
if(dok==0)printf(“月份或日期不对!n”);
else{
switch(dok){
case 1: if(d==28){yy=y;dd=1;mm=m+1;}
else{yy=y;dd=d+1;mm=m;}
break;
case 2:if(d==29){yy=y;dd=1;mm=m+1;}
else{yy=y;dd=d+1;mm=m;}
break;
case
3:if(d==30){yy=y;dd=1;mm=m+1;}
else{yy=y;dd=d+1;mm=m;}
break;
case 4:if(d==31)
if(m==12){yy=y+1;dd=1;mm=1;}
else {yy=y;dd=1;mm=m+1;}
else{yy=y;dd=d+1;mm=m;}
break;
}
printf(“Tomorrow:%d年%d月%d日n”,yy,mm,dd);
} }
5-5
#include“stdio.h” void main(){ int a,b,c,t;printf(“a,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c);if(a+b>c&&b+c>a&&a+c>b){
if(a>b){t=a;a=b;b=t;}
if(a>c){t=a;a=c;c=t;}
if(b>c){t=b;b=c;c=t;}
if(a==b&&b==c)printf(“等边三角形.”);
else if(a==b||b==c||a==c)printf(“等腰角形.”);
else if(c*c==a*a+b*b)printf(“直角三角形.”);
else printf(“任意三角形.”);
printf(“n”);} else printf(“不能构成三角形!n”);} 6-1 #include“stdio.h” void main(){ int a,b,m,n,k;printf(“m,n:”);scanf(“%d,%d”,&m,&n);
a=m;b=n;k=a%b;while(k){
a=b;
b=k;
k=a%b;} printf(“%dn”,(m*n/b));}
6-2 #include“stdio.h” void main(){ int n;int i,j,s;printf(“n=”);scanf(“%d”,&n);for(i=1;i<=n;i++){
s=0;
for(j=1;j
if(i%j==0)s=s+j;
if(s==i){
printf(“%d:”,i);
for(j=1;j
if(i%j==0)printf(“%d ”,j);
printf(“n”);
} } } 6-3
#include“stdio.h” #include“math.h” void main(){ double x,y,zd,zx,x1,x2;zd=zx=50;for(x=0;x<=2;x=x+0.2){
y=2*pow(x,3)-3*pow(x,4)+6*pow(x,5)-4*x+50;
if(y>zd){ zd=y;x1=x;}
if(y 6-4 #include“stdio.h” void main(){ double x,sum=0,a,b,c;int i;printf(“x=”);scanf(“%lf”,&x);a=x;b=1.0;c=1.0;for(i=1;i<=10;i++){ sum=sum+a/(b*c); a=a*x*x; b=b+2; c=c*i;} printf(“y(%.2lf)=%lfn”,x,sum);} 7-1 /*选择排序*/ #include“stdio.h” void main(){ int i,j,n,k,temp;int a[10];printf(“n(<10):”);scanf(“%d”,&n);printf(“Original:”);for(i=0;i k=i; for(j=i+1;j if(a[j]?*/ if(k!=i){ temp=a[i]; a[i]=a[k]; a[k]=temp; } } printf(“Ordered:”);for(i=0;i 7-2 #include“stdio.h” void main(){ int a[3][3];int i,j,s=1;printf(“Input:n”);for(i=0;i<3;i++) for(j=0;j<3;j++){ scanf(“%d”,&a[i][j]); if(i==j)s=s*a[i][j]; } printf(“s=%dn”,s);} 7-3 /*杨辉三角*/ #include“stdio.h” void main(){ int x[7][7];int i,j;for(i=0;i<7;i++){ x[i][0]=1; x[i][i]=1;} for(i=2;i<7;i++) for(j=1;j x[i][j]=x[i-1][j]+x[i-1][j-1];for(i=0;i<7;i++){ for(j=0;j<=i;j++) printf(“%3d”,x[i][j]); printf(“n”);} } 7-4 #include if(str[i]!=str[j])break;if(i>j)printf(“%s是回文n”,str);else printf(“%s不是回文n”,str);} 7-5 /*输入一维数组的10个元素,并将最小值与第1个数交换,最大值与最后一个数交换,然后输出交换后的结果*/ #include printf(“Input:n”);zx=zd=0;for(i=0;i<10;i++){ scanf(“%d”,&a[i]); if(a[i] if(a[i]>a[zd])zd=i;} if(zx!=0){ int t; t=a[0]; a[0]=a[zx]; a[zx]=t;} if(zd!=9){ int t; t=a[9]; a[9]=a[zd]; a[zd]=t;} for(i=0;i<10;i++) printf(“%d ”,a[i]);printf(“n”);} 8-2 #include“stdio.h” double xexp(double x,int n){ double c;if(n==0)c=1.0;else c=x*xexp(x,n-1);return c;} void main(){ int n;double x; printf(“x:”);scanf(“%lf”,&x);printf(“n:”);scanf(“%d”,&n);printf(“Result=%gn”,xexp(x,n));} 8-3 #include“stdio.h” int find(int x[],int n,int y){ int i,pos=-1;for(i=0;i if(x[i]==y)pos=i;return pos;} void main(){ int a[10]={11,1,13,15,18,7,19,27,3,8};int i,y,pos; for(i=0;i<10;i++)printf(“%d ”,a[i]); printf(“ny:”);scanf(“%d”,&y);pos=find(a,10,y);if(pos==-1)printf(“Not found!n”);else printf(“Position=%dn”,pos);} 8-1 #include“stdio.h” #include“conio.h” //getch()#include“stdlib.h” //srand(),rand(),system(“cls”)#include“time.h” //time()void main(){ void init(int a[][5],int m,int n);void input(int a[][5],int m,int n); void output(int a[][5],int m,int n);int min(int b[][5],int m,int n);int a[5][5],ch='0';while(1){ system(“cls”);//清屏 printf(“1.初始化 2.键盘输入 0.结束程序:”); ch=getch();//头文件conio.h printf(“n”); if(ch=='0')break; else if(ch=='1'){ init(a,5,5); output(a,5,5); } else if(ch=='2'){ input(a,5,5); output(a,5,5); } else printf(“Error!n”); printf(“Min element:%dn”,min(a,5,5)); printf(“按任意键继续!n”); getch();} } void init(int a[][5],int m,int n){ int i,j;srand(time(0));//time(0)表示以当前的时间做种子,增加每次运行的随机性 for(i=0;i<5;i++) for(j=0;j<5;j++) a[i][j]=rand()%100;//随机数范围:0~32767,将它控制在0~99的范围 } void input(int a[][5],int m,int n){ int i,j;printf(“Input Array 5X5:n”);for(i=0;i for(j=0;j scanf(“%d”,&a[i][j]);} void output(int a[][5],int m,int n){ int i,j;printf(“Output Array 5X5:n”);for(i=0;i<5;i++){ for(j=0;j<5;j++) printf(“%2d ”,a[i][j]); printf(“n”);} } int min(int b[][5],int m,int n){ int i,j,zx;zx=b[0][0];for(i=0;i for(j=0;j if(i==j&&b[i][j] if(a[i]<0){nsum=nsum+a[i];z++;} else if(a[i]>0){psum=psum+a[i];f++;} else continue;pave=(z!=0?psum/z:0.0);nave=(f!=0?nsum/f:0.0);} void main(){ float a[10]={1.0,11.0,3.0,-1.5,-5.5,-2}; saver(a,10);printf(“pave=%.1f,nave=%.2fn”,pave,nave);} 8-5 #include“stdio.h” #include“math.h” void p1(int a,int b){ printf(“has two equal roots:%8.4fn”,-b/(2*a));} void p2(int a,int b, int disc){ float x1,x2;x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf(“Has distant real roots:%8.4f and %8.4fn”,x1,x2);} void p3(int a,int b, int disc){ float real,image;real=-b/(2*a);image=sqrt(-disc)/(2*a);printf(“Has complex roots:n”);printf(“%8.4f+%8.4fin”,real,image);printf(“%8.4f-%8.4fin”,real,image);} void main() { int a,b,c,disc;printf(“a,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c); disc=b*b-4*a*c;if(fabs(disc)<=1e-6)p1(a,b);else if(disc>1e-6)p2(a,b,disc);else p3(a,b,disc);} 8-6 #include“stdio.h” #include“stdlib.h” #include“conio.h” #include“time.h” void main(){ void printaverage(int score[][5],int m,int n); void printname(int score[][5],int m,int n);int score[10][5];int i,j;srand(time(0));for(i=0;i<10;i++) for(j=0;j<5;j++) score[i][j]=50+rand()%50+1;printf(“Output Students' score:n”);printf(“Course 1 5n”);printf(“-------------------------n”);for(i=0;i<10;i++){ printf(“No.%2d:”,i+1); for(j=0;j<5;j++) printf(“%3d ”,score[i][j]); printf(“n”);} printaverage(score,10,5);printname(score,10,5);} void printaverage(int score[][5],int m,int n){ int i,j,sum;printf(“nAverage score:n”);for(i=0;i sum=0; for(j=0;j sum=sum+score[i][j]; printf(“No.%d:%.1fn”,i+1,sum/5.0);} } void printname(int score[][5],int m,int n){ int i,j,max0,row0; for(j=0;j<5;j++){ max0=score[0][j]; for(i=0;i<10;i++) if(score[i][j]>max0){ max0=score[i][j]; row0=i; } printf(“Course %d,max score=%d,student:No.%dn”,j+1,max0,row0+1);} } 程序设计基础(C语言版)习题 第01章 一.选择题 1.以下叙述中正确的是________。 A)程序设计的任务就是编写程序代码并上机调试 B)程序设计的任务就是确定所用数据结构 C)程序设计的任务就是确定所用算法 D)以上三种说法都不完整 【解析】 程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。所以选项A)、B)、C)说法都不完整。2.以下关于简单程序设计的步骤和顺序的说法中正确的是。A)确定算法后,整理并写出文档,最后进行编码和上机调试 B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档 C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档 D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构 【解析】设计一个能解决实际问题的计算机程序需要经过以下几个过程:① 建立模型。② 算法设计:给出解决问题的步骤,即算法。③ 算法表达:选择一种表达算法的工具,对算法进行清晰的表达。④ 编写程序:选择一种程序设计语言,把以上算法程序化,这称为编写程序。⑤ 程序调试:对编写好的程序进行调试,修改程序中的错误。⑥ 程序文档编写与程序维护。综上所述,B)选项是符合上述描述的,其他选项不恰当。3,叙述中正确的是________。A)C程序的基本组成单位是语句 B)C程序中的每一行只能写一条语句 C)简单C语句必须以分号结束 D)C语句必须在一行内写完 【解析】函数是C程序的基本组成单位;C语言书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。故本题答案为C)。4.以下叙述中正确的是。 A)C程序中的注释只能出现在程序的开始位置和语句的后面 B)C程序书写格式严格,要求一行内只能写一个语句 C)C程序书写格式自由,一个语句可以写在多行上 D)用C语言编写的程序只能放在一个程序文件中 【解析】在C语言中,注释可以加在程序中的任何位置,选项A)错误。C程序可以分模块写在不同的文件中,编译时再将其组合在一起,选项D)错误。C程序的书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。所以正确答案为选项C)。 5.以下关于C语言的叙述中正确的是。 A)C语言中的注释不可以夹在变量名或关键字的中间 B)C语言中的变量可以在使用之前的任何位置进行定义 C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言的数值常量中夹带空格不影响常量值的正确表示 【解析】C语言中注释可以放在任何位置,但不能夹在变量名或关键字中间,选项A正确;C语言中的变量要在使用之前定义,C标准规定定义位置在相关程序块的首部,选项B错误;C语言中两侧数据类型可以不一致,系统可进行强制类型转换,选项C错误;C语言数值常量中不允许存在空格,选项D错误。6.以下关于C语言数据类型使用的叙述中错误的是。A)若要准确无误差地表示自然数,应使用整数类型 绪论 B)若要保存带有多位小数的数据,应使用双精度类型 C)若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型 D)若只处理“真”和“假”两种逻辑值,应使用逻辑类型 【解析】C语言中没有逻辑类型,若只处理“真”或“假”两种逻辑值,可以使用整型数“1”或“0”表示,故选D。第02章 一.选择题 1.有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是。A)a%(int)(x-y) B)a=x!=y; C)(a*y)%b D)y=x+y=x 【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。2.有以下程序 #include s=sizeof(A); t=sizeof(B); printf(“%d,%dn”,s,t); } 在VC6平台上编译运行,程序运行后的输出结果是 A)2,4 B)4,4 C)4,8 D)10,6 【解析】sizeof的作用就是返回一个对象或者类型所占的内存字节数。在VC6中整型占4个字节,双精度实型占8个字节,所以选C)。 3.若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是。A)a=a++,i++; B)i=(a+k)<=(i+k);C)i=a%11; D)i=!a; 【解析】C语言中取余运算符两侧的操作数只能是整型(若为char型,则会自动转换成整型)。4.有以下程序: #include printf(“%d,”,b=a+b); printf(“%dn”,a=2*b);} 程序运行后的输出结果是________。A)0,0 B)1,0 C)3,2 D)1,2 【解析】 执行第一个printf语句时,b=a+b=1,所以输出1,执行第二个printf语句时,a=2*b=2,所以输出结果为2。5.若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是。A)a=(b=4)=3; B)a=b=c+1; C)a=(b=4)+c; D)a=1+(b=c=4); 基本数据类型 【解析】在A)选项中,赋值语句b=4先把4赋值给整型变量b,之后执行(b=4)=3是把常量3赋值给常量4,但是由于C语言规定赋值运算符的左侧只能是变量,不能是常量或者表达式,因此A)选项错误。6.有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是。A)a%(int)(x-y) B)a=x!=y; C)(a*y)%b D)y=x+y=x 【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。 7.若有定义语句:int x=10;,则表达式x-=x+x的值为________。A)-20 B)-10 C)0 D)10 【解析】 x-=x+x可化为:x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。二.填空题 1.以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。请填空。 #include 参考答案:x%10 【解析】x=256,x%10=6。 2.以下程序运行后的输出结果是。 #include a=(int)((double)(3/2)+0.5+(int)1.99*2); printf(“%dn”,a); } 参考答案:3 【解析】本题中3/2=1,(double)(3/2)=1,(int)1.99*2=1*2=2,因此(int)(1+0.5+2)=(int)3.5=3。3.若有定义语句:int a=5;,则表达式:a++的值是____。 参考答案:5 【解析】 a++的含义是在使用a值以后,使a值加1,所以a++的值为5。4.若有语句double x=17;int y;,当执行y=(int)(x/5)%2;之后y的值为____。 参考答案:1 【解析】 y=(int)(x/5)%2=(int)(3.4)%2=3%2=1。 5.设变量a和b已正确定义并赋初值。请写出与a-=a+b等价的赋值表达式 ____。 参考答案:a=-b 【解析】a-=a+b等价于a=a-(a+b),等价于a=-b。第03章 一.选择题 1.有以下程序 #include 则输出结果是 A)1234 B)12 C)12 D)12 【解析】程序根据用户输入分别给字符型变量a、b、c、d赋值为'1'、'2'、' char ch; int k; ch=′a′; k=12; printf(“%c,%d,”,ch,ch,k); printf(“k=%dn”,k); 已知字符a的ASCII码值为97,则执行上述程序段后输出结果是 A)因变量类型与格式描述符的类型不匹配输出无定值 B)输出项与格式描述符个数不符,输出为零或不定值 C)a,97,12k=12 D)a,97,k=12 【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d表示将变量以带符号的十进制整型数输出。所以第一个输出语句输出的结果为a,97,第二个输出语句输出的结果为k=12,所以选项D)为正确答案。3.有以下程序 #include scanf(“%s”,a); gets(b); printf(“%sn%sn”,a,b); } 程序运行时若输入: how are you? I am fine <回车> 则输出结果是 A)how are you? I am fine B)how are you? I am fine C)how are you? I am fine D)how are you? 解析】scanf函数会把空格字符作为输入的字符串之间的分隔符,因此字符串a为“how”。gets()函数读取字符串时,直至接受到换行符或EOF时才停止,并将读取的结果存放在指针所指向的字符数组中,因此其余输入的内容赋值给b。二.填空题 1.以下程序运行后的输出结果是。 #include printf(“%d%dn”,a,b); } 参考答案:2008 【解析】整型变量a的值为200,b的值“010”是用八进制表示的“10”即十进制的“8”,最后输出格式均为%d,即十进制格式,所以输出为“2008”。 2.有以下程序(说明:字符0的ASCIl码值为48)#include scanf(“%d”,&c1); c2=c1+9; printf(“%c%cn”,c1,c2); } 若程序运行时从键盘输入48<回车>,则输出结果为。 参考答案:09 【解析】本题中通过ASCII码对字符变量赋值,由于字符0的ASCII码是48,因此字符变量c1为0,c2的ASCII码比c1大9,因此c2为9。第04章 一.选择题 1.若变量已正确定义,在if(W)printf(“%dn”,k);中,以下不可替代W的是。A)a<>b+c B)ch=getchar() C)a==b+c D)a++ 【解析】在C语言中,表示不等于不能用“<>”,而只能使用“!=”。其他选项均满足题目的要求。2.当变量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) 【解析】满足表达式(c>=2&& c<=6)的整型变量c的值是2,3,4,5,6。当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!=3和c!=5中至少有一个为真,即不论c为何值,选项B)中表达式的值都为“真”。正确答案为B)。3.已知字母A的ASCII码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是。A)kk>=′A′&& kk<=′Z′ B)!(kk>=′A′||kk<=′Z′)C)(kk+32)>=′a′&&(kk+32)<=′Z′ D)isalpha(kk)&&(kk<91) 【解析】C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的ASCII码在'A'和'Z'之间就可以了,选项A)和C)符合此要求。在选项D)中,函数isalpha用来确定一个字符是否为字母,大写字母的ASCII码值的范围为65到90,所以如果一个字母的ASCII码小于91,那么就能确定它是大写字母。本题答案选B)。4.有以下程序: #include < stdio.h> main() { int a=l,b=2,c=3,d=0; if(a==l && b++==2) if(b!=2||c--!=3) printf(“%d,%d,%dn”,a,b,c); else printf(“%d,%d,%dn”,a,b,c); 选择结构 else printf(“%d,%d,%dn”,a,b,c); } 程序运行后的输出结果是________。A)1,2,3 B)1,3,2 C)l,3,3 D)3,2,1 【解析】 程序首先执行第一个判断语句,a==1成立;b++==2,先判断b是否为2,再进行b加1操作,执行后b的值为3。继续执行第二个判断语句,注意程序此时进行逻辑或运算,b!=2的值为真,因此条件表达式b!=2||c--!=3的值为真,程序便不再执行第二个逻辑语句c--!=3,而直接进行输出操作。因此,本题正确答案为C)。5.执行以下程序段后,w的值为________。 int w='A',x=14,y=15; w=((x‖y)&&(w<'a')); A)-1 B)NULL C)1 D)0 【解析】根据题目所给条件可知,x||y为1,w<'a'为1,1&&1结果为1。因此正确答案为C)。6.若变量已正确定义,有以下程序段: 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 【解析】两个if语句的判断条件都不满足,程序只执行了c=a这条语句,所以变量c的值等于3,变量b的值没能变化,程序输出的结果为3,5,3。所以正确答案为选项B)。7.有以下程序段: int a,b,c; a=10; b=50; c=30; if(a>b)a=b,b=c; c=a; printf(“a=%d b=%d c=%dn”,a,b,c); 程序的输出结果是________。A)a=10 b=50 c=10 B)a=10 b=50 c=30 C)a=10 b=30 c=10 D)a=50 b=30 c=50 【解析】该题考查if条件语句,当条件为真时,将b值赋给a,c值赋给b;当条件为假时,将a值赋给c。该题中if条件为假,所以将a的值赋给c,故a=10 b=50 c=10。8.有以下程序: #include main(){ int x=1,y=2,z=3; if(x>y)if(y else printf(“%d”,++y); printf(“%dn”,x++); } 程序的运行结果是________。A)331 B)41 C)2 D)1 【解析】该题目考查if条件语句。else语句和最近的一个if语句配对。由于x>y为假,所以直接执行最后一行代码。9.有以下程序: #include 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 【解析】本题考查了 switch结构的内容。在C语言中,程序执行完一个case标号的内容后,如果没有break语句,控制结构会转移到下一个case继续执行,因为case 常量表达式只是起语句标号作用,并不是在该处进行条件判断。本题程序在执行完内部switch结构后,继续执行了外部switch结构的 case 2分支。最后a和b的值分别为2和1。二.填空题 1.在C语言中,当表达式值为0时表示逻辑值“假”,当表达式值为 时表示逻辑值“真”。 参考答案:非0 【解析】本题一定要明确一个概念,即:所有非0的数(并不只是“1”),在c语言中都表示逻辑值为“真”。 2.设x为int型变量,请写出一个关系表达式__ ,用以判断x同时为3和7的倍数时,关系表达式的值为真。 参考答案:(x%3==0)&&(x%7==0)【解析】x%3==0能保证x是3的倍数,x%7==0能保证x是7的倍数,(x%3==0)&&(x%7==0)能保证x是3的倍数并且 x是7的倍数。3.有以下程序 #include if(a==1) if(b!=2) if(c==3)d=1; else d=2; else if(c!=3)d=3; else d=4; else d=5; printf(“%dn”,d);} 程序运行后的输出结果是__。 参考答案:4 【解析】a==1为真,b!=2为假,c!=3为假,所以d=4。4.有以下程序 #include scanf(“%d”,&x); if(x>15)printf(“%d”,x-5); if(x>10)printf(“%d”,x); if(x>5)printf(“%dn”,x+5); } 若程序运行时从键盘输入12<回车>,则输出结果为。 参考答案:1217 【解析】本题中输入12时,第一条if的条件x>15不满足因此不执行,第二条if的条件x>10满足因此输出12,第三条if的条件x>5满足因此输出17。 5.以下程序运行后的输出结果是。 #include if(x==y)t=x;x=y;y=t; printf(“%d%dn”,x,y); } 参考答案:20 0 【解析】本题中if选择的条件x==y不满足,因此直接执行后面的x=y和y=t,则x的值为20,y的值为0。第05章 一.选择题 1.以下不构成无限循环的语句或语句组是 A)n=0; do{++n;}while(n<=0); 循环结构 B)n=0; while(1){n++;} C)n=10; while(n);{n--;} D)for(n=0,i=1;;i++) n+=i; 【解析】项A)中变量n的值,先自加1,再进行循环条件判断,此时循环条件n<=0不成立,跳出循环。所以正确答案为A)。2.有以下程序 #include while(y--); printf(“y=%dn”,y); } 程序执行后的输出结果是 A)y=0 B)y=-1 C)y=l D)while构成无限循环 【解析】当y减为1时判断while(y--),此时满足条件,但是y变成0。下次循环判断while(y--)时,因为y为0不满足条件跳出循环,但是此时也要执行y--,所以y变成了-1。打印输出时输出-1。3.有以下程序: #include do { if(i%3==1)if(i%5==2){ printf(“*%d”,i); break; } i++;} while(i!=0); printf(“n”); } 程序的运行结果是________。A)*7 B)*3*5 C)*5 D)*2*6 【解析】整个程序中只有对i增加的语句而没有对i减少的语句,所以2、3都不可能出现,选项B)和D)错误。而i=5时第一个if语句的表达式为假,所以选项C)也错误。4.以下程序段中的变量已正确定义: for(i=0;i<4;i++,i++) for(k=l;k<3;k++);printf(“*”); 程序段的输出结果是________。A)******** B)**** C)** D)* 【解析】 本题考察for循环语句,注意第二个for语句的后面有一个分号,即printf函数不属于循环体,无论循环执行多少次,printf(“*”)语句只执行一次。因此,本题正确答案为D)。5.有以下程序 #include for(;a<8;a++){b+=a;a+=2;} printf(“%d,%dn”,a,b);} 程序运行后的输出结果是 A)9,18 B)8,11 C)7,11 D)10,14 【解析】初始值a=1,b=2,第一次循环:b=b+a=2+1=3,a=a+2=1+2=3,a=a+1=3+1=4;第二次循环:b=b+a=3+4=7,a=a+2=4+2=6,a=a+1=6+1=7;第三次循环:b=b+a=7+7=14,a=a+2=7+2=9,a=a+1=9+1=10,故本题答案选D。6.有以下程序: #include for(i=3;i>=1;i--) { for(j=1;j<=2;j++)printf(“%d”,i+j); printf(“n”); } } 程序的运行结果是________。A)2 3 4 B)4 3 2 4 5 4 3 C)2 3 D)4 5 4 5 3 【解析】该题目主要考查for嵌套循环,要注意循环变量i和j的取值范围。输出结果为变量i和j的和。8.设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是________。A)n=0;while((ch=getchar())!='n')n++; B)n=0;while(getchar()!='n')n++; C)for(n=0;getchar()!='n';n++); D)n=0;for(ch=getchar();ch!='n';n++); 【解析】 A)项每进行一次循环判断一个字符是否为回车,如果不是就进行下一次判断,因此可以统计出输入字符个数;B)项与A)项的判断相似,仅为是否将读入的数据赋值给一个变量,因此并不影响判断结果;C)想用for循环来判断,与B)项的判断完全相同,可以统计出输入字符个数;D)项中ch=getchar()是给变量ch赋初值,如果输入回车,则程序只循环一次,如果输入一个非回车的字符,则程序进入死循环。因此,本题正确答案为D)。9.有以下程序 #include for(i=1;i<3;i++) { for(j=3;j>0;j--) {if(i*j>3)break; m*=i*j; } } printf(“m=%dn”,m);} 程序运行后的输出结果是 A)m=6 B)m=2 C)m=4 D)m=5 【解析】第一次循环i=1,j=3和j=2时都能执行m*=i*j,此时得到m的值为6;然后进行第二次循环i=2,j=3时会执行break语句,内部循环直接结束,此时i再加1,也会导致退出外部循环,所以最终结果m的值为6。10.有以下程序 #include scanf(“%d”,&s); while(s>0){ switch(s){ case 1:printf(“%d”,s+5); case 2:printf(“%d”,s+4);break; case 3:printf(“%d”,s+3); default:printf(“%d”,s+1);break; } scanf(“%d”,&s); } } 运行时,若输入123450<回车>,则输出结果是 A)6566456 B)66656 C)66666 D)6666656 【解析】switch语句执行完一个case后面的语句后,流程控制转移到下一个case语句继续执行,遇到break会跳出本次循环。本题中输入1时会输出65,输入2时会输出6,输入3时会输出64,输入4时会输出5,输入5时会输出6,在输入0时不满足循环条件,程序执行结束。11.有以下程序段 int i,n;for(i=0;i<8;i++){ n=rand()%5; switch(n){ case 1: case 3:printf(“%dn”,n);break; case 2: case 4:printf(“%dn”,n);continue; case 0: exit(0); } printf(“%dn”,n); } 以下关于程序段执行情况的叙述,正确的是 A)for循环语句固定执行8次 B)当产生的随机数n为4时结束循环操作 C)当产生的随机数n为1和2时不做任何操作 D)当产生的随机数n为0时结束程序运行 【解析】当产生的随机数n为1或2时,由于没有遇到break,因此程序将分别顺序执行case 3与case 4;当n为3时,程序输出n的值后跳出switch语句;当n为4时,程序输出n的值后将继续执行下一次循环;当n为0时,程序执行exit函数结束运行。二.填空题 1.有以下程序 #include int m,n; scanf(“%d%d”,&m,&n); while(m!=n) { while(m>n)m=m-n; while(m } printf(“%dn”,m);} 程序运行后,当输入14<空格>7<回车>时,输出结果是_____。 参考答案:7 【解析】执行while(m #include do{ b=b/2;a+=b; } while(b>1); printf(“%dn”,a);} 参考答案:5 【解析】 第一次循环执行后,b=3,a=4,满足条件b>1,循环继续;第二次循环执行后,b=1,a=5,不满足条件b>1,结束循环。所以输出的a值为5。3.有以下程序: #include f1=0;f2=1; printf(“%d %d ”,f1,f2); for(i=3;i<=5;i++) { f=f1+f2;printf(“%d”,f); f1=f2;f2=f; } printf(“n”); } 程序运行后的输出结果是____。 参考答案:0 1 123 【解析】 第一个printf语句输出结果为0 1。循环体总共循环三次,第一次循环结果为,f=1,f1=1,f2=1;第二次循环结果为f=2,f1=1,f2=2;第三次循环结果为f=3,f1=2,f2=3。4.若有定义:int k;,以下程序段的输出结果是____。 for(k=2;k<6;k++,k++)printf(“##%d”,k); 参考答案:##2##4 【解析】在for循环语句中,自变量k的自增表达式为k++,k++。这是一个逗号表达式,所以输出结果为##2##4。5.以下程序运行后的输出结果是____。 #include main() { int k=1,s=0; do{ if((k%2)!=0)continue; s+=k;k++; }while(k>10); printf(“s=%dn”,s); } 参考答案:s=0 【解析】continue语句用于跳出本次循环,直接进行下一次循环。进行if判断时k的值为1不能够被2整除,因此执行continue退出本次循环,不对s进行任何操作,直接进行循环条件判断,此时k的值为1不满足循环条件,退出while循环,输出s的值为0。第06章 一.选择题 1.下列选项中,能正确定义数组的语句是 A)int num[0..2008]; B)int num[];C)int N=2008; D)#define N 2008 int num[N]; int num[N]; 【解析】选项A不符合C语言的语法要求;选项B中没有指定数组的大小;选项C中数组大小不能用变量来指定。2.下列定义数组的语句中,正确的是。 A)int N=10; B)#define N 10 C)int x[0..10]; D)int x[]; int x[N]; int x[N]; 【解析】A)中的N是一个变量,不可以用变量来定义数组,所以选项A)错误。C)中把所有的下标均列出不正确,此处只需指明数组长度即可。D)中在定义时没有指明数组长度不正确,如果不指明长度就应在定义时对数组元素进行赋值,而此选项没有,所以错误。故本题答案为B)。 3.若要定义一个具有5个元素的整型数组,以下错误的定义语句是 A)int a[5]={0}; B)int b[]={0,0,0,0,0}; C)int c[2+3]; D)int i=5,d[i]; 【解析】在进行数组的定义时,不能使用变量对数组的长度进行定义。其他选项均符合数组定义标准。4.以下错误的定义语句是。 A)int x[][3]={{0},{1},{1,2,3}}; B)int x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; C)int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; 数组 D)int x[][3]={1,2,3,4}; 【解析】本题考查的是二维数组的定义和初始化方法。C语言中,在定义并初始化二维数组时,可以省略数组的第一维的长度,但是不能省略第二维的长度。故选项C)错误。 5.若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是。A)a[2][!1] B)a[2][3] C)a[0][3] D)a[1>2][!1] 【解析】C语言中数组下标是从0开始的,所以二维数组a[2][3]的第一维下标取值为0、1;第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示的是数组元素a[0][0]。所以正确答案为D)。6.有以下程序: #include printf(“%d,%dn”,strlen(a),sizeof(a)); } 程序运行后的输出结果是________。A)7,4 B)4,10 C)8,8 D)10,10 【解析】 strlen()用来返回字符串的长度,而sizeof()返回的是一个对象或者类型所占的内存字节数,即数组所占的内存。二.填空题 1.以下程序运行后的输出结果是。 #include for(i=1;i<=4;i++){ n[i]=n[i-1]*2+1;printf(“%d”,n[i]);} printf(“n”); } 参考答案:13715 【解析】本题中已知n[0]为0,根据循环的执行可以得到n[1]为1,n[2]为3,n[3]为7,n[4]为15,因此输出结果是13715。2.有以下程序 #include for(i=l;i<=4;i++) {n[i]=n[i-1]*3+1;printf(“%d ”,n[i]);} } 程序运行后的输出结果是。参考答案:1 4 13 40 【解析】第一次循环结果为:n[1]=0*3+1,即n[1]的值为1,打印输出1 ;第二次循环结果为:n[2]=1*3+1,即n[2]的值为4,打印输出4 ;第三次循环结果为:n[3]=4*3+1,即n[3]的值为13,打印输出13 ;第四次循环结果为:n[4]=13*3+1,即n[4]的值为40,打印输出40。3.有以下程序 #include int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3]={0},i; for(i=0;i<3;i++) b[i]=a[i][2]+a[2][i]; for(i=0;i<3;i++) printf(“%d”,b[i]); printf(“n”);} 程序运行后的输出结果是____。 参考答案:101418 【解析】当i=0时,b[0]=a[0][2]+a[2][0]=3+7=10;当i=1时,b[1]=a[1][2]+a[2][1]=6+8=14;当i=2时,b[2]=a[2][2]+a[2][2]=9+9=18,则打印结果为101418。4.有以下程序 #include for(i=0;i<2;i++)n[i]=0; for(i=0;i<2;i++) for(j=0;j<2;j++)n[j]=n[i]+1; printf(“%dn”,n[1]); } 结果为:__________参考答案:3 【解析】通过第一次 for(i=0;i<2;i++)n[i]=0;的循环语句可知,已经将数组n 中的两个元素都赋初值为0。接下来的循环中,第一次循环,外循环 i=0 的前提下:内循环j=0时,运行完n[0]=n[0]+1后n[0]为1;j=1时,运行完n[1]=n[0]+1后,n[1]为2。第二次循环,外循环i=1的前提下,内循环j=0时,运行完n[0]=n[1]+1后n[0]为3;j=1时,运行完n[1]=n[1]+1后,n[1]为3。 5.以下fun函数的功能是在N行M列的整型二维数组中,选出一个最大值作为函数值返回,请填空。(设M,N已定义)int fun(int a[N][M]){ int i,j,row=0,col=0; for(i=0; i for(j=0;j if(a[i][j]>a[row][co1]){row=i;col=j;} return(____); }参考答案:a[row][col] 【解析】通过程序可以看出,外循环是行,内循环是列。先在行不变的情况下找一行内最大的数据进行记录。通过语句 if(a[i][j]>a[row][col]){ row=i;col=j;}可知,如果变量a[i][j]大于a[row][col],将i赋给了row,将j赋给了col,所以a[row][col]是记录当前最大值的变量。6.有以下程序 #include for(i=0;i<3;i++) for(j=i;j<3;j++)printf(“%d”,a[i][j]); printf(“n”); } 程序运行后的输出结果是____。参考答案:123569 【解析】当i=0时,j=0、1、2时满足条件,则打印a[0][0]、a[0][1]、a[0][2];当i=1时,j=1、2时满足条件,则打印a[1][1]、a[1][2];当i=2时,j=2时满足条件,则打印a[2][2],所以打印结果为123569。7.有以下程序: #include scanf(“%s”,b);printf(“%s %sn”,a,b); } 程序运行时从键盘输入:How are you?<回车> 则输出结果为____。参考答案:How are you? How 【解析】用%s格式输入字符串时,空格和回车都作为输入数据的分隔符,不能被读入,因此数组b的输出结果为How。第07章 一.选择题 1.有以下程序: #include r=p;p=q;q=r; printf(“%d,%d,%d,%dn”,m,n,*p,*q); } 程序运行后的输出结果是________。A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,2 【解析】 m和n的值不变,输出结果为1,2。指针*p和*q交换了指向的位置,即*p=&n,*q=&m,输出结果分别为2,1。2.以下程序段完全正确的是 A)int*p; scanf(“%d”,&p); B)int*p; scanf(“%d”,p); C)int k,*p=&k; scanf(“%d”,p); D)int k,*p; *p=&k; scanf(“%d”,p); 【解析】A)选项输入的是指针型变量p的地址,变量一定义就已分配好了地址不能再指定了,所以A错误。B)选项没有指定指针p应该指向的变量,没给变量赋初值。D)选项中,p是地址,*p是地址内存放的数据,它把整型变量k的地址赋给了*p,所以错误。 3.以下定义语句中正确的是。 A)int a=b=0; B)char A=65+1,b=′b′; C)float a=1,*b=&a,*c=&b; D)double a=0.0;b=1.1; 【解析】本题考查变量的定义方法。如果要一次进行多个变量的定义,则在它们之间要用逗号隔开。因此选项A)和D)错误;在选项C)中,变量c是一个浮点型指针,它只能指向一个浮点型数据,不能指向指针变量b;所以正确答案为B)。4.若有定义语句:double x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是________。A)scanf(“%f%f”,x,y);B)scanf(“%f%f”&x,&y); 指针 C)scanf(“%lf%le”,px,py);D)scanf(“%lf%lf”,x,y); 【解析】 本题考查scanf函数,其格式为:scanf(“控制格式”,地址表列)。其中地址表列中应为要赋值变量的地址。本题要为变量x和y赋值,并定义了两个指针分别指向x和y,因此取得变量x和y的地址的方法有两种,一种是使用取地址符号“&”,即&x和&y,另一种是使用指针变量,即px和py。选项A)和D)中地址表列表示错误;选项B)中控制格式与地址表列之间应用逗号分开。因此,本题正确答案为C)。5.有以下程序: #include --p;y=*p;printf(“y=%dn”,y); } 程序的运行结果是 A)y=0 B)y=1 C)y=2 D)y=3 【解析】在程序中指针变量p初始指向a[3],执行p减1后,p指向a[2],语句y=*p的作用是把a[2]的值赋给变量y,所以输出为y=3。正确答案为D)。6.下列函数的功能是________。 fun(char *a,char *b){ while((*b=*a)!=' '){a++;b++;}} A)将a所指字符串赋给b所指空间 B)使指针b指向a所指字符串 C)将a所指字符串和b所指字符串进行比较 D)检查a和b所指字符串中是否有' ' 【解析】 表达式*b=*a是将a所指的字符赋给b所指的空间,然后,指针a和b依次后移,直到到达指针a所指字符串的结尾。7.设有定义:char *c;,以下选项中能够使字符型指针c正确指向一个字符串的是________。A)char str[]=“string”;c=str; B)scanf(“%s”,c); C)c=getchar(); D)*c=“string”; 【解析】 选项B)、D)中,没有为字符串分配空间,因此不能用c指向字符串。选项C)中getchar()函数返回一个字符,不能将字符赋给字符指针c。选项A)中首先定义了字符数组str,然后将str的首地址赋给指针c,这样就使指针c指向了字符串“string”。8.有以下程序 #include printf(“%cn”,*s+2); } 程序运行后的输出结果是 A)tuv B)字符t的ASCII码值 C)t D)出错 【解析】*s+2 相当于(*s)+2即先取出s所指的数据然后对其加2,s是字符串的首地址,所以*s即s[0]就是字符“r”,所以在 它的ASCII码上加上数字2就变成了字母“t”的ASCII码,所以以%c格式输出,即为选项C)。9.下列语句组中,正确的是 A)char *s;s=“Olympic”; B)char s[7];s=“Olympic”;C)char *s;s={“Olympic”}; D)char s[7];s={“Olympic”}; 【解析】若s被定义为指针,选项A表示将指针s指向一个字符串,选项C表示为指针s赋一个字符串的值,显然选项A正确,选项C错误;若s被定义为数组,且要为该数组直接赋值,则必须在定义时进行,因此选项B和选项D都错误。二.填空题 1.以下程序的功能是:借助指针变量找出数组元素中的最大值及其元素的下标值。请填空。 #include 参考答案:p 【解析】s指向当前最大的元素,当*p>*s时,表示当前p所指向的那个元素比s指向的元素大,则s应该记录当前最大的元素的地址。2.有以下程序 #include int a[]={1,2,3,4,5,6},*k[3],i=0; while(i<3) { k[i]=&a[2*i]; printf(“%d”,*k[i]); i++; } } 程序运行后的输出结果是______。参考答案:135 【解析】当i=0时,k[0]=&a[0];当i=1时,k[1]=&a[2];当i=2时,k[2]=&a[4],则打印结果为135。 3.以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。请在输出语句中填写代表最大值的输出项。 #include for(p=a;p-a<10;p++)scanf(“%d”,p); for(p=a,s=a;p-a<10;p++)if(*p>*s) s=p; printf(“max=%dn”,______); } 参考答案:*s 【解析】因为题目中有 if(*p>*s)s=p;语句,可知如果p所指的元素的值比s所指的元素的值大,就把指针p的地址赋予指针s,即s指向当前值最大的元素,所以最后应该输出的元素的值为*s。第08章 一.选择题 1.以下叙述正确的是。函数 A)C语言程序是由过程和函数组成的 B)C语言函数可以嵌套调用,例如:fun(fun(x))C)C语言函数不可以单独编译 D)C语言中除了main函数,其他函数不可作为单独文件形式存在 【解析】C语言中只有函数没有过程,故选项A错误;C语言可以嵌套调用,故选项B正确;C语言函数可以单独编译成.dll文件,故选项C错误;C语言中除main函数以外,其他函数可作为单独文件形式存在,故选项D也错误。2.有以下程序: #include else return(fun(--a,--b)); } main(){ printf(“%dn”,fun(4,2));} 程序的运行结果是________。A)1 B)2 C)3 D)4 【解析】该题目考查函数参数传递以及if条件语句。当变量b为0时,将a的值返回给主调函数,因此a进行两次自减1后,将其值返回并输出。 3.下面的函数调用语句中func函数的实参个数是________。 func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8))); A)3 B)4 C)5 D)8 【解析】C语言函数定义中,参数列表之间使用逗号分隔。该题目中func的函数列表中使用两个逗号,将3个参数分隔开。4.有以下程序: #include void fun(int *a,int *b) { int *c; c=a;a=b;b=c; } main() { int x=3, y=5, *p=&x, *q=&y; fun(p,q);printf(“%d,%d,”,*p,*q); fun(&x,&y);printf(“%d,%dn”,*p,*q); } 程序运行后的输出结果是________。A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3 【解析】 子函数fun功能为交换形式参数的值,即交换指针变量a和b的值。但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并且不能影响p和q指针指向的数据,因此第二个printf语句的输出为3,5。5.有以下程序: #include int f(int x,int y) {return((y-x)*x);} main() { int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); printf(“%dn”,d); } 程序运行后的输出结果是________。A)10 B)9 C)8 D)7 【解析】 将a、b、c的值分别带入f(a,b)和f(a,c)中计算得:f(a,b)=3,f(a,c)=6,再计算f(3,6),算出d=9。6.有以下程序: #include { if(x==y)return(x); else return((x+y)/2); } main() { int a=4,b=5,c=6; printf(“%dn”,fun(2*a,fun(b,c))) } 则运行结果为。A)3 B)6 C)8 D)12 【解析】函数fun的功能是求两个整数的平均值,返回值仍为整数。5和6的平均取整后为5,8和5的平均取整后为6。因此,本题答案为B)。7.有以下程序 #include m=f(f(f(n)));printf(“%dn”,m); } int f(int x){ return x*2;} 程序运行后的输出结果是 A)1 B)2 C)4 D)8 【解析】第一次调用的是最内层的f(n),即f(1)返回值2。第二次调用中间的f(f(n)),即f(2)返回值4。最后调用最外层的f(f(f(n))),即f(4)返回值8,最后打印输出。二.填空题 1.以下程序的输出结果是_________。 #include t=a; a=b; b=t; } main(){ int i=3,j=5,*p=&i,*q=&j; swap(p,q); printf(“%d %dn”,*p,*q); } 参考答案:3 5 【解析】函数swap(int *a,int *b)的功能是实现*a和*b中两个数据的交换,在主函数中调用swap(p,q)后,参形指针变量a和b分别指向i和j,在swap(int *a,int *b)执行完后,指针变量a和b分别指向j和i,而指针变量p,q所指向变量的值没有发生变化,所以输出结果为3 5。 2.以下fun函数的功能是:找出具有N个元素的一维数组中的最小值,并作为函数值返回。请填空。(设N已定义)int fun(int x[N]){ int i,k=0; for(i=0;i if(x[i] return x[k]; } 参考答案:i 【解析】通过函数中语句 return x[k]; 可知x[k]表示的是该一维数组中最小的值,所以当x[i]小于x[k]所代表的数值后应将i变量赋给k变量,使得x[k]表示当前值较小的那个数据。3.有以下函数 void prt(char ch,int n){ int i; for(i=1;i<=n;i++)printf(i%6!=0 ? “%c”:“%cn”,ch); } 执行调用语句prt('*',24);后,函数共输出了______ 行*号。 参考答案:4 【解析】本题中输出*并换行的条件是i能被6整除,否则输出*不换行。因此只有在i为6、12、18和24时*的输出才会换行,最终输出4行*。 4.请将以下程序中的函数声明语句补充完整。 #include int______; main() { int x,y,(*p)(); scanf(“%d%d”,&x,&y); p=max; printf(“%dn”,(*p)(x,y)); } int max(int a,int b) { return(a>b?a:b);} 参考答案:max(int a,int b)【解析】本题考的是函数声明。函数声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知给编译系统。函数在被调用前必须先声明,因为main函数后面有max函数的定义。5.有以下程序,请在 __ 处填写正确语句,使程序可正常编译运行。 #include scanf(“%lf%lf”,&x,&y); p=avg; printf(“%fn”,(*p)(x,y)); } double avg(double a,double b){ return((a+b)/2);} 参考答案:double avg(double a ,double b);【解析】c语言编译器对于源代码的编译是顺序编译的,当任意一个函数中调用某个函数的时候,这个函数的原型必须在调用之前声明,否则就会出现编译错误。本题中需要在main函数调用avg之前对其进行声明。6.有以下程序: #include printf(“%d.”,x); } main(){ fun(6),printf(“n”);} 程序运行后的输出结果是________。 参考答案:1 3 6 【解析】 依次执行fun(6),fun(3),fun(1),当执行fun(6)时要调用fun(3),执行fun(3)时要调用fun(1),所以输出的结果为1 3 6。第09章 一.选择题 1.有以下程序: #include int b=2; int fun(int *k) { b=*k+b;return(b);} main() { int a[10]={1,2,3,4,5,6,7,8},i; for(i=2;i<4;i++){b=fun(&a[i])+b;printf(“%d”,b);} printf(“n”); 变量的属性和编译预处理 } 程序运行后的输出结果是________。A)10 12 B)8 10 C)10 28 D)10 16 解析】b为全局变量,在第一次执行for循环后b的值变为10并输出,第二次执行for循环后b的值变为28。因此,本题答案选C)。 2.在C语言中,只有在使用时才占用内存单元的变量,其存储类型是。A)auto和register B)extern和register C)auto和static D)static和register 【解析】在C语言中只有自动变量和寄存器变量在使用时才占用内存单元。所以正确答案为A)。3.设函数中有整型变量n,为保证其在未赋初值的情况下初值为0,应选择的存储类别是___C_____。A)auto B)register C)static D)auto或register 【解析】static(静态局部变量):有时我们希望函数中局部变量的值在函数调用结束后不消失而保留原值,这时就将局部变量指定为静态局部变量,如果定义静态局部变量时不赋值,则编译时自动赋初值0(对数据型变量)或空字符(对字符变量)。 auto(自动变量):函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时自动释放这些存储空间。 register(寄存器变量):为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫寄存器变量。 4.有以下程序: #include s=f(a);s=s+f(a);printf(“%dn”,s); } int f(int n){ static int a=1; n+=a++; return n; } 程序运行后的输出结果是__C______。A)7 B)8 C)9 D)10 【解析】 s=f(a)表达式第一次调用f(n)函数时,f(n)函数运行结果为n=4,a=2,即s等于4;s=s+f(a)表达式第二次调用f(n)函数时,f(n)函数运行结果为n=5,所以得到s值为9。5.有以下程序 #include x*=2;return x;} main(){ int i,s=1; for(i=1;i<=2;i++) s=fun(); printf(“%dn”,s);} 程序运行后的输出结果是 A)0 B)1 C)4 D)8 【解析】x被声明为静态变量,第一次调用fun()后,x值为2,第二次调用时直接执行x*=2,值为4。6.以下叙述中错误的是 A)在程序中凡是以“#”开始的语句行都是预处理命令行D B)预处理命令行的最后不能以分号表示结束 C)#define MAX是合法的宏定义命令行 D)C程序对预处理命令行的处理是在程序执行的过程中进行的 【解析】C语言中的预处理命令以符号#开头,这些命令是在程序编译之前进行处理的,选项D)的描述错误。故答案选D)。7.以下关于宏的叙述中正确的是_____C___。A)宏名必须用大写字母表示 B)宏定义必须位于源程序中所有语句之前 C)宏替换没有数据类型限制 D)宏调用比函数调用耗费时间 【解析】宏名可以大写,也可以小写。其有效范围为定义命令之后到本源文件结束。宏的调用是字符的替换,没有数据类型限制。二.填空题 1.以下程序的输出结果是_____。 #include return(t+=x); } main(){ int s,i; for(i=1;i<=5;i++)s=fun(i); printf(“%dn”,s); } 参考答案:15 【解析】static关键字用来声明“静态局部变量”,静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间不释放变量的值。 2.以下程序运行后的输出结果是 ____。 #include int i; p=(char*)malloc(sizeof(char)*20); strcpy(p,“welcome”); for(i=6;i>=0;i--)putchar(*(p+i)); printf(“n”); free(p); } 参考答案:emoclew 【解析】本题中用malloc函数申请一个20个字符大小的空间,并用指针p指向空间的首地址。strcpy函数使“welcome”字符串存放到分配的空间,最后用putchar函数倒序输出字符串的前7个字符。p[0] = w ,p[1] = e ,p[2] = l , p[3] = c , p[4] = o , p[5] = m , p[6] = e。第10章 一.选择题 1.有以下程序: #include struct STU a={“Zhao”,'m',85.0,90.0},b={“Qian”,'f',95.0,92.0}; b=a; printf(“%s,%c,%2.0f,%2.0fn”,b.name,b.sex,b.score[0],b.score[1]); } 程序的运行结果是_____D___。A)Qian,f,95,92 B)Qian,m,85,90 C)Zhao,f,95,92 D)Zhao,m,85,90 【解析】该题目考查结构体数据类型,注意语句b=a,因此输出b.name为zhao,b.sex为m,依此类推。2.以下结构体类型说明和变量定义中正确的是。A A)typedef struct {int n; char c;}REC; REC t1,t2; B)struct REC; {int n; char c;}; REC t1,t2; C)typedef struct REC ; {int n=0; char c='A';}t1,t2; D)struct {int n; char c;}REC; REC t1,t2; 【解析】本题考查的是typedef的用法和结构体变量的定义方法。typedef可用于声明结构体类型,其格式为“typedef struct {结构元素定义}结构类型;”。本题正确答案为A)。3.若有以下语句 typedef struct S { int g;char h; }T; 以下叙述中正确的是 A)可用S定义结构体变量 B)可用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量 复杂数据类型 【解析】此题考察的是结构体的定义方式。S是我们定义的结构体的名字,在题目中顺便将T定义为struct S类型,即T被定义为一个类型名。这样就可以用T来定义说明新的变量了。在此S与T 都不是变量的名称。4.下面结构体的定义语句中,错误的是__B______。 A)struct ord {int x;int y;int z;};struct ord a; B)struct ord {int x;int y;int z;}struct ord a; C)struct ord {int x;int y;int z;}a; D)struct {int x;int y;int z;}a; 【解析】 定义结构体变量有三种方式:①先声明结构体类型,再定义变量名,如选项A)所示;②在声明类型的同时定义变量,如选项C)所示;③直接定义结构体类型变量,如选项D)所示。5.有以下程序: #include printf(“%d,”,p->y); printf(“%dn',(++p)->x); } 程序的运行结果是________。A)10,1 B)20,1 C)10,2 D)20,2 【解析】数组名的值即为数组首地址,所以p->y可得第一个元素的y值,(++p)->x可得第二个元素的x值。6.设有定义: struct complex {int real,unreal;} datal={1,8},data2;则以下赋值语句中错误的是 A)data2=data1; B)data2=(2,6);C)data2.rea1=data1.real; D)data2.real=datal.unreal; 【解析】选项B需要强制转换数据类型,应该为(struct complex){2,6}。7.有以下程序 #include printf(”%d,“,++(p->x));printf(”%dn“,++(p->y)); } 程序运行后的输出结果是 A)1,2 B)4,l C)3,4 D)2,3 【解析】本题中定义了一个结构体数组dt[2],其中dt[0].x=1,dt[0].y=2,dt[1].x=3,dt[1].y=4。在main函数中指针p指向了结构体数组的第一个元素,因此p->x值为1,p->y值为2,自加运算的结果分别为2和3。8.有以下程序 #include { int a, b;}data[2]={10,100,20,200};main(){ struct S p=data[1]; printf(”%dn“,++(p.a)); } 程序运行后的输出结果是 A)10 B)11 C)20 D)21 【解析】本题中定义了一个结构体数组data[2],其中data[0].a=10,data[0].b=100,data[1].a=20,data[1].b=200。在main函数中结构体数组的第2个元素data[1]赋值给p,即p指向结构体数组的第2个元素,因此p.a的值为20,进行自加运算后结果为21。9.有以下定义和语句 struct workers {int num;char name[20];char c;struct {int day;int month;int year;}s;};struct workers w,*pw;pw=&w;能给w中year成员赋1980的语句是 A)*pw.year=1980; B)w.year=1980;C)pw->year=1980; D)w.s.year=1980; 【解析】结构体structure workers中的成员s是结构体类型,给w中成员year赋值的语句是w.s.year=1980,故选D。10.假定已建立以下链表结构,且指针p和q已指向如下图所示的结点: 则以下选项中可将q所指结点从链表中删除并释放该结点的语句组是 。A)(*p).next=(*q).next; free(p); B)p=q->next; free(q); C)p=q; free(q); D)p->next=q->next; free(q); 【解析】要将结点b从链表中删除,应先将a的指针域指向b结点的下一个结点,即p->next=q->next,然后释放指针q的空间。二.填空题 1.有以下程序: #include void funl(REC x){x.num=23;x.s=88.5;} main(){ REC a={16,90.0); fun1(a); printf(”%dn“,a.num); } 程序运行后的输出结果是______。 参考答案:16 【解析】 主函数中,通过funl()函数将a值传递给x,但没有把形参x的值返回,此时变量a的值并没有发生变化,所以输出a.num的值为16。2.设有定义: struct person { int ID;char name[12];}p; 请将scanf(”%d“,_______);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。 参考答案:&p.ID 【解析】结构体成员的引用通过符号”.“来表示,通过scanf语句对变量进行赋值时,要用取地址符&。3.下列程序的运行结果为_______。 #include #include struct A { int a;char b[10];double c;}; void f(struct A *t); main() { struct A a={1001,”ZhangDa“,1098.0); f(&a);printf(”%d,%s,%6.1fn“,a.a,a.b,a.c); } void f(struct A *t) { strcpy(t->b,”ChangRong“);} 参考答案:1001,ChangRong,1098.0 【解析】此题考的是结构体用法。函数f的功能为将结构体的第二个变量修改为ChangRong。主函数为运行f函数后,将结构体输出。 4.以下程序把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据域中的数据。请填空。 #include struct node { int data;struct node *next;}; typedef struct node NODETYPE; main() { NODETYPE a,b,c,*h,*P; a.data=10;b.data=20;c.data=30;h=&a; a.next=&b;b.next=&c;c.next=′ ′; p=h; while(p){printf(”%d,“,p->data);__p=p->next ______;} printf(”n“); } 【解析】打印完一个链表结点的数据域中的数据域后,用p=p->next使链表指针指向下一个链表结点。第11章 一.选择题 文件 1.下列关于C语言文件的叙述中正确的是________。A)文件由一系列数据依次排列组成,只能构成二进制文件 B)文件由结构序列组成,可以构成二进制文件或文本文件 C)文件由数据序列组成,可以构成二进制文件或文本文件 D)文件由字符序列组成,其类型只能是文本文件 【解析】 文件由数据序列组成,可以构成二进制文件,也可以构成文本文件。2.有以下程序: #include int a[10]={1,2,3},i,n; fp=fopen(”d1.dat“,”w“); for(i=0;i<3;i++)fprintf(fp,”%d“,a[i]); fprintf(fp,”n“); fclose(fp); fp=fopen(”d1.dat“,”r“); fscanf(fp,”%d“,&n); fclose(fp); printf(”%dn“,n); } 程序的运行结果是 A)12300 B)123 C)1 D)321 【解析】在函数中首先把整型数组a[10]中的每个元素写入文件d1.dat中,然后再次打开这个文件,把文件d1.dat中的内容读入到整型变量n中,最后输出变量n的值。所以正确答案为B)。3.有以下程序: #include char *s1=”China“,*s2=”Beijing“; pf=fopen(”abc.dat“,”wb+“); fwrite(s2,7,1,pf); rewind(pf); /*文件位置指针回到文件开头*/ fwrite(s1,5,1,pf); fclose(pf); } 以上程序执行后abc.dat文件的内容是_B_______。A)China B)Chinang C)ChinaBeijing D)BeijingChina 【解析】该题目考查文件相关知识。”wb+“用于打开或建立二进制文件并允许对其进行读和写操作。文件操作先写入了s2,然后将文件指针移动到文件夹,再写入s1,这样s1就会覆盖掉一部分s2的内容。 4.有以下程序: #include f=fopen(”filea.txt“,”w“); fprintf(f,”abc“); fclose(f); } 若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt中的内容为___C_____。A)helloabc B)abclo C)abc D)abchello 【解析】”w“表示建立一个供写入的文件。如果文件不存在,系统将用在fopen调用中指定的文件名建立一个新文件,如果指定的文件已存在,则将从文件的起始位置开始写入,文件中原有的内容将全部消失。5.有以下程序 #include FILE *fp;char str[10]; fp=fopen(”myfile.dat“,”w“); fputs(”abc“,fp);fclose(fp); fp=fopen(”myfile.dat“,”a+“); fprintf(fp,”%d“,28); rewind(fp); fscanf(fp,”%s“,str);puts(str); fclose(fp);} 程序运行后的输出结果是C A)abc B)28c C)abc28 D)因类型不一致而出错 【解析】首先打开文件写入字符串”abc“,然后关闭文件,再打开时文件指针定位到了最后,写入”28“,然后重定位位置指针到开始,读取字符串为”abc28“。 6.设fp已定义,执行语句fp=fopen(”file“,”w“);后,以下针对文本文件file操作叙述的选项中正确的是。B A)写操作结束后可以从头开始读 C)可以在原有内容后追加写 B)只能写不能读 D)可以随意读和写 【解析】本题中用”w“方式打开文件,只能向文件写数据。如果原来不存在该文件,则新创建一个以指定名字命名的文件;如果已存在该文件,则把原文件删除后重新建立一个新文件,而不是把内容追加到原文件后。 二.填空题 1.以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中,请填空。 #include char a[5]={'1','2','3','4','5'},i; fp=fopen(”f.txt“,”w“); for(i=0;i<5;i++)fputc(a[i],fp); fclose(fp); } 【解析】在这里需要定义文件指针,定义文件指针的格式为: FILE * 变量名。2.以下程序的功能是从名为filea.dat的文本文件中逐个读入字符并显示在屏幕上。请填空。 #include fp=fopen(___”filea.dat“,”r“_____); ch=fgetc(fp); while(!feof(fp)){ putchar(ch); ch=fgetc(fp); } putchar(′n′); fclose(fp); } 【解析】fopen函数的调用方式通常为 fopen(文件名,使用文件方式)。本题中要求程序可以打开filea.dat文件,并且读取文件中的内容。所以空白处应当填入 ”filea.dat“,”r“。3.以下程序用来判断指定文件是否能正常打开,请填空。 #include main() { FILE *fp; if(((fp=fopen(”test.txt“,”r“))==__NULL______)) printf(”未能打开文件!n“); else printf(”文件打开成功!n“); } 【解析】本题考查fopen函数的用法。若fopen不能实现打开任务时,函数会带回一个出错信息,出错原因可能是磁盘出现故障,磁盘无法建立新文件等,此时fopen函数将带回一个空指针NULL。因此通过判断返回值是否为NULL即可判断是否读取文件正确。 4.以下程序运行后的输出结果是___123456_____。 #include fp=fopen(”test.dat“,”wb“); fwrite(x,sizeof(int),3,fp); rewind(fp); fread(x,sizeof(int),3,fp); for(i=0;i<6;i++)printf(”%d“,x[i]); printf(”n"); fclose(fp); } 【解析】本题中fwrite函数向目标文件指针fp指向的文件test.dat中写入3个int数据,即123。rewind函数将文件内部的位置指针重新指向文件的开头。fread函数将从fp所指文件中读取3个int数据到x指向的地址,因此数组x的元素没有变化。 第七章 函数调用 7-1 写两个函数,分别求两个整数的最大公约数和最小公倍数,#include void main(){ int hcf(int,int);int lcd(int,int,int); int u,v,h,l;scanf(“%d,%d”,&u,&v); h=hcf(u,v);printf(“H.C.F=%dn”,h); l=lcd(u,v,h);printf(“L.C.D=%dn”,l);} int hcf(int u,int v){ int t,r;if(v>u){ t=u; u=v; v=t;} while((r=u%v)!=0){ u=v; v=r;} return(v);} int lcd(int u,int v,int h){ return(u*v/h);} 7-2 求方程ax*x+bx+c=0的根,用3个函数分别求当b*b-4ac大于0,等于0、小于0时的根并输出结果。从主函数输入abc的值。 #include void main(){ void greater_than_zero(float,float);void equal_to_zero(float,float);void smaller_than_zero(float,float);float a,b,c;printf(“input a,b,c:”);scanf(“%f,%f,%f”,&a,&b,&c); printf(“equation: %5.2f*x*x+%5.2f*x+%5.2f=0n”,a,b,c);disc=b*b-4*a*c;printf(“root:n”);if(disc>0){ greater_than_zero(a,b); printf(“x1=%fttx2=%fn”,x1,x2);} else if(disc==0){ equal_to_zero(a,b); printf(“x1=%fttx2=%fn”,x1,x2);} else { smaller_than_zero(a,b); printf(“x1=%f+%fitx2=%f-%fin”,p,q,p,q);} } void greater_than_zero(float a,float b){ x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);} void equal_to_zero(float a,float b){ x1=x2=(-b)/(2*a);} void smaller_than_zero(float a,float b){ p=-b/(2*a);q=sqrt(-disc)/(2*a);} 7-3 写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。 #include void main(){ int prime(int);int n;printf(“ninput an integer:”);scanf(“%d”,&n); if(prime(n)) printf(“n %d is a prime.n”,n);else printf(“n %d is not a prime.n”,n);} int prime(int n){ int flag=1,i;for(i=2;i if(n%i==0) flag=0;return(flag);} 7-4 写一个函数,使给定的一个3x3的二维整形数组转置,即行列转换。#include void main(){ void convert(int array[][3]);int i,j;printf(“input array:n”);for(i=0;i for(j=0;j scanf(“%d”,&array[i][j]); printf(“noriginal array :n”);for(i=0;i for(j=0;j printf(“%5d”,array[i][j]); printf(“n”);} printf(“convert array:n”);for(i=0;i for(j=0;j printf(“%5d”,array[i][j]); printf(“n”);} } void convert(int array[][3]){ int i,j,t;for(i=0;i for(j=i+1;j { t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t; } } 7-5 写一个函数,是输入的字符串按反序存放,在主函数中输入和输出字符窜。#include printf(“input string:”);scanf(“%s”,str); inverse(str); printf(“inverse string:%sn”,str);} void inverse(char str[]){ char t;int i,j;for(i=0,j=strlen(str);i<(strlen(str)/2);i++,j--){ t=str[i]; str[i]=str[j-1]; str[j-1]=t;} } 7-6 写一个函数,将两个字符窜连接。 #include concatenate(s1,s2,s);printf(“nThe new string is %sn”,s);} void concatenate(char string1[],char string2[],char string[]){ int i,j;for(i=0;string1[i]!=' ';i++) string[i]=string1[i];for(j=0;string2[j]!=' ';j++) string[i+j]=string2[j];string[i+j]=' ';} 7-7 写一个函数,将字符窜中元音字母复制到另一个字符窜,然后输出。#include void main(){ void cpy(char [],char []);char str[80],c[80];printf(“input string:”);gets(str); cpy(str,c); printf(“The vowel letters are:%sn”,c);} void cpy(char s[],char c[]){ int i,j;for(i=0,j=0;s[i]!=' ';i++) if(s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'|| s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U') { c[j]=s[i]; j++; } c[j]=' ';} 7-13 输入10个学生5门课的成绩,分别用函数实现下列功能。1 计算每个学生平均分。2 计算每门课的平均分。找出所有50个分数中最高的分数所对应的学生和课程。4 计算平均方差。 #include void main(){ int i,j;float h;float s_var(void);float highest();void input_stu(void);void aver_stu(void);void aver_cour(void); input_stu();aver_stu();aver_cour(); printf(“n NO.cour1 avern”);for(i=0;i printf(“n NO %2d ”,i+1); for(j=0;j printf(“%8.2f”,score[i][j]); printf(“%8.2fn”,a_stu[i]);} printf(“naverage:”);for(j=0;j printf(“%8.2f”,a_cour[j]);printf(“n”); h=highest(); cour2 cour3 cour4 cour5 printf(“highest:%7.2f NO.%2d course %2dn”,h,r,c);printf(“variance %8.2fn”,s_var());} void input_stu(void){ int i,j;for(i=0;i printf(“ninput score of student%2d:n”,i+1); for(j=0;j scanf(“%f”,&score[i][j]);} } void aver_stu(void){ int i,j;float s;for(i=0;i for(j=0,s=0;j s+=score[i][j]; a_stu[i]=s/5.0;} } void aver_cour(void){ int i,j;float s;for(j=0;j s=0; for(i=0;i s+=score[i][j]; a_cour[j]=s/(float)N;} } float highest(){ float high;int i,j;high=score[0][0];for(i=0;i for(j=0;j if(score[i][j]>high) { high=score[i][j]; r=i+1; c=j+1; } return(high);} float s_var(void){ int i;float sumx,sumxn;sumx=0.0;sumxn=0.0;for(i=0;i sumx+=a_stu[i]*a_stu[i]; sumxn+=a_stu[i];} return(sumx/N-(sumxn/N)*(sumxn/N));} 7-14 写几个函数: 输入10个职工的姓名和职工号 按职工号由小到大的顺序排序,姓名顺序也随之调整。要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。 #include void main(){ void input(int [],char name[][8]);void sort(int [],char name[][8]);void search(int ,int [],char name[][8]);int num[N],number,flag=1,c;char name[N][8]; input(num,name);sort(num,name);while(flag==1){ printf(“ninput number to look for:”); scanf(“%d”,&number); search(number,num,name); printf(“continue ot not(Y/N)?”); getchar(); c=getchar(); if(c=='N'||c=='n') flag=0;} } void input(int num[],char name[N][8]){ int i;for(i=0;i printf(“input NO.: ”); scanf(“%d”,&num[i]); printf(“input name: ”); getchar(); gets(name[i]);} } void sort(int num[],char name[N][8]){ int i,j,min,templ;char temp2[8];for(i=0;i min=i; for(j=i;j if(num[min]>num[j]) min=j; templ=num[i]; strcpy(temp2,name[i]); num[i]=num[min]; strcpy(name[i],name[min]); num[min]=templ; strcpy(name[min],temp2);} printf(“n result:n”);for(i=0;i printf(“n %5d%10s”,num[i],name[i]);} void search(int n,int num[],char name[N][8]){ int top,bott,mid,loca,sign;top=0;bott=N-1;loca=0;sign=1; if((n loca=-1;while((sign==1)&&(top<=bott)){ mid=(bott+top)/2; if(n==num[mid]) { loca=mid; printf(“NO.%d , his name is %s.n”,n,name[loca]); sign=-1; } else if(n bott=mid-1; else top=mid+1;} if(sign==1 || loca==-1) printf(“%d not been found.n”,n);} 第八章 指针 8-1 1 输入3个整数,按由小到大的顺序输出 #include int *p1,*p2,*p3;p1=&a;p2=&b;p3=&c;scanf(“%d,%d,%d”,p1,p2,p3);if(*p1>*p2)swap(p1,p2);if(*p1>*p3)swap(p1,p3);if(*p2>*p3)swap(p2,p3);printf(“%d,%d,%dn”,a,b,c);} void swap(int*p1,int*p2){ int p;p=*p1;*p1=*p2;*p2=p;} 8-2 输入3个整数按有小到大的顺序输出。#include void main(){ void swap(char *,char *);char str1[20],str2[20],str3[20];printf(“input three line:n”);gets(str1);gets(str2);gets(str3); if(strcmp(str1,str2)>0) swap(str1,str2);if(strcmp(str1,str3)>0) swap(str1,str3);if(strcmp(str2,str3)>0) swap(str2,str3);printf(“Now,the order is:n”);printf(“%sn%sn%sn”,str1,str2,str3);} void swap(char *p1,char *p2){ char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 8-3 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:1输入10个数;2 进行处理;3 输出10个数 #include void main(){ void input(int *); void max_min_value(int *); void output(int *);int number[10]; input(number); max_min_value(number); output(number); } void input(int *number) { int i;printf(“input 10 numbers:”);for(i=0;i<10;i++) scanf(“%d”,&number[i]);} void max_min_value(int *number) { int *max,*min,*p,temp;max=min=number;for(p=number+1;p if(*p>*max) max=p; else if(*p<*min) min=p; temp=number[0];number[0]=*min;*min=temp; if(max==number) max=min;temp=number[9];number[9]=*max;*max=temp;} void output(int *number) { int *p;printf(“Now,they are: ”);for(p=number;p printf(“%d ”,*p);printf(“n”);} 8-7 有一个字符窜,包含n个字符。写一个函数,将此字符窜中从m个字符开始的全部字符复制成为另一个字符窜。 #include void main(){ void copystr(char *,char *,int); int m;char str1[20],str2[20]; printf(“input string:”);gets(str1); printf(“which character that begin to copy?”);scanf(“%d”,&m); if(strlen(str1) printf(“input error!”);else { copystr(str1,str2,m); printf(“result:%sn”,str2);} } void copystr(char *p1,char *p2,int m) { int n;n=0;while(n n++; p1++;} while(*p1!=' '){ *p2=*p1; p1++; p2++;} *p2=' ';} 8-9 写一个函数,使给定的一个3x3的二维整形数组转置,即行列转换。 #include void main(){ void move(int *pointer);int a[3][3],*p,i;printf(“input matrix:n”); for(i=0;i<3;i++) scanf(“%d %d %d”,&a[i][0],&a[i][1],&a[i][2]); p=&a[0][0];move(p); printf(“Now,matrix:n”);for(i=0;i<3;i++) printf(“%d %d %dn”,a[i][0],a[i][1],a[i][2]);} void move(int *pointer){ int i,j,t;for(i=0;i<3;i++) for(j=i;j<3;j++) { t=*(pointer+3*i+j); *(pointer+3*i+j)=*(pointer+3*j+i); *(pointer+3*j+i)=t; } } 8-13 将n个数按输入顺序的逆序排列,用函数实现。 #include void main(){ void sort(char *p,int m);int i,n;char *p,num[20]; printf(“input n:”);scanf(“%d”,&n); printf(“please input these numbers:n”);for(i=0;i scanf(“%d”,&num[i]); p=&num[0];sort(p,n); printf(“Now,the sequence is:n”);for(i=0;i printf(“%d ”,num[i]);printf(“n”);} void sort(char *p,int m){ int i;char temp, *p1,*p2;for(i=0;i p1=p+i; p2=p+(m-1-i); temp=*p1; *p1=*p2; *p2=temp;} } 第九章 用户建立的数据类型 9-1 定义一个结构体变量(包扩年、月、日)。计算该日在本年中的第几天,注意闰年问题。 #include struct { int year;int month;int day;}date; void main(){ int days;printf(“input year,month,day:”);scanf(“%d,%d,%d”,&date.year,&date.month,&date.day); switch(date.month){ case 1: days=date.day; break;case 2: days=date.day+31;break;case 3: days=date.day+59;break;case 4: days=date.day+90;break;case 5: days=date.day+120;break;case 6: days=date.day+151;break;case 7: days=date.day+181;break;case 8: days=date.day+212;break;case 9: days=date.day+243;break;case 10: days=date.day+273;break;case 11: days=date.day+304;break;case 12: days=date.day+334;break;} if((date.year %4== 0 && date.year % 100!= 0 ||date.year % 400 == 0)&& date.month >=3) days+=1; printf(“%d/%d is the in %d.n”,date.month,date.day,days,date.year);} %dth day 9-2 写一个函数days,实现第一题的计算,由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 clude struct { int year;int month;int day;}date; void main(){ int i,days;int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};printf(“input year,month,day:”);scanf(“%d,%d,%d”,&date.year,&date.month,&date.day); days=0;for(i=1;i days=days+day_tab[i];days=days+date.day;if((date.year%4==0 && date.year%100!=0 || date.year%400==0)&& date.month>=3) days=days+1; printf(“%d/%d is the in %d.n”,date.month,date.day,days,date.year);} %dth day 9-3 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num.name,score[3],用主函数输入这些记录,用print函数输出这些记录。 #include struct student { char num[6];char name[8];int score[4];}stu[N]; void main(){ void print(struct student stu[6]);int i,j;for(i=0;i printf(“ninput score of student %d:n”,i+1); printf(“NO.: ”); scanf(“%s”,stu[i].num); printf(“name: ”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%d”,&stu[i].score[j]); } printf(“n”);} print(stu);} void print(struct student stu[6]){ int i,j;printf(“n NO.name score1 score2 score3n”);for(i=0;i printf(“%5s%10s”,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); printf(“n”);} } 9-4 在第3题的基础上,编写一个函数input,用来输入5个学生的数据记录。 #include struct student { char num[6];char name[8];int score[4];} stu[N]; void main(){ void input(struct student stu[]);void print(struct student stu[]);input(stu);print(stu);} void input(struct student stu[]){ int i,j;for(i=0;i printf(“input scores of student %d:n”,i+1); printf(“NO.: ”); scanf(“%s”,stu[i].num); printf(“name: ”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%d”,&stu[i].score[j]); } printf(“n”);} } void print(struct student stu[6]){ int i,j;printf(“n NO.name score1 score2 score3n”);for(i=0;i printf(“%5s%10s”,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); printf(“n”);} } 9-5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总成绩,以及最高分的学生数据(包括学号、姓名、3门课程成绩、平均分数) #include struct student { char num[6];char name[8];float score[3];float avr;} stu[N]; void main(){ int i,j,maxi;float sum,max,average;for(i=0;i printf(“input scores of student %d:n”,i+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name:”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%f”,&stu[i].score[j]); } } average=0;max=0;maxi=0;for(i=0;i sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3.0; average+=stu[i].avr; if(sum>max) { max=sum; maxi=i; } } average/=N; printf(“ NO.name score1 score2 for(i=0;i printf(”%5s%10s“,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(”%9.2f“,stu[i].score[j]); printf(” %8.2fn“,stu[i].avr);} printf(”average=%5.2fn“,average);printf(”The highest score score3 averagen“);is : student %s,%sn”,stu[maxi].num,stu[maxi].name);printf(“his scores are:%6.2f,%6.2f,%6.2f,average:%5.2f.n”, stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);} C语言课后习题答案-第四版-第一章 5、请参照本章例题,编写一个C语言程序,输出以下信息: **************************** V e r y G o o d!**************************** #include printf(“**************************nn”);printf(“ Very Good!nn”);printf(“**************************n”);return 0;} 6、编写一个C语言程序,输入a,b,c三个值,输出其中最大值。#include 第3章 1、假如我国国民生产总值的年增长率为9%,计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为 P=(1+r)^n r 为年增长率,n 为年数,p为与现在相比的倍数。#include 2、存款利息计算。有1000元,想存5年,可按以下5种办法存:(1)一次存5年期。 (2)先存2年期,到期后将本息在存3年期。(3)先存3年期,到期后将本息在存2年期。 (4)先存1年期,到期后将本息在存1年期,连续存5次。(5)存活期存款。活期利息每一季度结算一次。2007年12月的银行存款利息如下: 1年定期存款利息为4.14%; 2年定期存款利息为4.68%; 3年定期存款利息为5.4%; 5年定期存款利息为5.85%; 活期存款利息为0.27%(活期利息每一季度结算一次。)如果r 为年利率,n 为存款年数,则计算本息和的公式为 1年期本息和:P=1000*(1+r);n年期本息和:P=1000*(1+n*r);存n次1年期的本息和:P=1000*(1+ r)^n;存活期本息和:P=1000*(1+r/4)^4n。 说明:P=1000*(1+r/4)^4n。是一个季度的本息和。#include // 一次存5年期 p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期 p3=p*(1+3*r3)*(1+2*r2); // 先存3年期,到期后将本息再存2年期 p4=p*pow(1+r1,5); // 存1年期,到期后将本息存再存1年期,连续存5次 p5=p*pow(1+r0/4,4*5); // 存活期存款。活期利息每一季度结算一次 printf(“p1=%fn”,p1); // 输出按第1方案得到的本息和 printf(“p2=%fn”,p2); // 输出按第2方案得到的本息和 printf(“p3=%fn”,p3); // 输出按第3方案得到的本息和 printf(“p4=%fn”,p4); // 输出按第4方案得到的本息和 printf(“p5=%fn”,p5); // 输出按第5方案得到的本息和 return 0;} 3、购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。设d为300000元,p为6000元,r为1%。对求得的月份取小数点后一位,对第2位按四舍五入处理。提示:计算还请月数m 的公式如下: m =[ log p –log(p-d*r)] / log(1+r)可以讲公式该写为 m ={ log [p /(p – d*r)] }/ log(1+r)C的库函数中有求对数的函数log10,是求以10为底的对数,log(p)表示log p。#include 6、请编将“China”,编译成密码,密码规律是:用原有的字母后面第4个字母代替原来的字母。#include 7、设圆半径r =1.5,圆柱高h=3,求圆周长、圆面积、圆柱表面积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。#include //要求输入圆半径r和圆柱高h l=2*pi*r; //计算圆周长l s=r*r*pi; //计算圆面积s sq=4*pi*r*r; //计算圆球表面积sq vq=3.0/4.0*pi*r*r*r; //计算圆球体积vq vz=pi*r*r*h; //计算圆柱体积vz printf(“圆周长为: l=%6.2fn”,l);printf(“圆面积为: s=%6.2fn”,s); printf(“圆球表面积为: sq=%6.2fn”,sq);printf(“圆球体积为: v=%6.2fn”,vq);printf(“圆柱体积为: vz=%6.2fn”,vz);return 0;} 第四章 4、有3个正整数a,b,c,有键盘输入,输出其中最大的数。#include if(b printf(“max=%dn”,c); else printf(“max=%dn”,b); else if(a printf(“max=%dn”,c);else } printf(“max=%dn”,a);return 0; 4、有3个正整数a,b,c,有键盘输入,输出其中最大的数。#include int a,b,c,temp,max;printf(“请输入三个整数:”);scanf(“%d,%d,%d”,&a,&b,&c);temp=(a>b)?a:b; /*将a和b中的大者存入temp中*/ max=(temp>c)?temp:c; /*将a和b中的大者与c比较,取最大者*/ printf(“三个整数的最大数是%dn”,max);return 0;} 5、从键盘输入一个小于1000的正整数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其检查是否为小于1000的正数。若不是,则要求从新输入。#include printf(“请输入一个小于%d的整数i:”,M);scanf(“%d”,&i);while(i>M) { printf(“输入的数不符合要求,请重新输入一个小于%d的整数i:”,M); } k=sqrt(i);printf(“%d的平方根的整数部分是:%dn”,i,k);return 0;} 6、有一个函数: scanf(“%d”,&i); x (x<1) y(1<=x<10) 3*x – 11 (x>=10)= 2*x1 (x<0) Y = 0 (x=0) (x>0) 写程序,输入x 的值,输出y 相应的值。#include int x,y; printf(“please enter x:”); scanf(“%d”,&x); y=0; if(x>=0) if(x>0)y=1; else y=-1; printf(“x=%d,y=%dn”,x,y);return 0;{ } 8、给出一百分制成绩,要求输出成绩等级‘A’,’B’,’C’,’D’,’E’。90分以上为‘A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。#include char grade; printf(“请输入学生成绩:”); scanf(“%f”,&score); while(score>100||score<0){ } switch((int)(score/10)){ case 10: case 9: grade='A';break;case 8: grade='B';break;case 7: grade='C';break;printf(“n 输入有误,请重输”);scanf(“%f”,&score);case 6: grade='D';break;case 5: case 4: case 3: case 2: case 1: case 0: grade='E';} printf(“成绩是 %5.1f,相应的等级是%cn ”,score,grade);return 0;} 9、给出一个不多于5位数的正整数;(1)求出它是几位数;(2)分别输出每一位数字; (3)按逆顺序输出各位数,例如原有数为123,应输出321.#include printf(“请输入一个整数(0-99999):”);scanf(“%d”,&num);if(num>9999) place=5;else if(num>999)place=4;else if(num>99)place=3;else if(num>9)place=2;else place=1;printf(“位数:%dn”,place);printf(“每位数字为:”);ten_thousand=num/10000;thousand=(int)(num-ten_thousand*10000)/1000;hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);printf(“n反序数字为:”);switch(place){ case 5: printf(“%d%d%d%d%dn”,indiv,ten,hundred,thousand,ten_thousand);break;case break;case 3:printf(“%d%d%dn”,indiv,ten,hundred);break;case 2: printf(“%d%dn”,indiv,ten);break;case 1: printf(“%dn”,indiv);break;} return 0;} 11、输入4个整数,要求按由小到大的顺序输出。#include { t=a;a=b;b=t;} if(a>c)4: printf(“%d%d%d%dn”,indiv,ten,hundred,thousand); { t=a;a=c;c=t;} if(a>d) { t=a;a=d;d=t;} if(b>c) { t=b;b=c;c=t;} if(b>d) { t=b;b=d;d=t;} if(c>d) { t=c;c=d;d=t;} printf(“排序结果如下: n”);printf(“%d %d %d %d n” ,a,b,c,d);return 0;} 12、有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为 1,这4个圆塔高位10cm, 塔以外无建筑物。求该点的建筑物高度(塔外的高度为零)。#include /*求该点到各中心点距离*/ d2=(x-x1)*(x-x1)+(y-y1)*(y-y1);d3=(x-x2)*(x-x2)+(y-y2)*(y-y2);d4=(x-x3)*(x-x3)+(y-y3)*(y-y3);if(d1>1 && d2>1 && d3>1 && d4>1) h=0;/*判断该点是否在塔外*/ printf(“该点高度为 %dn”,h);return 0;} 第五章 例5.7 用pi/4=1-1/3+1/5-1/7+„„公式求pi近似值,直到发现某一项的绝对值小于10^6为止。 #include // 程序中用到数学函数fabs,应包含头文件math.n int main(){ int sign=1,count=0; // sign用来表示数值的符号,count用来统计循环次数 double pi=0.0,n=1.0,term=1.0;// pi开始代表多项式的值,最后代表π的值,n 代 表 分 母,term代表当前项的值 while(fabs(term)>=1e-8) // 检查当前项term的绝对值是否大于或等于10的(-6)次方 { pi=pi+term; // 把当前项term累加到pi中 n=n+2; // n+2是下一项的分母 sign=-sign; // sign代表符号,下一项的符号与上一项符号相反 } pi=pi*4; // 多项式的和pi乘以4,才是π的近似值 printf(“pi=%10.8fn”,pi); // 输出π的近似值 printf(“count=%dn”,count); // 输出循环次数 return 0;} 3、输入两个正整数m和n,求其最大公约数和最小公倍数。#include // 求出下一项的值term count++; // count累加1 { int p,r,n,m,temp;printf(“请输入两个正整数n,m:”);scanf(“%d,%d,”,&n,&m);if(n temp=n; n=m; m=temp;} p=n*m;while(m!=0){ r=n%m; n=m; m=r;} printf(“它们的最大公约数为:%dn”,n);printf(“它们的最小公约数为:%dn”,p/n);return 0;} 4、输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。#include char c; int letters=0,space=0,digit=0,other=0; printf(“请输入一行字符:n”); while((c=getchar())!='n') { if(c>='a' && c<='z' || c>='A' && c<='Z') letters++; else if(c==' ') space++; else if(c>='0' && c<='9') digit++; else other++; } printf(“字母数:%dn空格数:%dn数字数:%dn其它字符数:%dn”,letters,space,digit,other); return 0; } 5、求Sn=a+aa+aaa+„„+aa„„a之值,其中a是一个数字,n 表示a 的位数。n 由键盘输入。#include } printf(“a+aa+aaa+...=%dn”,sn);return 0;} 6、求和:1!+2!+3!+„„+20!。#include t=t*n; s=s+t;} printf(“1!+2!+...+20!=%22.15en”,s);return 0;} 7、求1+2+3+„„+100+1+2^2+3^2+4^2++50^2+1+1/2+1/3+1/4+„„+1/10。#include {s1=s1+k;} for(k=1;k<=n2;k++)/*计算1到50各数的平方和*/ {s2=s2+k*k;} for(k=1;k<=n3;k++)/*计算1到10的各倒数和*/ „ „ {s3=s3+1/k;} printf(“sum=%15.6fn”,s1+s2+s3);return 0;} 8、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如153是一位水仙花数,因为153=13+53+33。#include } printf(“n”);return 0;i=n/100;j=n/10-i*10;k=n%10;if(n==i*i*i + j*j*j + k*k*k)printf(“%d ”,n);} 9、编程求1000之内的完数,并按下面格式输出其因子:its factors are 1,2,3 #include s=0;for(i=1;i if((m%i)==0)s=s+i;if(s==m){ } printf(“%d,its factors are ”,m);for(i=1;i } return 0;} 10、有一个分数序列: 2/1,3/2,5/3,8/5,13/8,21/13,„„ 求出这个数列前20项之和。#include } printf(“sum=%16.10fn”,s);return 0;} 11、一个球从100米敢赌下落,每次反弹高度为原来的一半,在下落,在反弹。求第10次落地时共经过多少米?第10次反弹多高? #include } printf(“第10次落地时共经过%f米n”,sn);printf(“第10次反弹%f米n”,hn);return 0;} 12、猴子吃桃问题。猴子第1天摘了若干个桃子,当即吃了一半零一个;第2剩下的吃了一半零一个,一次循环。到第十天时想吃就剩下一个桃子。求第一天摘了几个桃子? #include /*第n次落地时共经过的米数*/ hn=hn/2; /*第n次反跳高度*/ while(day>0){ x1=(x2+1)*2; /*第1天的桃子数是第2天桃子数加1后的2倍.*/ } printf(“total=%dn”,x1);return 0;} 16、输出以下图案: * *** ***** ******* ***** *** * #include for(j=0;j<=2-i;j++) printf(“ ”); for(k=0;k<=2*i;k++) printf(“*”); printf(“n”);} for(i=0;i<=2;i++){ for(j=0;j<=i;j++) printf(“ ”); for(k=0;k<=4-2*i;k++) printf(“*”); printf(“n”);} return 0;} 17、甲队A,B,C 3 人,乙队 X,Y,Z 3人。A不和X比;X,Z比,请编程找出3 对赛手的名单。#include int main(){ C不和 char i,j,k; /*是a的对手;j是b的对手;k是c的对手*/ for(i='x';i<='z';i++) } 第六章 1、用筛选法求100之内的素数。#include for(i=1;i<=100;i++) a[i]=i; a[1]=0; for(i=2;i if(i!=j) for(k='x';k<='z';k++) if(i!=k && j!=k) if(i!='x' && k!='x' && k!='z') printf(“A--%cnB--%cnC--%cn”,i,j,k); return 0; for(j=i+1;j<=100;j++) { if(a[i]!=0 && a[j]!=0) if(a[j]%a[i]==0) a[j]=0; } printf(“n”); for(i=2,n=0;i<=100;i++){ if(a[i]!=0) { printf(“%5d”,a[i]); n++; } if(n==10) { printf(“n”); n=0; } } printf(“n”); return 0;} 2、用选择法对10个整数排序。#include printf(“enter data:n”); for(i=1;i<=10;i++) { printf(“a[%d]=”,i); scanf(“%d”,&a[i]); } printf(“n”); printf(“The orginal numbers:n”); for(i=1;i<=10;i++) printf(“%5d”,a[i]); printf(“n”); for(i=1;i<=9;i++){ min=i; for(j=i+1;j<=10;j++) if(a[min]>a[j])min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf(“nThe sorted numbers:n”); for(i=1;i<=10;i++) printf(“%5d”,a[i]); printf(“n”); return 0;} 3、求一个3 x 3 的整型矩阵对角线元素之和。#include printf(“enter data:n”); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf(“%3d”,&a[i][j]); for(i=0;i<3;i++) sum=sum+a[i][i]; printf(“sum=%6dn”,sum); return 0;} 4、有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。#include int temp1,temp2,number,end,i,j; printf(“array a:n”); for(i=0;i<10;i++) printf(“%5d”,a[i]); printf(“n”); printf(“insert data:”); scanf(“%d”,&number); end=a[9]; if(number>end) a[10]=number; else { for(i=0;i<10;i++){ if(a[i]>number) { temp1=a[i]; a[i]=number; for(j=i+1;j<11;j++) { temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } printf(“Now array a:n”); for(i=0;i<11;i++) printf(“%5d”,a[i]); printf(“n”); return 0;} 5、将一个数组中的值按逆顺序重新存放。例如:8,6,5,4,1。要求改为:1,4,5,6,8.。#include printf(“enter array a:n”); for(i=0;i scanf(“%d”,&a[i]); printf(“array a:n”); for(i=0;i printf(“%4d”,a[i]); for(i=0;i 素的值互换 { temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } printf(“nNow,array a:n”);for(i=0;i printf(“%4d”,a[i]); //循环的作用是将对称的元 printf(“n”); return 0;} 6、输出以下杨辉三角形(要求输出10行)。1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 „„„„„„„„„„„„ #include for(i=0;i { a[i][i]=1; a[i][0]=1; } for(i=2;i for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i printf(“%6d”,a[i][j]); printf(“n”); } printf(“n”); return 0;} 7、输出“魔方阵”。所谓魔方阵就是每行每列和对角线之和相等。例如: 1 6 3 5 7 4 9 2 要求输出1~n^2的自然数构成的魔方阵。#include p=1; while(p==1){ printf(“enter n(n=1--15):”); scanf(“%d”,&n); if((n!=0)&&(n<=15)&&(n%2!=0)) p=0; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0; j=n/2+1; a[1][j]=1; for(k=2;k<=n*n;k++){ i=i-1; j=j+1; if((i<1)&&(j>n)) { i=i+2; j=j-1; } else { if(i<1)i=n; if(j>n)j=1; } if(a[i][j]==0) a[i][j]=k; else { i=i+2; j=j-1; a[i][j]=k; } } for(i=1;i<=n;i++) {for(j=1;j<=n;j++) printf(“%5d”,a[i][j]); printf(“n”); } return 0;} 9、有15个数按由大到小顺序存放在一个数组中,输入一个数,要求折半查找法找出该数是数组中第几个元素值。如果不在数组中则输出“无此数”。#include int i,number,top,bott,mid,loca,a[N],flag=1,sign; char c; printf(“enter data:n”); scanf(“%d”,&a[0]); i=1; while(i { scanf(“%d”,&a[i]); if(a[i]>=a[i-1]) i++; else printf(“enter this data again:n”); } printf(“n”); for(i=0;i printf(“%5d”,a[i]); printf(“n”); while(flag){ printf(“input number to look for:”); scanf(“%d”,&number); sign=0; top=0; //top是查找区间的起始位置 bott=N-1; //bott是查找区间的最末位置 if((numbera[N-1]))//要查的数不在查找区间内 loca=-1; // 表示找不到 while((!sign)&&(top<=bott)) {mid=(bott+top)/2; if(number==a[mid]) { loca=mid; printf(“Has is %dn”,number,loca+1); sign=1; } else if(number bott=mid-1; else found %d,its position top=mid+1; } if(!sign||loca==-1) printf(“cannot find %d.n”,number);; printf(“continu or not(Y/N)?”); scanf(“ %c”,&c); if(c=='N'||c=='n') flag=0; } return 0; } 10、有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符个数。 #include char text[3][80]; upp=low=dig=spa=oth=0; for(i=0;i<3;i++) { printf(“please input line %d:n”,i+1); gets(text[i]); for(j=0;j<80 && text[i][j]!=' ';j++) { if(text[i][j]>='A'&& text[i][j]<='Z') upp++; else if(text[i][j]>='a' && text[i][j]<='z') low++; else if(text[i][j]>='0' && text[i][j]<='9') dig++; else if(text[i][j]==' ') spa++; else oth++; } } printf(“nupper case: %dn”,upp); printf(“lower case: %dn”,low); printf(“digit : %dn”,dig); printf(“space : %dn”,spa); printf(“other : %dn”,oth);return 0;} 11、输出以下图案:* * * * * * * * * * * * * * * * * * * * * * * * * #include int i,j,k; char space=' '; for(i=0;i<5;i++) { printf(“n”); printf(“ ”); for(j=1;j<=i;j++) printf(“%c”,space); for(k=0;k<5;k++) printf(“%c”,a[k]); } printf(“n”); return 0;} 12、有一行电文,已按下面规律译成密码:A>Z,B>Y,C>X„„a>z,b>y,c>x„„ 编程译回原文并输出密码和原文。#include char ch[80],tran[80]; printf(“input cipher code:”); gets(ch); printf(“ncipher code :%s”,ch); j=0; while(ch[j]!=' ') { if((ch[j]>='A')&&(ch[j]<='Z')) tran[j]=155-ch[j]; else if((ch[j]>='a')&&(ch[j]<='z')) tran[j]=219-ch[j]; else tran[j]=ch[j]; j++; } n=j; printf(“noriginal text:”); for(j=0;j putchar(tran[j]); printf(“n”); return 0;} 12、有一行电文,已按下面规律译成密码:a>z,b>y,c>x„„ 编程译回原文并输出密码和原文。#include char ch[80]; printf(“input cipher code:n”); gets(ch); printf(“ncipher code:%sn”,ch); j=0; while(ch[j]!=' ') A>Z,B>Y,C>X„„ { if((ch[j]>='A')&&(ch[j]<='Z')) ch[j]=155-ch[j]; else if((ch[j]>='a')&&(ch[j]<='z')) ch[j]=219-ch[j]; else ch[j]=ch[j]; j++; } n=j; printf(“original text:”); for(j=0;j putchar(ch[j]); printf(“n”); return 0;} 15、编写一个程序,将S2中的全部字符复制到字符数组S1中。不用strcpy函数。复制时‘ ’ 也要复制过去。‘ ’后面的字符不复制。#include int i=0,j=0; printf(“input string1:”); scanf(“%s”,s1); printf(“input string2:”); scanf(“%s”,s2); while(s1[i]!=' ') i++; while(s2[j]!=' ') s1[i++]=s2[j++]; s1[i]=' '; printf(“nThe new string is:%sn”,s1); return 0;} 15、编写一个程序,将S2中的全部字符复制到字符数组S1中。不用strcpy函数。复制时‘ ’ 也要复制过去。‘ ’后面的字符不复制。#include int i; printf(“input s2:”); scanf(“%s”,s2); for(i=0;i<=strlen(s2);i++) s1[i]=s2[i]; printf(“s1:%sn”,s1); return 0;} 第七章 1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。程序有误 #include int lcd(int,int,int); int u,v,h,l; scanf(“%d,%d”,&u,&v); h=hcf(u,v); printf(“H.C.F=%dn”,h); l=lcd(u,v,h); C语言程序设计实验报告 学院 数学与信息技术 班级 学号 11130730 姓名 指导教师 实验1 简单程序设计 1.实验目的 (1)熟悉C语言开发环境并掌握在该环境下如何编辑、编译、连接和运行一个C程序。(2)通过运行一个简单的C程序过程,初步了解C程序的基本结构及特点。 2. 实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)输入三个整数,请把这三个数由小到大输出。试编写多种方法。(3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 3.实验重点和难点 (1)C程序是由一个个函数构成,当一个函数调用另一个函数时,需要对被调函数作声明。(2)用户自定以的函数最好写在一个头文件中,在需要的地方用文件包含命令即可。 (3)system(“cls”)函数的作用是清屏,它的声明在头文件stdlib.h中。如果是在Linux操作系统的gcc环境下,清屏用system(”clear”)。 4. 常见错误 (1)数据声明或语句后面缺少分号。(2)对被调函数没有声明。 (3)没有main函数或者有多个main函数。 5. 程序代码 #include t=a;a=b;b=t;} if(a>c){t=a;a=c;c=t;} if(b>c){t=b;b=c;c=t;} printf(“%5.2f,%5.2f,%5.2fn”,a,b,c);} 6. 实验结果 7. 心得体会 刚开始学习C语言,有一些小问题,数据声明时,分号会忘记,语句后面缺少分号。而且n斜杠会写反,有时会忘记声明函数。 实验2 顺序结构程序设计 1.实验目的 (1)掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量。(2)掌握数据的输入输出的方法,能正确使用各种格式控制符。(3)掌握算术运算符和赋值运算符。 2. 实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)输入圆半径和圆柱高,求圆周长、圆面积、圆球表面积、圆球体积和圆柱体积。输入输出要有文字说明,输出结果取小数点后2位。(3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 3.实验重点和难点 (1)用scanf和printf对数据进行输入输出时,不同的数据类型用不同的格式控制符。(2)scanf函数中的格式控制后面应当是变量地址,而不是变量名。 4. 常见错误 (1)变量没有定义,直接使用。 (2)企图利用整数除以整数得到精确结果。例如1/4结果不是0.25而是0,1/4.0结果才是0.25。(3)printf和scanf函数中格式控制符的个数与变量或变量地址的个数不一致。(4)scanf函数的地址表列因该是变量地址,而不是变量名。 (5)scanf函数在格式控制字符串中除了格式说明以外还有其他字符时,在输入数据时(6)没有在对应的位置输入与这些字符相同的字符。 5. 程序代码 #include s=r*r*p;//圆面积 sq=4*p*r*r;//圆球表面积 vq=4.0/3.0*p*r*r*r;//圆球体积 vz=p*r*r*h;//圆柱体积 printf(“圆周长为: l=%6.2fn”,l);printf(“圆面积为: s=%6.2fn”,s);printf(“圆球表面积为: sq=%6.2fn”,sq);printf(“圆球体积为: vq=%6.2fn”,vq);printf(“圆柱体积为: vz=%6.2fn”,vz);return 0;} 6. 实验结果 7. 心得体会 这边是基础的用scanf和printf对数据进行输入输出,不同的数据类型用不同的格式控制符。有点小睇混淆。才刚开始,还是觉得挺简单的。 实验3 选择结构程序设计 1.实验目的 (1)了解C语言表示逻辑变量的方法(2)学会正确使用关系运算符和逻辑运算符。(3)熟练掌握if语句和switch语句。 2. 实验要求 (1)认真阅读和掌握和本实验相关的教材内容。(2)把百分制成绩转换成5级记分制,要求分别用if else 和switch语句。 90分以上(包括90): A 80至90分(包括80):B 70至80分(包括70):C 60至70分(包括60):D 60分以下:E (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 3.实验重点和难点 (1)注意关系运算符==和复制运算符=的区别。(2)if和else的匹配原则。 (3)在switch语句中正确使用break。 4. 常见错误 (1)赋值运算符=和关系运算符等号=搞混。(2)在if语句为复合语句时,忘记写{}。(3)if语句出现嵌套时,没正确配对。(4)switch语句中,没正确使用break。 5. 程序代码 #include printf(“n输入有误,请重新输入!”); scanf(“%f”,&score);} switch((int)(score/10)){ case 10: case 9:grade='A';break;case 8:grade='B';break;case 7:grade='C';break;case 6:grade='D';break;case 5: case 4: } case 3: case 2: case 1: case 0:grade='E';} printf(“成绩是%5.1f,相应的等级是%cn”,score,grade);return 0;6. 实验结果 7. 心得体会 赋值运算符=和关系运算符等号=搞混。在if语句为复合语句时,忘记写{}。if语句出现嵌套时,没正确配对。 实验4 循环结构程序设计 1.实验目的 (1)熟练掌握循环语句中的for语句、while语句和do while语句的使用方法,以及这三种循环语句之间的转换方法。 (2)掌握编写循环结构程序的方法。 2. 实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)通过键盘输入任意两个正整数,求其最大公约数和最小公倍数。(3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 3.实验重点和难点 (1)循环结构程序的设计方法。 (2)while和do while循环之间的转换方法。 (3)getch函数从键盘接收一个字符,该函数被调用后程序会暂停,等待按任意键,再继续执行后续的语句,以便我们观察中间结果。在VC++下需要包含conio.h头文件,在Linux下需要包含头文件curses.h。由于在Linux下getch函数还需要与其它函数配合使用才能达到上面所说的功能并且在编译时还要指定链接所使用的库文件,所以在Linux环境建议使用两次调用getchar函数来替换getch函数。 4. 常见错误 (1)循环体为复合语句时,没用{}括起来。 (2)在while()和for()后面添加分号,使得循环体为空语句。(3)for括号里的分号和逗号用错。 (4)循环嵌套时,内循环的初始条件和循环体没正确设计好。 5. 程序代码 #include printf(“最小公倍数:%dn”,p);return 0;} 6. 实验结果 7. 心得体会 循环体为复合语句时,没用{}括起来。在while()和for()后面添加分号,使得循环体为空语句。for括号里的分号和逗号用错。循环嵌套时,内循环的初始条件和循环体没正确设计好。 实验5 数组的应用 1.实验目的 (1)掌握一维数组和二维数组的定义和引用。(2)掌握字符数组和字符串函数的使用。(3)掌握与数组有关的算法(特别是排序算法)。 2. 实验要求 (1)认真阅读和掌握和本实验相关的教材内容。(2)用选择法对10个整数排序。(3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 3.实验重点和难点 (1)在循环中,数组元素的引用。 (2)起泡排序法、选择排序法和插入排序法。 4. 常见错误 (1)数组定义时,没规定数组长度或者长度为一变量。(2)循环中数组元素的下标没正确表示。 (3)起泡排序、选择排序和插入排序算法没理解透。 (4)起泡排序、选择排序和插入排序中,循环的初始条件和终止条件出现错误。(5)字符串的复制和比较直接使用赋值运算符和关系运算符。 5. 程序代码 #include for(j=i+1;j<10;j++) if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } printf(“选择排列:n”);for(i=0;i<10;i++) printf(“%5d”,a[i]);printf(“n”);return 0;} 6. 实验结果 7. 心得体会 数组定义时,没规定数组长度或者长度为一变量。循环中数组元素的下标没正确表示。起泡排序、选择排序和插入排序算法没理解透。起泡排序、选择排序和插入排序中,循环的初始条件和终止条件出现错误。字符串的复制和比较直接使用赋值运算符和关系运算符。 实验6 函数的应用 1.实验目的 (1)掌握函数的定义和调用方法。 (1)掌握函数实参与形参的对应关系,以及“值传递”的方式。(1)掌握函数的嵌套调用和递归调用的方法。 (1)掌握全局变量和局部变量,动态变量以及静态变量的概念和使用方法。 2. 实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)写一个函数,用“起泡法”对输入的10个字符按由小到大的顺序排列,主函数通过调用它实现题目要求。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 3.实验重点和难点 (1)函数的定义和调用方法。 (2)函数的实参数为数组时,形参的形式以及实参和形参之间的数据传递方式。(3)函数的递归调用。 4. 常见错误 (1)函数没定义,就被调用。(2)函数定义了,又没被调用。(3)定义函数时,形参没规定类型。(4)函数调用时,实参前加类型。(5)被调函数没有声明 (6)嵌套调用和递归调用没理解透,使用错误。(7)全局变量和局部变量有效范围没能正确区分。 5. 程序代码 #include第二篇:C语言习题(详细解答)
第三篇:C语言课后习题解答
第四篇:C语言课后习题答案
第五篇:c语言课后习题