C语言程序设计第四版第九章答案谭浩强_第1页
C语言程序设计第四版第九章答案谭浩强_第2页
C语言程序设计第四版第九章答案谭浩强_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第九章91 定义一个结构体变量(包括年、 月、日)。计算该日在本年中是第几天,注意闰年问题。解: Structint year;int month;int day;date;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.da

2、y+59;break;case 4: days=date.day+90;break;case 5: days=date.day+120;break;case 6: days=date.day+31;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;

3、if(date.year%4=0&&date.year%100!=0|date.year%400=0)&&date.month>=3)days+=1;printf(n%d/%d“ is the %dth day in%d.” ,date.month,data.day,days,date,year);9.2 写一个函数days, 实现上面的计算。由主函数将年、月、日传递给days函数,计算后将日数传回主函数输出。解: struct y_m_dint year:int month;int day;date;intdays(struct y_m_d date1)

4、int sum;switch(data.month)case 1:sum=date1.day;case 2:sum=date1.day+31;case 3:sum=date1.day+59;case 4:sum=date1.day+90;case 5:sum=date1.day+120;case 6:sum=date1.day+151;break;break;break;break;break;break;case 7:sum=date1.day+181;break;case 8:sum=date1.day+212;break;case 9:sum=date1.day+243;breakcas

5、e 10:sum=date1.day+243;breakcase 11:sum=date1.day+243;breakcase 12:sum=date1.day+243;break;9.3 编写一个函数print, 打印一个学生的成绩数,该数组中有录包括 num 、name 、 sore3 ,用主函数输入这些记录,用解:5 个学生的数据记录,每个记print函数输出这些记录。#define N 5struct studentchar num6;char name8;int score4;stuN;main()int I,j ;for(I=0;I<N;I+)printf(“n” ,I+1)

6、;printf(“ no.:” );scanf(“ %s” ,stui.num);printf(“ name: ” );scanf(“ %s” ,);for(j=0;j<3;j+)printf(“ score%d: ” j+1);scanf(“ %d” ,&stui.scorej);printf(n“” );print(stu);print(struct student stu6)int I,j;printf(“ %5s%10s” ,stui.num,);for(j=0;j<3;j+)printf(“ %9d” ,stui.scorej)

7、;print(“n” );9.4 在上题的基础上,编写一个函数input,用来输入5 个学生的数据记录。解:#define N 5struct studentchar num6;char name8;int score4stuN;input(struct student stu)int I,j;for(I=0;I<N;I+)printf(“ input scores of studentn” ,I+1);printf(“ NO.: ” );scanf(“ %s” ,stui.num);printf(“ name:” );scanf(“ %s” , );for(j=0;j

8、<3;j+)printf(“ score%d: ” ,j+);scanf(“ %d” , &stui.scorej);printf(n“” );9.5 有 10 个学生,每个学生的数据包括学号、姓名、3 门课的成绩,从键盘输入10 个学生的数据,要求打印出3 门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)解: #define N 10struct studentchar num6char name8int score4float avr;stuN;main()int I,j,max,maxi,sum;float average;for(I=0;I<N

9、;I+)printf(“n” ,I+1);printf(“ NO.: ” );scanf(“ %s” ,stui.num);printf(“ name” );scanf(“ %s” ,);for(j=0;j<3;j+)printf(“ score %d:” ,j+1);scanf(“ %d” , &stui.scorej);average=0;max=0;maxi=0;for(i=0;i<3;i+)sum=0;for(j=0;j<3;j+)sum+=stui.scorej;stui.avr=sum/3.0;average+=stui.avr;if(s

10、um>max)max=sum;maxi=I;average/=N;printf(“ NO. name score1 score2 score3 averagen” );for(I=0;I<N;I+)printf(“ %5s%10s” ,stui.num, );for(j=0;j<3;j+)printf(printf(“ %9d” ,stui.scorej);“ %8.n2f” ,stui.avr);printf(printf(“ average=%6.2fn” ,average);“ The highest score is:%s,score total:%

11、d.” ,max);9.6 编写一个函数 new,对 n 个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。 New(n) 表示分配 n 个字节的内存空间。解: new 函数如下:#define NULL 0#define NEWSIZE 1000char newbufNEWSIZE;char *newp=newbuf;char *new(int n)if (newp+n<=newbuf+ NEWSIZE) newp= newp+n; return(newp-n);elsereturn(NULL);9.7 写一函数free ,将上题用new 函

12、数占用的空间释放。Free(p) 表示将 p 指向的单元以后的内存段释放。解:#define Null o#define NEWSIZE 1000char newbufNEWSIZE;char *newp=newbuf;free(char *p)if(p>=newbuf)&&(p<newbuf+NEWSIZE)newp=p;9.8 已有 a、 b 亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。解:#include<stdio.h>#define NULL 0#define LENsizeof(struct student)

13、strut studentlong num;int scor;struct student *next;struct student listA,listB;int n,sum=0;main()struct student *creat(void);struct student *insert(struct student *,struct student *);void print(struct student *);stuct student *ahead , *bhead,*abh;printf(“n” );ahead=creat();sum=sum+|n;abh=insert(ahea

14、d,bhead);print(abh);struct student *creat(void)struct student *p1,*p2,*head;n=0;p1=p2=(struct student *)malloc(LEN);printf(“ input number&scores of student: n” );printf(“ if number Is 0,stop inputing.n” );scanf(“ %ld,%d ” ,&p1->num,&p1->score);head=NULL;while(p1->num!=0)n=n+1;if

15、(n=1)head=p1;else p2->next =p1;p2=p1;p1=(struct student *)malloc(LEN);scanf(“ %ld,%d ” ,&p1->num,&p1->score);p2->next=NULL;return(head);struct student *insert(struct student *ah,struct student *bh)struct student *pa1 , *pa2,*pb1,*pb2;pa2=pa1=ah;pb2=pb1=bh;dowhile(pb1->num>p

16、a1->num)&&(pa1->next!=NULL)pa2=pa1;pa1=pa1->next;if(pb->num<=pa1->num)if(ah=pa1)ah=pb1;else pa2->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)

17、ap1->next=pb1;return(ah);void print(struct student *head)struct student *p;printf(“ %ld%dn” ,p->num,p->score);p=p->next;while(p!=NULL);9.9 13 个人围成一圈,从第1 个人开始顺序报号1、 2、 3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。解:#define N 13struct personint number;int nextop;linkN+1;main()int I,count,h;for(I=1;I<

18、=N;I+)if(I=N)linki.nextp=1;elselinki.nextp=I+1;linki.number=I;printf(n“” );count=0;h=N;printf(“ sequence that person2 leave the circle:n” );while(count<N-1)I=0;while(I!=3)h=linkh.nextp;if(linkh.number)I+;printf(“ %4d” ,linkh.number);linkh.number=0;count+;printf(nThe“ last one is ” );for(I=1;ii<

19、;=N;I+)if(linki.number)printf(“ %3d” ,lini.number);9.10 有两个链表a 和b,设结点中包含学号、姓名。从1 链表中删去与b 链表中有相同学号的那些结点。解:#define LA 4#define LB 5#define NULL 0struct studentchar nump6;char name8;struct student *next;ALA,bLB;main()struct student aLA= struct studentbLB=“ 101 ” , ” Wang” , “ 103 ” , ” Zhang ” ,“102”,

20、”LI ”,“ 104 ” , ” Ma” ,“ 105 ” , ” zhang ” ,“ 106 ” , ”“ 105 ” , ” Chen” ,“ 107 ” , ” Gu “ 108 ” , ” Lui ” ; int I,j;struct student *p, *p1,*p2,*pt,*head1,*head2;head1=a;head2=b;printf(“ list an ”: );for(p1=head1,i=1;p1<a=LA;i+)p=p1;p1->next=a+I;printf(“ %8s%8sn” ,p1->num,p1->name);p1=p1

21、->next;p->next=NULL;printf(“n” );for(p2=head2,I=1;p2<b+LB;I+)p=p2;p2->next=b+I;printf( “ %8s%8sn” ,p2->num,p2->name);p2=pa->next;p->next=NULL;printf(n“” );p1=head1;while(p1!=NULL)p2=head2;while(p2!=NULL&&strcmp(p1->num,p2->num)!=0)p2=p2->next;if(strcmp(p1->

22、;num,p2->num=0)if(p1=head1)head1=p1->next;elsep->next=p1->next;p=p1;p1=p1->next;p1=hedad1;printf“n” ;while(p1!=NULL)printf(“ %7s %7sn” ,p1->num,p1->name);p1=p1->next;9.11 建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。解: #define NULL 0#define LEN sizeof(struct s

23、tudent)struct studentchar num6;char name8;char sex2;int age;stuct student *next;stu10;main()struct student *p,*pt,*head;int I,length,iage,flag=1;int find=0;while(flag=1)printf( “ input length of list( <10 ) : ” );scanf(“ %d” ,&length);if(length<10)flag=0;for(I=0;I<lenth;I+)p=(struct stu

24、dent *)malloc(LEN);if(I=0)head=pt=p;elsept->next=p;pt=p;ptintf(“ NO:” );scanf(“ %s”->num);,pprntf(“ name: ” );scanf(“ %s”->name);,pprintf(“ sex: ” );scanf(“ %s”->sex);,pprintf(“ age: ” );scanf(“ %s”->age);,pp->next=NULL;p=head;printf(“n” );while(p!=NULL)printf(“ %4s%8s%6s%6dn” ,p-&

25、gt;num, p->name, p->sex, p->age);p=p->next;printf(“ Input age:” );scanf(“ %d” ,&iage);pt=head;p=pt;if(pt->age=iage)p=pt->next;head=pt=p;find=1;elsept=pt->next;while(pt!=NULL)if(pt->age=iage)p->next=pt->next;find=1;else p=pt;pt=pt->next;if(!find)printf(“ Not found%d.” ,iage);p=head;printf(“n” );while(p!=NULL)pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论