您好,欢迎来到尚佳旅游分享网。
搜索
您的当前位置:首页C语言程序设计第四版第九章答案 谭浩强

C语言程序设计第四版第九章答案 谭浩强

来源:尚佳旅游分享网
第九章 9.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 解:Struct {int 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.day+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; }

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_d {int year: int month; int day; }date;

intdays(struct y_m_d date1) {int sum;

switch(data.month)

{case 1:sum=date1.day; break; case 2:sum=date1.day+31; break; case 3:sum=date1.day+59; break; case 4:sum=date1.day+90; break; case 5:sum=date1.day+120; break; case 6:sum=date1.day+151; break;

case 7:sum=date1.day+181; break; case 8:sum=date1.day+212; break; case 9:sum=date1.day+243; break case 10:sum=date1.day+243; break case 11:sum=date1.day+243; break case 12:sum=date1.day+243; break } };

9.3编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。 解:

#define N 5 struct student {char num[6]; char name[8]; int score[4]; }stu[N]; main() {int I,j ;

for(I=0;I{printf(“\\Input 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); }

print(struct student stu[6]) {int I,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个学生的数据记录。 解:

#define N 5 struct student

{char num[6]; char name[8]; int score[4] }stu[N];

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++);

scanf(“%d”, &stu[i].score[j]);} }

printf(“\\n”); } }

9.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)

解:#define N 10 struct student {char num[6] char name[8] int score[4] float avr; }stu[N]; main()

{int I,j,max,maxi,sum; float average; for(I=0;I{printf(“\\nInput 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]); } }

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. name score1 score2 score3 average\\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(“The highest score is:%s,score total:%d.”stu[maxi].name,max); }

9.6 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的内存空间。 解:new函数如下: #define NULL 0

#define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; char *new(int n)

{if (newp+n<=newbuf+ NEWSIZE) { newp= newp+n; return(newp-n); } else

return(NULL); }

9.7写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放。 解:

#define Null o

#define NEWSIZE 1000

char newbuf[NEWSIZE]; char *newp=newbuf; free(char *p)

{if((p>=newbuf)&&(p9.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。 解:

#include #define NULL 0

#define LENsizeof(struct student) strut student {long 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(“\\ninput list a:\\n”); ahead=creat(); sum=sum+|n;

abh=insert(ahead,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(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; do

{while((pb1->num>pa1->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)) ap1->next=pb1; return(ah); }

void print(struct student *head) {struct student *p;

printf(“%ld%d\\n”,p->num,p->score); p=p->next;

while(p!=NULL); }

9.9 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。 解:

#define N 13 struct person {int number; int nextop; }link[N+1]; main()

{int I,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(“sequence that person2 leave the circle:\\n”); while(countwhile(I!=3)

{h=link[h].nextp; if(link[h].number) I++; }

printf(“%4d”,link[h].number); link[h].number=0; count++; }

printf(“\\nThe last one is”); for(I=1;ii<=N;I++)

if(link[i].number)

printf(“%3d”,lin[i].number); }

9.10有两个链表a和b,设结点中包含学号、姓名。从1链表中删去与b链表中有相同学号的那些结点。 解:

#define LA 4 #define LB 5 #define NULL 0 struct student {char nump[6]; char name[8];

struct student *next; }A[LA],b[LB]; main()

{struct student a[LA]={{“101”,”Wang”},{“102”,”LI”},{“105”,”zhang”},{“106”,”Wei”}}; struct studentb[LB]={{“103”,”Zhang”},{“104”,”Ma”},{“105”,”Chen”},{“107”,”Guo”}, {“108”,”Lui”}}; int I,j;

struct student *p, *p1,*p2,*pt,*head1,*head2; head1=a; head2=b;

printf(“list a :\\n”);

for(p1=head1,i=1;p1p1->next=a+I;

printf(“%8s%8s\\n”,p1->num,p1->name); p1=p1->next; }

p->next=NULL; printf(“\\n list b:\\n”);

for(p2=head2,I=1;p2p2->next=b+I;

printf(“%8s%8s\\n”,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->num,p2->num==0)) if(p1==head1)

head1=p1->next; else

p->next=p1->next; p=p1;

p1=p1->next; }

p1=hedad1;

printf{“\\n result:\\n”}; while(p1!=NULL)

{printf(“%7s %7s\\n”,p1->num,p1->name); p1=p1->next; } }

9.11建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。 解:#define NULL 0

#define LEN sizeof(struct student)

struct student {char num[6]; char name[8]; char sex[2]; int age;

stuct student *next; }stu[10]; 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{p=(struct student *)malloc(LEN); if(I==0)

head=pt=p; else

pt->next=p; pt=p;

ptintf(“NO:”);

scanf(“%s”,p->num); prntf(“name:”);

scanf(“%s”,p->name); printf(“sex:”);

scanf(“%s”,p->sex); printf(“age:”);

scanf(“%s”,p->age); }

p->next=NULL; p=head;

printf(“\\n NO. name sex age\\n”); while(p!=NULL)

{printf(“%4s%8s%6s%6d\\n”,p->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; }

else

pt=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 NO.name sex age\\n”); while(p!=NULL) {

printf(“%4s%8s”,p->num,p->name); printf(“%6s%6d”,p->sex,p->age); p=p->next; } }

9.12将一个链表按逆序排列,即将链头当链尾,链尾当链头。 解:

# define NULL 0 struct stu {int num;

struct stu *next; }

main() {int len=1l

struct stu *p1,*p2,*head,*new,*newhead;

p1=p2=head=(struct stu * )malloc(sizeof(strct stu)); printf(“input number(0:list end):”); scanf(“%d”,&p1->num); while(p1->num!=o)

{p1=(struct stu*)malloc(sizeof(struct stu)); printf(“input number(n:listend):”); scanf(“%d”,&p1->num); if(p1->num==0)

p2->next=null; else

{p2=>next=p1; p2=p1; len++; } }

p1=head;

pritnf(“\\n the original list:\\n”); do

{printf(“%4d”,p1->num); if(p1->next!=NULL) p1=p1->next; }

while(p1->next!=NULL) {p2=p1;

p1=p1->next; }

if(I==0)

newhead=new=p1; else

new=nes->next=p1; p2->next=NULL; }

printf(\\n\\n The new listL\\n); p1=newhead;

for(I=0l;Inum”); p1=p1->next, }

printf(“\\n”); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- shangjiatang.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务