《C语言程序设计》清华大学出版社课后答案.docx
- 文档编号:16329870
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:33
- 大小:61.35KB
《C语言程序设计》清华大学出版社课后答案.docx
《《C语言程序设计》清华大学出版社课后答案.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》清华大学出版社课后答案.docx(33页珍藏版)》请在冰点文库上搜索。
《C语言程序设计》清华大学出版社课后答案
习题9
一.选择题
1.A2.A3.A4.A5.B6.C
二编程题
9.2编写一函数,判断N×N矩阵是否为上三角阵。
上三角阵是指不含主对角线,下半三角都是0的矩阵。
#include
intfun(intx[][3],intn){
intflag=1,i,j;
for(i=1;i for(j=0;j if(x[i][j]! =0){ flag=0;break; } returnflag; } voidmain() { inta[3][3]={{1,4,5},{0,2,6},{0,0,3}}; intresult=fun(a,3); if(result==1) printf("此矩阵是上三角矩阵! \n"); else printf("此矩阵不是上三角矩阵! \n"); } 9.3有一个字符串,包含n个字符,将字符串从第i个字符到第j个字符间的字符逆置。 程序代码: #include #include voidinvertsub(char*str,inti,intj){ char*p,*q,c; intn=0; p=q=str; if(str==NULL) printf("strisNULL! \n"); elseif(i<=0||j>strlen(str)) printf("iandjvalueerror! \n"); else{ while(*p! ='\0'&&n! =i-1) {p++;n++;} q=p; while(*q! ='\0'&&n! =j-1){ q++;n++; } while(p c=*p; *p++=*q; *q--=c; } } } voidmain(){ charstr[]="abcdefg"; printf("%s\n",str); invertsub(str,2,5); printf("%s\n",str); } 9.4题目: 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 .程序源代码: main() { intnumber[20],n,m,i; printf("thetotalnumbersis: "); scanf("%d",&n); printf("backm: "); scanf("%d",&m); for(i=0;i scanf("%d,",&number[i]); scanf("%d",&number[n-1]); move(number,n,m); for(i=0;i printf("%d,",number[i]); printf("%d",number[n-1]); } move(array,n,m) intn,m,array[20]; { int*p,array_end; array_end=*(array+n-1); for(p=array+n-1;p>array;p--) *p=*(p-1); *array=array_end; m--; if(m>0)move(array,n,m); } 9.5输入n个整数,将最小数与第一个数对换,把最大数与最后一个数对换 程序源代码: main() { intnumber[10]; input(number); max_min(number); output(number); } input(number) intnumber[10]; {inti; for(i=0;i<9;i++) scanf("%d,",&number[i]); scanf("%d",&number[9]); } max_min(array) intarray[10]; {int*max,*min,k,l; int*p,*arr_end; arr_end=array+10; max=min=array; for(p=array+1;p if(*p>*max)max=p; elseif(*p<*min)min=p; k=*max; l=*min; *p=array[0];array[0]=l;l=*p; *p=array[9];array[9]=k;k=*p; return; } output(array) intarray[10]; {int*p; for(p=array;p printf("%d,",*p); printf("%d\n",array[9]); } 9.6输入n个字符串,按由小到大顺序输出。 程序源代码: main() { char*str1[20],*str2[20],*str3[20]; charswap(); printf("pleaseinputthreestrings\n"); scanf("%s",str1); scanf("%s",str2); scanf("%s",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("afterbeingsorted\n"); printf("%s\n%s\n%s\n",str1,str2,str3); } charswap(p1,p2) char*p1,*p2; { char*p[20]; strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); } 9.7写一函数,功能是交换两个实数变量的值。 voidswap(float*x,float*y); main() { floata,b,*p1,*p2; a=10;b=20;p1=&a;p2=&b; printf("a=%f,b=%f\n",a,b); swap(p1,p2); printf("a=%f,b=%f\n",a,b);/*或printf(″%d%d″,*p1,*p2)*/} voidswap(float*pa,float*pb) { floattemp; temp=*pa; *pa=*pb; *pb=temp; } 9.10写一个函数,求一个字符串的长度。 程序源代码: main() { intlen; char*str[20]; printf("pleaseinputastring: \n"); scanf("%s",str); len=length(str); printf("thestringhas%dcharacters.",len); } length(p) char*p; { intn; n=0; while(*p! ='\0') { n++; p++; } returnn; } 9.11_约瑟夫环问题: n个人围成一圈,从第一个人开始报数,凡报到3的人退出,问最后剩下的是第几号。 程序代码: #definenmax50 main() { inti,k,m,n,num[nmax],*p; printf("pleaseinputthetotalofnumbers: "); scanf("%d",&n); p=num; for(i=0;i *(p+i)=i+1; i=0; k=0; m=0; while(m { if(*(p+i)! =0)k++; if(k==3) {*(p+i)=0; k=0; m++; } i++; if(i==n)i=0; } while(*p==0)p++; printf("%disleft\n",*p); } 9.12 #include"stdio.h" #defineNULL0 #defineLENsizeof(structstudent)/*LEN表示结构体student的长度*/ structstudent {longnum; intscore; structstudent*next;};/*student成员中的next仍为student结构体类型,链表必用此种结构*/ structstudentlistA,listB;/*listA,listB皆为student结构体类型*/ intn,sum=0; voidprint(head)/*输出函数*/ structstudent*head; {structstudent*p; printf("\nsum%drecord,theyare: \n",sum); p=head;/*从表头开始*/ if(p! =NULL)do/*未到结尾时*/ {printf("%ld%d\n",p->num,p->score);/*输出学号和成绩*/ p=p->next;}/*指针前进*/ while(p! =NULL);} structstudent*insert(ah,bh)/*定义插入函数*/ structstudent*ah,*bh; { structstudent*pa1,*pa2,*pb1,*pb2;/*这四个指针皆为student结构体类型*/ pa2=pa1=ah;/*两个指针指向第一链表的表头*/ pb2=pb1=bh;/*两个指针指向第二链表的表头*/ do {while((pb1->num>pa1->num)&&(pa1->next! =NULL)) /*注意是按学号链接.当第二个链表的学号大于第一个链表的学号而且未到第一个链表结尾时*/ {pa2=pa1;pa1=pa1->next;}/*用pa2记下第一个链表的当前位置,pa1前进到下一个结点.到此已经脱离循环*/ if(pb1->num {if(ah==pa1)ah=pb1;/*如果现在ah指向第一个链表的某结点,则让ah指向第二个链表的当前结点,乃因第二个链表 的学号比第一个链表的学号小.注意ah为目标链表*/ elsepa2->next=pb1;/*否则,第二个链表pa2指针指向第二个链表的当前位置*/ pb1=pb1->next;pb2->next=pa1;/*做完上面的事情,两指针同时前进到下一个结点*/ pa2=pb2;pb2=pb1;}}/*pa2指向第二个链表的当前位置,pb2指向第二个链表的当前位置*/ while((pa1->next! =NULL)||(pa1==NULL&&pb1! =NULL));/*当第一个链表未到末尾或者第一个链表结束而第二个链表未结束 时,便重复做上面的事情*/ if((pb1->num>pa1->num)&&(pa1->next==NULL))/*脱离循环时如果是第一个链表结束而且第二个链表之序号大于第一个 链表之序号则把pa1之next域指向第二个链表的当前位置*/ pa1->next=pb1; return(ah);}/*返回目标链表的头地址*/ structstudent*creat()/*定义建立链表函数*/ {structstudent*p1,*p2,*head;/*此三个指针皆为student结构体类型*/ n=0;/*计数器n赋初值为0*/ p1=p2=(structstudent*)malloc(LEN);/*为结构体分配地址,p1,p2都指向这个地址*/ printf("inputsnoscore: \n"); printf("input0end."); scanf("%ld,%d",&p1->num,&p1->score);/*输入学号和成绩*/ head=NULL;/*表头先置为空指针*/ while(p1->num! =0)/*当输入的学号不为0时*/ {n=n+1;/*计数器增值1*/ if(n==1)head=p1;/*如果是第生个结点,head指向第一个结点*/ elsep2->next=p1;/*如果不是第一个结点,链结到p2中,p2是建立的链表*/ p2=p1;/*指针p2前进*/ p1=(structstudent*)malloc(LEN);/*再分配地址*/ scanf("%ld,%d",&p1->num,&p1->score);}/*再输入学号及成绩*/ p2->next=NULL;/*当脱离循环时,链表已经建立完毕.勿忘给表尾一个空指针*/ return(head);}/*返回表头地址*/ main(){ structstudent*ahead,*bhead,*abh;/*三个变量皆为结构体student类型*/ ahead=creat(); print(ahead);/*调用建立链表函数建立链表llistA,把返回地址赋给指针ahead*/ sum=n;/*n为链表结点数*/ bhead=creat(); print(bhead);/*调用建立链表函数建立链表llistB,把返回地址赋给指针bhead*/ sum=sum+n;/*sum为两个链表的结点总数*/ abh=insert(ahead,bhead);/*调用插入函数连结两个链表,把表头地址赋给abh*/ print(abh);}/*打印连接的结果*/ 9.1写一个函数,将一个3行3列矩阵转置。 main()/*将一个3行3列矩阵转置*/ {inta[3][3],*p,i; printf("input3*3juzhen: \n"); for(i=0;i<3;i++)/*一行一行的输入*/ scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]); p=&a[0][0];/*p指向二维数组首地址*/ move(p);/*调用转置函数进行转置*/ printf("zhuanzhihoujuzhenwei: \n"); for(i=0;i<3;i++)/*一行一行的输出*/ printf("%d%d%d\n",a[i][0],a[i][1],a[i][2]);} move(pointer)/*自己定义矩阵转置函数*/ int*pointer; { inti,j,t; for(i=0;i<3;i++) for(j=i;j<3;j++) {t=*(pointer+3*i+j);/**(pointer+3*i+j)乃a[i][j]*/ *(pointer+3*i+j)=*(pointer+3*j+i);/**(pointer+3*j+i);乃a[j][i]*/ *(pointer+3*j+i)=t;}}/*此三句实现a[i][j]与a[j][i]互换*/ 9.13运行结果: 9.14将n个数按输入时的顺序逆序排列。 程序代码如下: #defineNULL0 structline {intnum; structline*next;}/*定义结构体类型line,此中next是line类型的指针.处理链 表必用此种结构*/ main() {intlen=1,i; structline*p1,*head,*new,*newhead;/*此行指针皆为line类型*/ p1=head=(structline*)malloc(sizeof(structline)); /*各指针都指向系统分配的内存地址*/ p1->num=-1;head->next=NULL; while(p1->num! =0)/*当输入的不是0时*/ {p1=(structline*)malloc(sizeof(structline));/*再分配地址*/ printf("p->num? : "); scanf("%d",&p1->num);/*再输入结点值*/ p1->next=head; head->next=p1; len++;}} /*结点数自增值*/ p1=head->next;/*指针指向表头,准备输出*/ printf("outputlink\n"); do{ printf("%4d",p1->num);/*输出结点值*/ if(p1->next! =NULL)p1=p1->next;}/*如果未到表尾指针前进到下一个结点*/ while(p1! =NULL);/*循环终止条件*/ } 9.17有一个班4个学生,5门课,求: ①第一门课的平均分; ②找出有两科以上不及格的学生; ③找出平均成绩在90分以上者或全部课程成绩在85分以上者。 有10个学生,每个学生包括学号、姓名和三门课的成绩,要求打印出三门课崐总平均成绩以及最高分的学生数据。 /*输入10个学生数据,计算平均分*/ structstudent {charnum[6]; charname[8]; intscore[4]; floatavr;}stu[10];/*定义stu[10]为student型结构体数组*/ main() {inti,j,max,maxi,sum; floataverage; /*输入*/ for(i=0;i<10;i++) {printf("\n请输入第%d个学生的成绩: \n",i+1); printf("学号: "); scanf("%s",stu[i].num); printf("姓名: "); scanf("%s",stu[i].name); for(j=0;j<3;j++) {printf("成绩%d.",j+1); scanf("%d",&stu[i].score[j]);}}/*输入数据*/ /*计算*/ average=0; max=0; maxi=0; for(i=0;i<10;i++) {sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j];/*累加每个人的分数*/ stu[i].avr=sum/3.0;/*总分被3除得平均分*/ average+=stu[i].avr;/*累加总平均成绩*/ if(sum>max){max=sum;maxi=i;}}/*如果这个人的总成绩大于当前最高成绩则此成 绩替换掉当前最高成绩*/ average/=10;/*总平均分被10除得平均分*/ /*打印*/ printf("学号姓名成绩1成绩2成绩3平均分\n"); for(i=0;i<10;i++) {printf("%8s%10s",stu[i].num,stu[i].name);/*先输出学号,姓名*/ for(j=0;j<3;j++)/*再输出三科成绩*/ printf("%7d",stu[i].score[j]); printf("%6.2f\n",stu[i].avr);}/*输出每个人平均分*/ printf("平均成绩是%5.2f\n",average);/*输出总平均成绩*/ printf("最好成绩是学生%s,总分是%d.",stu[maxi].name,max);}/*输出最高 分及相应学生姓名*/ 9.19实现两个字符串的比较。 程序代码如下: intcompare(char*s1,char*s2){ intc; while(*s1! ='\0'||*s2! ='\0'){ if(*s1<*s2){c=-1;returnc;} elseif(*s1>*s2){c=1;returnc;} else{s1++;s2++;} } if(*s1=='\0') if(*s2=='\0')c=0; elsec=-1; elseif(*s2=='\0')c=1; returnc; } main(){ char*s1,*s2; intc; printf("\ninputstrings1,s2\n"); scanf("%s",s1); scanf("%s",s2); c=compare(s1,s2); printf("resultis"); if(c>0)printf("s1>s2"); elseif(c==0)printf("s1==s2"); elseprintf("s1 }_ 9.20输入一个月份号,输出该月的英文名。 程序代码如下: #include main() {enummonth{jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec}; enummonthi,; int*j; printf("inputmonth? \n"); scanf("%d",j); switch(j-1) { casejan: printf("%-10s","jan");break; casefeb: printf("%-10s","feb");break; casemar: printf("%-10s","mar");break; caseapr: printf("%-10s","apr");break; casemay: printf("%-10s","may");break; casejun: printf("%-10s","jun");break; casejul: printf("%-10s","jul");break; caseaug: printf("%-10s","aug");break; casesep: printf("%-10s","sep");break; caseoct: printf("%-10s","oct");break; casenov: printf("%-10s","nov");break; casedec: printf("%-10s","dec");break; default: break;} printf("\n"); }_ 9.21将空格分开的字符串称为单词。 输入多行字符串,直到输入"stop"单词时才停止。 最后输出单词的数量 程序代码如下: #include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 清华大学出版社 课后 答案