第一篇:c语言程序设计(科学出版社)课后习题解答
第3章习题解答
第1章
1.C 语言程序主要由预处理命令、函数、注释等组成。
2.填空
(1)分号
(2)main(3)stdio.h 3.源程序:
#include
printf(“*************************n”);printf(“Hello World!n”);
printf(“*************************”);} 4.源程序:
#include
int a, b, c;/* 定义变量 */
scanf(“%d”, &a);/* 输入第一个整数 */ scanf(“%d”, &b);/* 输入第二个整数 */ c=a-b;/*
计算差 */
printf(“%d-%d=%d”,a,b,c);/* 输出结果 */ } 5.(1)
(3)printf(“s=%dn”,s);
第2章
1.(1)c(2)a(3)b g(4)a d e(5)d
2.a.5 b.295
c.4 d.29 e.9 3.a.x=4,y=6
b.x=4,y=3 f.x=3,y=6 4.16 5.#include
int a,b,c;
scanf(“%d%d”,&a,&b);c=a*b;
printf(“%d*%d=%d”,a,b,c);}
第3章
1.(1)b(2)b(3)d(4)a(5)b 2.(1)&a,&b(2)l,s
3.printf(“x=%.2f,y=%.2fn”,x,y);
4.#include
int num1,num2,num3,sum;
float average;
scanf(“%d%d%d”,&num1,&num2,&num3);
sum=num1+num2+num3;
average=sum/3.0;
printf(“sum=%d,average=%.2fn”,sum,average);} 5.#include
int hour,minute,second,total;/* 定义变量代表时、分、秒和总秒数 */
scanf(“%d”,&total);
hour=total/3600;
minute=total%3600/60;
second=total%3600%60;
printf(“%dhours:%dminutes:%dsecondsn”,hour,minute,second);}
第4章
1.(1)a(2)b(3)b(4)b
(5)b 2.0 3.(1)6(2)4(3)1(4)1 4.#include
int x,y;
scanf(“%d”,&x);
if(x>-5 && x<0)
y=5*x;
if(x == 0)
y=-1;
if(x>0 && x<10)
y=2*x+1;
printf(“x=%d,y=%dn”,x,y);} 5.#include
int score,rank;/* score 表示成绩,rank 表示级别 */
printf(“Please input score:”);
scanf(“%d”,&score);
rank=score/10;
switch(rank)
{
case 10:
case 9: printf(“成绩等级为:An”);break;
case 8: printf(“成绩等级为:Bn”);break;
case 7: printf(“成绩等级为:Cn”);break;
case 6: printf(“成绩等级为:Dn”);break;
default:printf(“成绩等级为:En”);break;
} } 6.#include
int n;
printf(“Please input the digit:”);
scanf(“%d”,&n);
switch(n)
{
case 1:printf(“Jan n”);break;
case 2:printf(“Feb n”);break;
case 3:printf(“Mar n”);break;
case 4:printf(“Apr n”);break;
case 5:printf(“May n”);break;
case 6:printf(“Jun n”);break;
case 7:printf(“Jul n”);break;
case 8:printf(“Agu n”);break;
case 9:printf(“Sep n”);break;
case 10:printf(“Oct n”);break;
case 11:printf(“Nov n”);break;
case 12:printf(“Dec n”);break;
} }
第5章
1.(1)b(2)a(3)b(4)d(5)d 2.7,1 3.y=-1 4.m=6 5.10,14 6.3 7.5
8.ABABCDCD 9.# include
int i;
long int sum=0;
for(i=2;i<=200;i+=2)
sum+=i;
printf(“2+4+6+...+200=%ld”,sum);} 10.#include
long int n;
int sum = 0;
printf(“Please input the nber:”);
scanf(“%ld”,&n);
while(n!= 0)
{
sum += n % 10;
n /= 10;
}
printf(“%dn”, sum);}
第6章
1.(1)d(2)b(3)d(4)c
(5)a 2.11 3.3 4.5689 5.12,6
6.(1)i--(2)n
7.(1)char k;
(2)i
float a[10];
int i;
float sum=0,average;
for(i=0;i<10;i++)
{
printf(“a[%d]=?”,i);
scanf(“%f”,&a[i]);
sum+=a[i];
}
average=sum/10;
printf(“average is %.2fn”,average);} 9.#include
int a[N],i,target,found;
for(i=0;i scanf(“%d”,&a[i]); printf(“Please input a number:”); scanf(“%d”,&target); i=0; while(i i++; found = i printf(“%dn”,found);} 10.#include char str[N]; int len=0,i=0; printf(“Please input a string:”); gets(str); while(str[i++]!= 0)len++; printf(“the length of string is %d.n”,len);} 第7章 1.21 2.136 3.16 4.(1)func (2)m++ 5.9 6.1,6,3,2,3 7.2,5,1,2,3,-2 8.#include int a,b,c,max; printf(“Please input three numbers:”); scanf(“%d%d%d”,&a,&b,&c); max=fun(a,b,c); printf(“Max is %d.n”,max);} int fun(int a,int b,int c){ int max; max= a>b?(a>c?a:c):(b>c?b:c); return max;} 9.#include int n; printf(“n=?”); scanf(“%d”,&n); printf(“Sum=%ld.n”,sum(n));} long int sum(int n){ if(n = = 1)return 1; else return sum(n-1)+n;} 10.#include int n; printf(“n=?”); scanf(“%d”,&n); fun(n); } void fun(n){ if(n = = 0)return; else { fun(n/2); printf(“%-2d”,n%2); } } 第8章 1.(1)b(2)d(3)b(4)c(5)c 2.8 3.123456789 4.2 3 4 5 6 5.345 6.1 2 3 4 5 6 7.b[i] 8.bcdefgha 9.p=sum 10.#include { char str[80]; char *p1, *p2;gets(str);p1=str; p2=str+strlen(str)-1; while(p1 puts(p1 } 第9章 1.a.#define F(x)(x)*(x)*(x)b.#define F(x)(x)%4 c.#define F(x,y)(x)*(y)<100?1:0 2.a.4 b.4 c.#define DOUBLE(x)2*(x)3.d 4.-20 5.N is undefined 6.7.5 7.y=6 8.#include #define SWAP(a,b){int temp;temp=a;a=b;b=temp;} main(){ int x,y; printf(“x=?”); scanf(“%d”,&x); printf(“y=?”); scanf(“%d”,&y); SWAP(x,y) printf(“x=%d,y=%d.n”,x,y);} 第10章 1.struct student{ int sno; char sname[10]; char sex;}stu1,stu2;2.12 3.合法的有a,b,d c.改成 s.u.rectangle.length=25; e.改成 s.u.circle.radius=5; f.改成 s.u.circle.radius=5; 4.a,b,c,d(说明:变量 b 有确定的值之后,b++是合法的。)5.改为 typedef struct product { char name[10];float price;}PRODUCT; PRODUCT products[10]; 6.(1)struct employee(2)printemp(emp)7.2 4 3 9 8 8.#include int hour; int minute; int second;}; main(){ struct time_struct time; printf(“Input time?n(Example 18:28:38)n”); scanf(“%d:%d:%d”,&time.hour,&time.minute,&time.second); printf(“Time is %d:%d:%dn”,time.hour,time.minute,time.second);} 9.#include int hour; int minute; int second;}time; void enter_time();void display_time();main(){ enter_time(); display_time();} void enter_time(){ printf(“Enter the time(example 18:28:38)?”); scanf(“%d:%d:%d”,&time.hour,&time.minute,&time.second);} void display_time(){ printf(“Time is %d:%d:%d.n”,time.hour,time.minute,time.second);} 10.#include char name[31];/*旅馆名称*/ char address[31];/*旅馆地址*/ int grade;/*旅馆级别*/ float average_charge;/*平均房价*/ int number;/*房间数量*/ }h[N]={ {“h1”,“上海路”,5,500.00,80}, {“h2”,“北京大街”,5,480.00,70}, {“h3”,“南京大街”,3,300.50,100} }; main(){ int grade,i; printf(“请输入级别(3-5)?”); scanf(“%d”,&grade); for(i=0;i if(h[i].grade==grade) printf(“名称:%sn 地址:%sn 级别:%dn平均房价%.2fn 房间数量:%dn”,h[i].name,h[i].address,h[i].grade,h[i].average_charge,h[i].number);} 第11章 1.(1)c (2)d(3)b(4)b(5)b 2.Basican 3.fgetc(fp) 4.“record.dat”, “w” 5.#include typedef struct Employee { int id; char name[20]; char gender[20]; int age; char address[20];}Employee; int main(void){ FILE *fp; char another,choice; Employee emp; long int recsize; fp=fopen(“employee.dat”,“rb+”); if(fp==NULL) { fp=fopen(“employee.dat”,“wb+”); if(fp==NULL) { printf(“Can't Open File”); exit(0); } } recsize=sizeof(emp); while(1) { printf(“1.添加记录 2.显示男员工 3.退出n”); printf(“Enter your choice(1-3):”); fflush(stdin); scanf(“%c”,&choice); switch(choice) { case'1': fseek(fp,0,SEEK_END); another='Y'; while(another=='Y'|| another=='y') { printf(“输入信息(id 姓名 性别 年龄 住址):n”); scanf(“%d %s %s %d %s”,&emp.id,&emp.name,&emp.gender,&emp.age,&emp.address); fwrite(&emp,recsize,1,fp); printf(“是否继续(Y/N): ”); fflush(stdin); another=getchar(); } break; case '2': printf(“学号t 姓名t性别t 年龄t住址n”); rewind(fp); while(fread(&emp,recsize,1,fp)==1) if(strcmp(emp.gender,“男”)==0) printf(“%dt%st%st%dt%sn”,emp.id,emp.name,emp.gender,emp.age,emp.address); break; case '3': fclose(fp); exit(0); } } } 6.#include“stdio.h” #include“stdlib.h” #define M 2 #define stu struct student stu { int num; char name[20]; float s1; float s2; float s3; float avg;};main(){ stu st[M]; FILE *fp; int i; printf(“请输入 5 名同学生的成绩,按照学号,姓名,成绩 1,成绩2,成绩 3 的顺序,中间用空格隔 开:n”); for(i=0;i { scanf(“%d%s%f%f%f”,&st[i].num,st[i].name,&st[i].s1,&st[i].s2,&st[i].s3); st[i].avg=(st[i].s1+st[i].s2+st[i].s3)/3; } if((fp=fopen(“stud.rec”,“wb”))==NULL) { printf(“cannot open filen”); } for(i=0;i { if(fwrite(&st[i],sizeof(stu),1,fp)!=1) printf(“file write errorn”); } fclose(fp); fp=fopen(“stud.rec”,“rb”); printf(“numtnametscore1tscore2tscore3taveragen”); for(i=0;i { fread(&st[i],sizeof(stu),1,fp); printf(“%dt%st%.2ft%.2ft%.2ft%.2fn”,st[i].num,st[i].name,st[i].s1,st[i].s2,st[i].s3,st[i].avg); } fclose(fp);} 第12章 1.a.2 b.4 c.11 d.4 e.-15 f.28 g.-36 2.程序设计分析:先将整数x 右移4 位,将该整数机内码的第4 到7 位移至第0 到3 位,然后与0x000f(***1)进行位与运算,所保留的低4 位就是所要的结果 #include int x,y; scanf(“%d”,&x); y=x>>4;y=y&0x000f; printf(“4~7位的十六进制数:y=%#xn”,y);} 3.d 4.(1)p!=NULL (2)p=p->next 5.p=p->next 6.略 第七章 函数调用 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++程序设计》课后习题参考答案 ――武汉大学出版社 习题1参考答案 一、选择题 1.A 2.D 二、填空题 1.BASIC、FORTRAN、AL_GOL60和COBOL 2.8 3.关键字 4.编辑、编译、链接和运行 三、简答题 1.答: (1)C语言具有结构化的控制语句。C语言提供了结构化程序所必需的基本控制语句,实现了对逻辑流的有效控制。 (2)C语言具有丰富的数据结构类型。C语言除提供整型、实型、字符型等基本数据类型外,还提供了用基本数据类型构造出的各种复杂的数据结构,如数组、结构、联合等。C语言还提供了与地址密切相关的指针类型。此外,用户还可以根据需要自定义数据类型。(3)C语言具有丰富的运算符。C语言提供了多达34种运算符,丰富的数据类型与丰富的运算符相结合,使C语言的表达力更具灵活性,同时也提高了执行效率。 (4)C语言简洁、紧凑,使用方便、灵活,程序书写自由,有9种控制语句。 (5)C语言既具有高级语言的功能,又具有低级语言的许多功能,通常被称为中级计算机语言。它既是成功的系统描述语言,又是通用的程序设计语言。(6)C语言与汇编语言相比,可移植性好。 (7)功能强大。C语言具有低级语言的一些功能,所以,生成目标代码质量高,程序执行效率高。现在许多系统软件都用C语言来描述,可以大大提高了编程效率。 2.答:运行一个C语言程序,一般需要经过如下几个步骤:①上机输入并编辑源程序;②编译源程序;③与库函数连接;④生成可执行目标程序;⑤运行目标程序。3.答: (1)操作系统的设计与实现。C语言是一种应用非常广泛的结构化高级程序设计语言,既适合编写应用软件,又适合编写系统软件。(2)工业控制。由于C语言具有简洁、灵活、代码效率高、能进行位操作等优点,C语言大量应用在单板机、单片机上,以及嵌入式领域等。 (3)图形图像处理。C语言在内存管理和进程控制方面有丰富的指令,而且它能提供快速运行的代码,因而C语言适合进行图形程序设计。 (4)教学领域。C语言是理想的结构化程序设计语言,其描述能力强,应用十分广泛,因此广泛应用于教学领域。许多计算机相关课程,如数据结构及算法大多是用C语言进行描述的。 习题2参考答案 一、选择题 1.A 2.A 3.C 二、填空题 1.基本数据类型、构造数据类型、指针类型、空类型 2.反斜线“\” 3.枚举数据类型(Enumerated Data Type) 三、简答题 1.答: 在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四大类。 基本类型是数据类型的基础,由它可以构造出其他复杂的数据类型。基本类型的值不可以再分解为其他类型。C语言的基本类型包括整型、实型(浮点型)、字符型和枚举型。 C语言的构造类型包括数组类型、结构类型和联合类型。构造类型是根据已定义的一种或多种数据类型用构造的方法定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”或“元素”都是一个基本数据类型,或又是一个构造类型。 指针是一种特殊而又具重要作用的数据类型,其值表示某个量在内存中的地址。虽然指针变量的取值类似于整型量,但这是两种完全不同类型的量,一个是变量的数值,一个是变量在内存中存放的地址。 在调用函数时,被调用函数通常应向调用函数返回一个函数值。返回的函数值具有一定的数据类型,应在函数定义的函数说明中给以说明。例如,在例1-1中给出的max函数定义中,函数头为“int max(int a,int b,int c)”,其中写在函数名max之前的类型说明符“int”表示该函数的返回值为整型量。但是,也有一类函数,被调用后并不向调用函数返回函数值,这种函数可以定义为“空类型”(也称“无值型”),其类型说明符为void。 习题3参考答案 一、选择题 1.C 2.B 3.B 4.D 二、填空题 1.4字节,1字节,4字节,8字节 2.20 3.6 4.26 5.256 三、简答题 1.C语言的基本类型包括整型、实型(浮点型)、字符型和枚举型。 2.定义符号常量和定义变量都要指定数据类型,系统将为其分配一定的存储空间。其不同之处在于:定义符号常量必须给出常量值,且以后不能修改本常量的值;而变量可以在定义变量的同时赋初值,以后可以修改该变量。 3.常量就是在程序的运行过程中该量是不可修改的量;变量在程序的运行过程中允许对该变量的值进行修改。 四、程序题 1.程序运行结果为: 10 10 11-10-11 2.程序运行结果为: 3,12,4,4 习题4参考答案 一、选择题 1.C 2.D 3.C 4.C 5.B 6.D 7.B 8.C 9.B 二、填空题 1.!&& || 2.0 1 3.1 4.4 5.-1 三、编程题 1.给出等级成绩′A′、′B′、′C′、′D′、′E′,假设,90分以上为′A′,80~89分为′B′,70~79分为′C′,60~69分为′D′,60分以下为′E′,输入一个等级成绩,问属于哪一个分数段。参考代码如下: main(){ int score,m,n; char grade; n=1; while(n) { printf(“Please enter the score:”); scanf(“%d”,&score); if((score>100)||(score<0))printf(“n Wrong!n”); else n=0; } if(score==100)m=9; else m=(score-score%10)/10; switch(m) { case 0:case 1:case 2:case 3:case 4:case 5:grade='E';break; case 6:grade='D';break; case 7:grade='C';break; case 8:grade='B';break; case 9:grade='A'; } printf(“score=%d,grade=%cn”,score,grade);} 2.编程序打印出以下图形: 1 121 12321 „ ***21 参考代码如下: #include int i,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf(“%d”,j); for(j=i-1;j>0;j--) printf(“%d”,j); printf(“n”); } } 3.用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚? [提示:设5分、2分和1分的硬币各换x,y,z枚,依题意有x+y+z=100,5x+2y+z=150,由于每一种硬币都要有,故5分硬币最多可换28枚,2分硬币最多可换73枚,1分硬币可换100-x-y枚,x,y,z只需满足第2个方程即可打印,对每一组满足条件的x,y,z值,用计数器计数即可得到兑换方案的数目。] 参考代码如下: main(){ int x,y,z,s=0; for(x=1;x<=28;x++) for(y=1;y<=73;y++) for(z=1;z<=148;z++) { if(150==5*x+2*y+z) if(100==x+y+z){ printf(“x=%d y=%d z=%dn”,x,y,z); s++;} } printf(“s=%dn”,s);} 4.编程:从键盘输入正整数n,输出1+(1+2)+(1+2+3)+„„+(1+2+3+„+n)。参考代码如下: #include { t=t+i; s=s+t; } printf(“s=%dn”,s);} 习题5参考答案 一、选择题 1.B 2.A 3.A 4.D 5.C 6.B 7.A 8.A 二、填空题 1.按行的顺序依次存放的 2.0 3.4 4.6 三、编程题 1.有一个多项式:Pn(x)=a0xn+a1xn-1+„+an 它们的系数a0,a1,„,an存放在一个一维数组中。编制程序,输入系数和x的值,计算并输出Pn(x)。参考代码如下: #define N 4 main(){ int a[N+1],p,x,i; printf(“Please enter a[%d],...,a[0]:n”,N); for(i=N;i>=0;i--) scanf(“%d”,&a[i]); printf(“Please enter x=n”); scanf(“%d”,&x); p=a[N]; for(i=N;i>0;i--) { p=p*x+a[i-1]; } printf(“Pn(x)=%dn”,p);} 2.打印以下的杨辉三角形(要求打印6行)。1 11 121 1331 14641 15101051 参考代码如下: #include int i,j,max[N][N]; for(i=0;i { for(j=0;j { max[i][0]=1; max[i][i]=1; } } for(i=2;i { for(j=1;j { max[i][j]=max[i-1][j-1]+max[i-1][j];} } for(i=0;i { for(j=0;j<=i;j++) { printf(“%d”,max[i][j]);} printf(“n”); } } 3.编写程序,将一个数插入到有序的数列中去,插入后的数列仍然有序。参考代码如下:/*假设原有5个数*/ #include main() { int a[6]={1,2,6,10,15}; int n,i,j; printf(“Please enter the insert number:”); scanf(“%d”,&n); for(i=0;i<5;i++) if(n>a[i]) continue; else break; for(j=4;j>=i;j--) a[j+1]=a[j]; a[i]=n; for(i=0;i<6;i++) printf(“%d,”,a[i]); printf(“n”); } 4.编写程序,在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found。参考代码如下: #include main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; int n,i,j,k=0; printf(“Please enter the number:”); scanf(“%d”,&n); for(i=0;i<10;i++) { while(n==a[i]){k=1;j=i;break;} } if(k==1) printf(“a[%d]n”,j); else printf(“no found.n”);} 5.编程将下列矩阵中的元素向右移动一列,最右一列移至第一列。 10 12 [提示:用二维数组v存放矩阵中元素,数组v可在定义时初始化;有两种方法实现这种移动:一种方法是将移动后的元素放在另一个二维数组中;另一种方法是利用一个中间变量仍将移动后的元素放在数组v中。] #include int a[2][3]={1,4,6,8,10,12}; int b[2][3]; b[0][0]=a[0][2]; b[0][1]=a[0][0]; b[0][2]=a[0][1]; b[1][0]=a[1][2]; b[1][1]=a[1][0]; b[1][2]=a[1][1]; printf(“a[2][3]:”); for(i=0;i<2;i++) { printf(“n”); for(j=0;j<3;j++) printf(“%5d”,a[i][j]); } printf(“nresult:n”); for(i=0;i<2;i++) { printf(“n”); for(j=0;j<3;j++) printf(“%5d”,b[i][j]); } printf(“n”); getch();} 6.利用公式c(i,j)a(i,j)b(i,j)计算m×n的矩阵A和m×n的矩阵B之和,已知a(i,j)为矩阵A的元素,b(i,j)为矩阵B的元素,c(i,j)为矩阵C的元素,i1,2,...,m,j1,2,...,n。[提示:用二维数组元素做函数参数编程实现矩阵相加。] #include int i,j,t; clrscr(); printf(“Please input a[%d][%d]n”,M,N); for(i=0;i for(j=0;j { scanf(“%d”,&t); a[i][j]=t; } printf(“Please input b[%d][%d]n”,M,N); for(i=0;i for(j=0;j { scanf(“%d”,&t); b[i][j]=t; } matrix(b,c); printf(“a[%d][%d]”,M,N); for(i=0;i { printf(“n”); for(j=0;j printf(“%5d”,a[i][j]); } printf(“n”); printf(“b[%d][%d]”,M,N); for(i=0;i { printf(“n”); for(j=0;j printf(“%5d”,b[i][j]); } printf(“n”); printf(“c[%d][%d]=A+B:”,M,N); for(i=0;i { printf(“n”); for(j=0;j printf(“%5d”,c[i][j]); } } void matrix(int a[][M],int b[][N]){ int i,j,k,t; for(i=0;i for(j=0;j c[i][j]=a[i][j]+b[i][j];} 习题6参考答案 一、选择题 1.A 2.D 3.D 二、填空题 1.指针 取地址 2.3 3.9876 876 4.24 三、编程题 1.输入3个整数,按从大到小的次序输出。参考代码如下: main(){ int a[3],i,j,t; printf(“Please enter three number:n”) for(i=0;i<3;i++) scanf(“%d”,&a[i]); for(i=0;i<2;i++) for(j=0;j<2;j++) if(a[j] { t=a[j];a[j]=a[j+1];a[j+1]=t;} for(i=0;i<3;i++) printf(“%dn”,a[i]);} 2.编写将n阶正方矩阵进行转置的函数。在主函数中对一个4行4列的矩阵调用此函数。参考代码如下: int array[4][4];convert(int array[4][4]){ int i,j,t; for(i=0;i<4;i++) for(j=i+1;j<4;j++) { t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t; } } main(){ int i,j;printf(“Input array:n”);for(i=0;i<4;i++) for(j=0;j<4;j++) scanf(“%d”,&array[i][j]);printf(“noriginal array :n”);for(i=0;i<4;i++) { for(j=0;j<4;j++) printf(“%5d”,array[i][j]); printf(“n”);} convert(array);printf(“convert array:n”);for(i=0;i<4;i++) { for(j=0;j<4;j++) printf(“%5d”,array[i][j]); printf(“n”); } } 3.有三个整型变量i,j, k,请编写程序,设置三个指针变量p1,p2,p3,分别指向i, j,k。然后通过指针变量使i,j,k三个变量的值顺序交换,即把i的原值赋给j,把j的原值赋给k,把k的原值赋给i。要求输出i,j, k的原值和新值。参考代码如下: main(){ int i, j , k, temper; int *p1, *p2, *p3; printf(“Please input 3 integers:n”); scanf(“%d%d%d”,&i, &j, &k); p1=&i;p2=&j;p3=&k; printf(“before changed ,the 3 numbers are:n”); printf(“i=%d, j=%d,k=%dn”,i, j, k); temper=*p1;*p1=*p3;*p3=*p2;*p2=temper; printf(“after changed ,the 3 numbers are:n”); printf(“i=%d, j=%d,k=%dn”,i, j, k);} 4.用指针编写程序,把输入的字符串按逆顺序输出。参考代码如下: #include int i,j; char t; for(i=0,j=strlen(s)-1;i { t=s[i]; s[i]=s[j]; s[j]=t; } printf(“%sn”,s);} 习题7参考答案 一、选择题 1.C 2.B 3.C 二、填空题 1.float 2.自动(auto)3.12 4.9.000000 二、编程题 1.编写函数,已知三角形的三个边长,求三角形的面积。参考代码如下: #include float a,b,c,s,area; printf(“Please enter three sides:n”); scanf(“%f,%f,%f”,&a,&b,&c); if(a+b>c&&b+c>a&&a+c>b) { s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“area=%.2fn”,area); } else printf(“It is not a triangle!n”);} 2.编程计算p=k!(m-k)!的值。参考代码如下: #include int k,m; long p; printf(“Please enter k,m:”); scanf(“%d,%d”,&k,&m); p=f(k)*f(m-k); printf(“%dn”,p);} int f(int n){ if(n>1) return n*f(n-1); else return 1;} 3.写一函数,使给定的一个二维数组(3×3)转置,即行列互换。并在主函数中调用该函数时,使用数组作为实际参数。参考代码如下: #define N 3 int array[N][N];convert(int array[N][N]){ 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; } } main(){ int i,j;printf(“Input array(3*3):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”);} convert(array);printf(“convert array:n”);for(i=0;i { for(j=0;j printf(“%5d”,array[i][j]); printf(“n”); } } 4.设计一个函数,用以计算下面数列前n项之和(以n为形参变量)。2/ 1、3/ 2、5/ 3、8/ 5、13/ 8、21/ 13、„。参考代码如下: #define N 6 main(){ int n=N,i=1; float s=0; while(i<=n) { s=s+(i+1.0)/i; i++; } printf(“s(%d)=%.5fn”,n,s);} 5.如果一个数恰好等于它的因子之和,则该数称为“完数”。例如:6的因子是1、2、3,而6=1+2+3。编程序输出1000之内的所有完数。输出形式是:“6它的因子是1,2,3”。参考代码如下: main(){ static int k[100]; int i,j,n,s; for(j=2;j<1000;j++) { n=-1; s=j; for(i=1;i { if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) { printf(“%d is a wanshu”,j); for(i=0;i printf(“%d,”,k[i]); printf(“%dn”,k[n]); } } } 一、选择题 1.C 2.A 3.A 4.B 二、填空题 8参考答案 习题1.pt=s1;pt->student.no=1001;2.0,1,2,100,101,102 3.结构体变量 4.Four, Three,Four 三、编程题 1.有10个学生,每个学生的数据包括学号(num)、姓名(name[9])、性别(sex)、年龄(age)、三门课成绩(score[3]),要求在main()函数中输入这10个学生的数据,并对每个学生调用函数count()计算总分。参考代码如下: #include int i,j; for(i=1;i<=N;i++) { printf(“num:”); scanf(“%d”,&stu[i].num); printf(“name:”); scanf(“%s”,&stu[i].name); printf(“sex:”); scanf(“%s”,&stu[i].sex); printf(“age:”); scanf(“%d”,&stu[i].age); for(j=0;j<3;j++) { printf(“score[%d]:”,j+1);scanf(“%d”,&stu[i].score[j]); } } for(i=1;i<=N;i++) printf(“stu[%d] sum=%dn”,i,count(stu[i].score));} int count(int s[]) { int i,sum=0; for(i=0;i<3;i++) sum=sum+s[i]; return sum; } 2.口袋中有若干红、黄、蓝、白、黑5种颜色的球,每次从口袋中取出3个球,编程打印出得到3种不同颜色的球的所有可能取法。参考代码如下: main(){ enum color{red,yellow,blue,white,black}; enum color i,j,k,pri; int n=0,loop; for(i=red;i<=black;i++) for(j=red;j<=black;j++) if(i!=j) { for(k=red;k<=black;k++)if((k!=i)&&(k!=j)) { n=n+1; printf(“%-4d”,n); for(loop=1;loop<=3;loop++) { switch(loop) { case 1:pri=i;break; case 2:pri=j;break; case 3:pri=k;break; default:break; } switch(pri) { case red: printf(“%-10s”,“red”);break; case yellow: printf(“%-10s”,“yellow”);break; case blue: printf(“%-10s”,“blue”);break; case white: printf(“%-10s”,“white”);break; case black: printf(“%-10s”,“black”);break; default:break; } } printf(“n”); } } printf(“ntotal:%5dn”,n);} 3.25个人围成一个圈,从第1个人开始顺序报号,凡报号为3和3的倍数者退出圈子,找出最后留在圈子中的人原来的序号。参考代码如下: #include int i,j,position=1,total=0,chage; a=(int *)malloc(25*sizeof(int)); for(i=0;i<25;i++) a[i]=i+1; while(1) { position+=2; while(position>25-total) position=position-25+total; chage=a[position-1]; for(j=position;j<25-total;j++) a[j-1]=a[j]; a[25-total-1]=chage; total++; if(total==25) { for(i=0;i<25-1;i++)printf(“%d->”,a[25-i-1]);printf(“%dn”,a[0]);printf(“the last one is %dn”,a[0]);return 0; } } } 4.建立一个链表,每个结点包括:学号、姓名、成绩。(1)输入一个学号,检索该学生的有关信息;(2)从链表中删去成绩低于40分的学生。参考代码如下: #include int no; char name[9]; int score; struct stu *next;};struct stu *create(){ struct stu *head,*p,*q; int n,s; head->next=NULL; p=head; while(1) { printf(“no,name,score:”); scanf(“%d,%s,%d”,&n,&s); if(n==0&&s==0) break; else { q=(struct stu *)malloc(sizeof(struct stu)); q->no=n;q->score=s;q->next=NULL; p->next=q;p=q; } } return head;} struct stu *search(struct stu *h,int n){ struct stu *p=h->next; while(p!=NULL&&P->NO!=n) p=p->next; return p;} struct stu *delete(struct stu *head,char *s){ struct stu *p1,*p2; if(head==NULL){ printf(“nempty list!n”); goto end;} p1=head;while(pi->score>40 && p1->next!=NULL){ p2=p1;p1=p1->next; free(p1); } return head;} main(){ int n; struct stu *q; printf(“enter number:”); scanf(“%d”,&n); q=create(n); printf(“list:n”); while(q!=NULL) { printf(“%sn”,q->name); q=q->next; } } 习题9参考答案 一、选择题 1.D 2.C 3.A 二、填空题 1.L=18.849558 S=28.274337 三、解答题 预处理命令的功能是什么?包括哪几部分?#include预处理命令的两种格式分别为什么? 答:预处理命令的功能是告诉编译系统在对源程序进行编译之前应该做些什么。预处理命令主要包括文件包含、宏定义和条件编译三个部分。#include预处理命令 格式一:#include<包含文件名> 格式二:#include”包含文件名” 习题10参考答案 一、选择题 1.C 2.B 3.A 二、填空题 1.二进制文件 2.顺序 随机 3.hello, 4.picursound 三、编程题 1.从键盘输入学生姓名,寻找学生记录是否存在,并输出相应信息。参考代码如下: #include char name[9]; int num; int age; char sex;}stu[N];void main(){ int i; char s[10]; FILE *fp; if((fp=fopen(“stu”,“rb”))==NULL) { printf(“Can not open file!n”); exit(0); } gets(s); for(i=0;i { fseek(fp,i*sizeof(struct student),0); fread(&stu[i],sizeof(struct student),1,fp); while(s==stu[i].name) printf(“%s,%d,%d,%dn”,stu[i].name,stu[i].num,stu[i].age,stu[i].sex); } fclose(fp);} 2.有两个磁盘文件a和b,各存放一行字母。要求将两个文件的内容读到内存中,并将其合并到一起(按字母顺序排列),然后输出到一个新文件。参考代码如下: #include “stdio.h” main(){ FILE *fp; int i,j,n; char c[160],t,ch; if((fp=fopen(“A”,“r”))==NULL) { printf(“file A cannot be openedn”); exit(0); } printf(“n A contents are :n”); for(i=0;(ch=fgetc(fp))!=EOF;i++) { c[i]=ch;putchar(c[i]); } fclose(fp); if((fp=fopen(“B”,“r”))==NULL) { printf(“file B cannot be openedn”); exit(0); } printf(“n B contents are :n”); for(i=0;(ch=fgetc(fp))!=EOF;i++) { c[i]=ch; putchar(c[i]); } fclose(fp); n=i; for(i=0;i for(j=i+1;j if(c[i]>c[j]) { t=c[i];c[i]=c[j];c[j]=t;} printf(“n C file is:n”); fp=fopen(“C”,“w”); for(i=0;i { putc(c[i],fp); putchar(c[i]); } fclose(fp);} 3.编写将字符串“Turbo C”、“BASIC”、“FORTRAN”、“COBOL”以及“PL_1”写入文件中去的程序。参考代码如下: #include char c,file[N]; scanf(“%s”,file); if((fp=fopen(file,“w”))==NULL) { printf(“Can not open filen”); exit(0); } c=getchar(); c=getchar(); while(c!='n') { fputc(c,fp);putchar(c); c=getchar(); } putchar(N); fclose(fp);} 4.设文件student.dat中存放着学生的基本情况,这些情况由以下结构体描述: struct student { long int num;/*学号*/ char name[10];/*姓名*/ int age;/*年龄*/ char speciality[20];/*专业*/ }; 请编写程序,输出学号在97010~97020之间的学生学号、姓名、年龄和专业。参考代码如下: #include “stdio.h” struct student { long int num; char name[10]; int age; char speciality[20]; }; FILE *fp; main() { struct student st; fp=fopen(“student.dat”,“rb”); if(fp==NULL) printf(“file not foundn”); else { while(!feof(fp)) { fread(&st,sizeof(struct student),1,fp); if(st.num>=970101&&st.num<=970135) printf(“%ld,%s,%d,%sn”,st.num,st.name,st.age,st.speciality); } } } 习题一 1.运行startup.bat启动Tomcat服务器的好处是什么? 答:确保Tomcat服务器使用的是Java_home环境变量设置的JDK。 2.请在C:下建立一个名字为book的目录,并将该目录设置成一个Web服务目录,然后编写一个简单的JSP页面,保存到该目录中,让用户使用虚拟目录red访问该JSP页面。答:属于操作题,解答略。 3.怎样访问Web服务目录子目录中的JSP页面? 答:Web服务目录的下的目录称为该Web服务目录下的相对Web服务目录。浏览器的地址栏中键入:http://IP:8080/Web目录名字/子目录名字/JSP页面。 4.如果想修改Tomcat服务器的端口号,应当修改哪个文件?能否将端口号修改为80。答:修改Tomcat服务器安装目录中conf文件夹中的主配置文件:server.xml,只要没有其他应用程序正在占用80,就可以将端口号设置为80。 习题二 1.“<%!”和“%>”之间声明的变量与“<%”和“%>”之间声明的变量有何不同? 答:“<%!”和“%>”之间声明的变量在整个JSP页面内都有效,称为JSP页面的成员变量,成员变量的有效范围与标记符号<%!、%>所在的位置无关。所有用户共享JSP页面的成员变量,因此任何一个用户对JSP页面成员变量操作的结果,都会影响到其他用户。 “<%”和“%>”之间声明的变量称为局部变量,局部变量在JSP页面后继的所有程序片以及表达式部分内都有效。运行在不同线程中的Java程序片的局部变量互不干扰,即一个用户改变Java程序片中的局部变量的值不会影响其他用户的Java程序片中的局部变量。当一个线程将Java程序片执行完毕,运行在该线程中的Java程序片的局部变量释放所占的内存。 2.如果有两个用户访问一个JSP页面,该页面中的Java程序片将被执行几次? 答:两次。 3.是否允许一个JSP页面同时含有如下两条page指令: <%@ page contentType=“text/html;charset=GB2312” %> <%@ page contentType=“application/msword” %> 是否允许JSP页面同时含有如下两条指令: <%@ page import=“java.util.*” %> <%@ page import=“java.sql.*” %> 答:第一个问题的答案是不允许;第二个问题的答案是允许。 4.假设有两个用户访问下列JSP页面hello.jsp,请问第一个访问和第二个访问hello.jsp页面的用户所看到的页面的效果有何不同? Hello.jsp <%@ page contentType=“text/html;charset=GB2312” %> <%@ page isThreadSafe=“false” %> void add(int m){ sum=sum+m;} %> <% int n=600; add(n);%> <%=sum%> C语言程序设计教程课后习题答案 第一章 C语言程序设计概述 -习题答案 算法的描述有哪些基本方法? 答 1、自然语言 2、专用工具C语言程序的基本结构是怎样的?举一个例子说明。 答 1、C语言程序由函数构成; 2、“/*”与“*/”之间的内容构成C语言程序的注释部分; 3、用预处理命令#include、#define可以包含有关文件或预定义信息; 4、大小写字母在C语言中是有区别的; 5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。C语言有什么特点? 答 1、具有结构语言的特点,程序之间很容易实现段的共享; 2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化; 3、运算符丰富,包含的范围很广; 4、数据类型丰富; 5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能; 6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚; 7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。★指出合法与不合法的标识符命名。 答 AB12--√ leed_3--a*b2--× 8stu--× D.K.Jon--× EF3_3--√ PAS--√ if--× XYZ43K2--√ AVE#XY--× _762--√ #_DT5--× C.D--×说明下列Turbo C热键的功能。 答 F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。说明下列Turbo C方式下输入并运行下列程序,记录下运行结果。 ①main() {printf(“********************n”);printf(“ welcome you n”);printf(“ very good n);printf(”********************n“);} ②main() { int a,b,c,t;printf(”please input three numbers;“);scanf(”%d,%d,%d“,&a,&b,&c);/*教材S是错误的*/ t=max(max(a,b),c);printf(”max number is:%dn“,t);} int max(int x, int y){ int z;if(x>y)z=x;else z=y;return(z);} 答 运行结果: ******************** welcome you very good ******************** 运行结果: please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/ max number is:4 7 一个C程序是由若干个函数构成的,其中有且只能有一个___函数。 答 main()8 在Turbo C环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果。 答 1、User screen 2、Alt+F5 9 ★C语言对标识符与关键字有些什么规定? 答 1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头。 2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。C源程序输入后是如何进行保存的? 答 是以C为扩展名保存的纯文本文件。 第二章 C语言程序的基本数据类型与表达式 -习题答案 ★指出下列常数中哪些是符合C语法规定的。 答 ''--× '101'--× ”“--× e3--× 019--√ 0x1e--√ ”abn“--√ 1.e5--×(2+3)e(4-2)--× 5.2e2.5--×请找出下列程序中的错误,改正后写出程序运行结果。 ①void main(){int x,y=z=5,aver;x=7 AVER=(x+y+z)/3 printf(”AVER=%dn“,aver);} ②void main() { char c1='a';c2='b';c3='c';int a=3.5,b='A' printf(”a=%db='“endn”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);} 答 main(){int x,y=5,z=5,aver;x=7;aver=(x+y+z)/3;printf(“AVER=%dn”,aver);} 运行结果:AVER=5 ②main() { char c1='a', c2='b', c3='c';int a=3,b='A';printf(“a=%d,b='%c'”end“n”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);} 运行结果:a=3,b='A'“end” aabcc abc 3 写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。int 99 -1 char 'h' unsigned int float 55.78 long int 答 int 99 104 66 55 68-1 char 'c' 'h' 'B' '7' 'D' unsigned int 99 104 66 55 68 65535 float 99.00 104.00 66.00 55.78 68.00-1.00 long int 99 104 66 55 68-1 ★写出程序运行结果。 ①void main(){int i,j;i=8,j=10;printf(“%d,%d,%d,%dn”,i,j,++i,j++);} ②main() { int a=1,b=2,c=30;;printf(“%d,%d,%d,%dn”,a=b=c,a=b==c,a==(b=c),a==(b==c));} 注意:a=b=c,a=b==c之间应为逗号,教材有误 答 运行结果: 9,11,9,10 运行结果: 30,1,0,0 ③void main() {int a=10,b=20,c=30,d;d=++a<=10||b-->=20||c++;printf(“%d,%d,%d,%dn”,a,b,c,d);} 答 运行结果: 11,19,30,1 ★写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。⑴a%=(b%=3) ⑵n++,a+=a-=a*=a ⑶(float)(a+c)/2+(int)x%(int)y ⑷a*=b+c ⑸++a-c+b++ ⑹++a-c+++b ⑺a ⑼a+b,18+(b=4)*3,(a/b,a%b) ⑽x+a%3*(int)(x+y)%2/4+sizeof(int)⑾a 答 ⑴0 ⑵0 ⑶9.500000 ⑷90 ⑸10 ⑹10 ⑺'A' ⑻2 ⑼4.5 ⑽1 ⑾0 ⑿20 ⒀0 下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)? ①m=(a=4,4*5)与m=a=4,4*5 ②(float)(a/b)与(float)a/b ③(int)a+b与(int)(a+b)④m%=2+a*3与m=m%2+a*3 ⑤m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b 答 ①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同; ②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。 ③因为a、b均为整数,其前后两个表达式的计算结果是一致的。 ④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。⑤前后表达式的计算结果应该是一致的:a=2, b=3, m=6 7 条件表达式x>0?x:-x的功能是什么? 答 如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。用一个条件表达式描述从a、b、c中找出最大都赋给max.答 max=a>(b>c?b:c)?a:(b>c?b:c);9 ★若x为int型变量,则执行以下语句后x的值为()。x=6;x+=x-=x*x;A.36 B.-60 C.60 D.-24 答 B.10 ★若有以下类型说明语句: char w;int x;float y;double z;则表达式w*x+z-y的结果为()类型。A.float B.char C.int D.double 答 D.第三章 顺序结构程序设计 -习题答案 变量k为float类型,调用函数scanf(“%d”,&k),不能使变量k得到正确数值的原因是___。 答 格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。★a=1234,b=12,c=34,则执行“printf(“|%3d%3d%-3d|n”,a,b,c);”后的输出是___。 答 |1234 1234 | 分析如下: ①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。 ②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。★设有“int a=255,b=8;”,则“printf(“%x,%on”,a,b);”输出是___。答 ff,10 ①如果“printf(“%X,%on”,a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。 ②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改“printf(“%#x,%on”,a,b);”为或“printf(“%#X,%on”,a,b);”。本条解释不必须掌握。★以下程序输出的结果是___。main(){ int a1=1,a2=0,a3=2;printf(“%d,%d,%dn”,a1,a1+a2+a3,a3-a1);} 答 1,3,1 5 printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出。 答 ①实际 ②左端补空格 6 ★已定义变量如下: int a1,a2;char c1,c2;若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是___。 答 scanf(“%d,%d,%c,%c”,&a1,&a2,&c1,&c2);7 输入两个整型变量a、b的值,输出下列算式以及运算结果___。a+b、a-b、a*b、a/b、(float)a/b、a%b 每个算式占一行。如a=10,b=5,a+b输出为:10+5=15 答 设int a=10,b=5;以下为输出语句及结果: ①printf(“%d+%d=%dn”,a,b,a+b);10+5=15 ②printf(“%d-%d=%dn”,a,b,a-b);10-5=5 ③printf(“%d*%d=%dn”,a,b,a*b);10*5=50 ④printf(“%d/%d=%dn”,a,b,a/b);10/5=2 ⑤printf(“%(float)d/%d=%fn”,a,b,(float)a/b);(float)10/5=2.000000 ⑥printf(“%d%%%d=%dn”,a,b,a%b);10%5=0 8 ★输入一个非负数,计算以这个数为半径的圆周长和面积。答 #define PI 3.1415926 main(){ float r,l,area;printf(“Input a positive:”);scanf(“%f”,&r);l=2*PI*r;area=PI*r*r;printf(“l=%ftarea=%fn”,l,area);} 9 输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。 答 main(){ int x,y;printf(“Input a number(100-999):”);scanf(“%d”,&x);y=100*(x%10)+10*(x/10%10)+x/100;/*注意分析此处算法*/第二篇:C语言课后习题解答
第三篇:《C语言程序设计》课后习题参考答案
第四篇:JSP程序设计习题解答
第五篇:C语言程序设计教程课后习题答案