C语言课后习题解答_c语言课后习题解答
C语言课后习题解答由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“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 #include float x1,x2,disc,p,q;
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 #define N 3 int array[N][N];
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 #include char str[100];void main(){ void inverse(char str[]);
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
t=str[i];
str[i]=str[j-1];
str[j-1]=t;} }
7-6 写一个函数,将两个字符窜连接。
#include void main(){ void concatenate(char string1[],char string2[],char string[]);char s1[100],s2[100],s[100];printf(“input string1:”);scanf(“%s”,s1);printf(“input string2:”);scanf(“%s”,s2);
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 #define N 10 #define M 5 float score[N][M];float a_stu[N],a_cour[M];int r,c;
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 #include #define N 10
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((nnum[N-1]))
loca=-1;while((sign==1)&&(top
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 void main(){ void swap(int*,int*);int a,b,c;
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 #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
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=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 #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
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
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
for(j=i;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 #define N 5
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
{
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
printf(“%9d”,stu[i].score[j]);
printf(“n”);} }
9-4 在第3题的基础上,编写一个函数input,用来输入5个学生的数据记录。
#include #define N 5
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
{
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
printf(“%9d”,stu[i].score[j]);
printf(“n”);} }
9-5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总成绩,以及最高分的学生数据(包括学号、姓名、3门课程成绩、平均分数)
#include #define N 10
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
{
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
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
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);}