c语言程序设计第四版第九章答案谭浩强.docx
- 文档编号:4566896
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:16
- 大小:18.17KB
c语言程序设计第四版第九章答案谭浩强.docx
《c语言程序设计第四版第九章答案谭浩强.docx》由会员分享,可在线阅读,更多相关《c语言程序设计第四版第九章答案谭浩强.docx(16页珍藏版)》请在冰豆网上搜索。
c语言程序设计第四版第九章答案谭浩强
第九章
9.1定义一个结构体变量(包括年、月、日)。
计算该日在本年中是第几天,注意闰年问题。
解:
Struct
{intyear;
intmonth;
intday;
}date;
main()
{intdays;
printf(“Inputyear,month,day:
”);
scanf(“%d,%D,%d”,&date.year,&date.month,&date.day);
switch(date.month)
{case1:
days=date.day;break;
case2:
days=date.day+31;break;
case3:
days=date.day+59;break;
case4:
days=date.day+90;break;
case5:
days=date.day+120;break;
case6:
days=date.day+31;break;
case7:
days=date.day+181;break;
case8:
days=date.day+212;break;
case9:
days=date.day+243;break;
case10:
days=date.day+273;break;
case11:
days=date.day+304;break;
case12:
days=date.day+334;break;
}
if((date.year%4==0&&date.year%100!
=0||date.year%400==0)&&date.month>=3)days+=1;
printf(“\n%d/%disthe%dthdayin%d.”,date.month,data.day,days,date,year);
}
9.2写一个函数days,实现上面的计算。
由主函数将年、月、日传递给days函数,计算后将日数传回主函数输出。
解:
structy_m_d
{intyear:
intmonth;
intday;
}date;
intdays(structy_m_ddate1)
{intsum;
switch(data.month)
{case1:
sum=date1.day;break;
case2:
sum=date1.day+31;break;
case3:
sum=date1.day+59;break;
case4:
sum=date1.day+90;break;
case5:
sum=date1.day+120;break;
case6:
sum=date1.day+151;break;
case7:
sum=date1.day+181;break;
case8:
sum=date1.day+212;break;
case9:
sum=date1.day+243;break
case10:
sum=date1.day+243;break
case11:
sum=date1.day+243;break
case12:
sum=date1.day+243;break
}
};
9.3编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。
解:
#defineN5
structstudent
{charnum[6];
charname[8];
intscore[4];
}stu[N];
main()
{intI,j;
for(I=0;I {printf(“\Inputscoreofstudent%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); } print(structstudentstu[6]) {intI,j; printf(“%5s%10s”,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); print(“\n”); } 9.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。 解: #defineN5 structstudent {charnum[6]; charname[8]; intscore[4] }stu[N]; input(structstudentstu[]) {intI,j; for(I=0;I {printf(“inputscoresofstudent%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++); scanf(“%d”,&stu[i].score[j]);} } printf(“\n”); } } 9.5有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩) 解: #defineN10 structstudent {charnum[6] charname[8] intscore[4] floatavr; }stu[N]; main() {intI,j,max,maxi,sum; floataverage; for(I=0;I {printf(“\nInputscoresofstudent%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]); } } average=0; max=0; maxi=0; for(i=0;i<3;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.namescore1score2score3average\n”); 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(“%8.2f\n”,stu[i].avr); } printf(“average=%6.2f\n”,average); printf(“Thehighestscoreis: %s,scoretotal: %d.”stu[maxi].name,max); } 9.6编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。 New(n)表示分配n个字节的内存空间。 解: new函数如下: #defineNULL0 #defineNEWSIZE1000 charnewbuf[NEWSIZE]; char*newp=newbuf; char*new(intn) {if(newp+n<=newbuf+NEWSIZE) {newp=newp+n; return(newp-n); } else return(NULL); } 9.7写一函数free,将上题用new函数占用的空间释放。 Free(p)表示将p指向的单元以后的内存段释放。 解: #defineNullo #defineNEWSIZE1000 charnewbuf[NEWSIZE]; char*newp=newbuf; free(char*p) {if((p>=newbuf)&&(p newp=p; } 9.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。 要求把两个链表合并,按学号升序排列。 解: #include #defineNULL0 #defineLENsizeof(structstudent) strutstudent {longnum; intscor; structstudent*next }; structstudentlistA,listB; intn,sum=0; main() {structstudent*creat(void); structstudent*insert(structstudent*,structstudent*); voidprint(structstudent*); stuctstudent*ahead,*bhead,*abh; printf(“\ninputlista: \n”); ahead=creat(); sum=sum+|n; abh=insert(ahead,bhead); print(abh); } structstudent*creat(void) {structstudent*p1,*p2,*head; n=0; p1=p2=(structstudent*)malloc(LEN); printf(“inputnumber&scoresofstudent: \n”); printf(“ifnumberIs0,stopinputing.\n”); scanf(“%ld,%d”,&p1->num,&p1->score); head=NULL; while(p1->num! =0) {n=n+1; if(n==1)head=p1; elsep2->next=p1; p2=p1; p1=(structstudent*)malloc(LEN); scanf(“%ld,,%d”,&p1->num,&p1->score); } p2->next=NULL; return(head); } structstudent*insert(structstudent*ah,structstudent*bh) {structstudent*pa1,*pa2,*pb1,*pb2; pa2=pa1=ah; pb2=pb1=bh; do {while((pb1->num>pa1->num)&&(pa1->next! =NULL)) {pa2=pa1; pa1=pa1->next; } if(pb->num<=pa1->num) {if(ah=pa1) ah=pb1; elsepa2->next=pb1; pb1=pb1->next; pb2->next=pa1; pa2=pb2; pb2=pb1; } } while((pa1->next! =NULL)||(pa1==NULL&&pb1! =NULL)); if((pb1->num>pa1->num)&&(pa1->next==NULl)) ap1->next=pb1; return(ah); } voidprint(structstudent*head) {structstudent*p; printf(“%ld%d\n”,p->num,p->score); p=p->next; while(p! =NULL); } 9.913个人围成一圈,从第1个人开始顺序报号1、2、3。 凡报到“3”者退出圈子。 找出最后留在圈子中的人原来的序号。 解: #defineN13 structperson {intnumber; intnextop; }link[N+1]; main() {intI,count,h; for(I=1;I<=N;I++) {if(I==N) link[i].nextp=1; else link[i].nextp=I+1; link[i].number=I; } printf(“\n”); count=0; h=N; printf(“sequencethatperson2leavethecircle: \n”); while(count {I=0; while(I! =3) {h=link[h].nextp; if(link[h].number) I++; } printf(“%4d”,link[h].number); link[h].number=0; count++; } printf(“\nThelastoneis”); for(I=1;ii<=N;I++) if(link[i].number) printf(“%3d”,lin[i].number); } 9.10有两个链表a和b,设结点中包含学号、姓名。 从1链表中删去与b链表中有相同学号的那些结点。 解: #defineLA4 #defineLB5 #defineNULL0 structstudent {charnump[6]; charname[8]; structstudent*next; }A[LA],b[LB]; main() {structstudenta[LA]={{“101”,”Wang”},{“102”,”LI”},{“105”,”zhang”},{“106”,”Wei”}}; structstudentb[LB]={{“103”,”Zhang”},{“104”,”Ma”},{“105”,”Chen”},{“107”,”Guo”}, {“108”,”Lui”}}; intI,j; structstudent*p,*p1,*p2,*pt,*head1,*head2; head1=a; head2=b; printf(“lista: \n”);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第四 第九 答案 谭浩强