第一篇:C语言课后习题解答
第七章 函数调用 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);} 第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.略 《王几何》课后习题解答 一、快速默读课文,概括文章的主要内容,说说王几何老师给你留下了怎样的印象。 本文写了王几何老师上第一节课时的情形,刻画了一位风趣幽默、教学水平高、业务能力强、学识广博的老师形象。 印象:王老师和蔼风趣,是良师又是益友,是平凡朴实、学生喜欢爱戴的人,他留给我的印象终生难忘。 二、王老师请同学们在黑板上画圆和三角形,用意是什么?文章中的这些描写,在结构和内容表达上有什么作用? 王老师请同学们在黑板上画圆和三角形,用意是让同学们明白只要功夫深,铁棒可以磨成针!要大家牢记一种热爱知识和持之以恒的学习精神。 文章中的这段描写,在结构上总结了上文,在内容上点明了主旨。 三、这是一篇典型的写人记事的文章,作者从外貌、神态、语言、动作等不同方面刻画了一位老师的形象。先在课文中圈点出相关描写,然后任选一个方面写一段评价文字,与同学交流。如果你喜欢画画,可以用简笔线条勾勒出王老师的肖像。 示例:“矮胖老师依然不说一句话,但却渐渐收起了笑容,用黑板刷轻轻敲击着讲台上的课桌,待全班同学安静下来,他突然面向课堂,反手在背后的黑板上徒手画了一个篮球大的圆,紧接着,又反手画了一个等边三角形。” 这段文字运用了神态、动作等描写方法,寥寥几笔,一个水平高,业务熟,见识广的教师形象跃然纸上。 / 1 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语言课后习题