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

上传人:b****4 文档编号:5440880 上传时间:2022-12-16 格式:DOCX 页数:16 大小:18.19KB
下载 相关 举报
完整版C语言程序设计第四版第九章答案谭浩强.docx_第1页
第1页 / 共16页
完整版C语言程序设计第四版第九章答案谭浩强.docx_第2页
第2页 / 共16页
完整版C语言程序设计第四版第九章答案谭浩强.docx_第3页
第3页 / 共16页
完整版C语言程序设计第四版第九章答案谭浩强.docx_第4页
第4页 / 共16页
完整版C语言程序设计第四版第九章答案谭浩强.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

《完整版C语言程序设计第四版第九章答案谭浩强.docx》由会员分享,可在线阅读,更多相关《完整版C语言程序设计第四版第九章答案谭浩强.docx(16页珍藏版)》请在冰豆网上搜索。

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

完整版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”);

for(p1=head1,i=1;p1

{p=p1;

p1->next=a+I;

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

p1=p1->next;

}

p->next=NULL;

printf(“\nlistb:

\n”);

for(p2=head2,I=1;p2

{p=p2;

p2->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{“\nresult:

\n”};

while(p1!

=NULL)

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

p1=p1->next;

}

}

9.11建立一个链表,每个结点包括:

学号、姓名、性别、年龄。

输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

解:

#defineNULL0

#defineLENsizeof(structstudent)

structstudent

{charnum[6];

charname[8];

charsex[2];

intage;

stuctstudent*next;

}stu[10];

main()

{structstudent*p,*pt,*head;

intI,length,iage,flag=1;

intfind=0;

while(flag==1)

{printf(“inputlengthoflist(<10):

”);

scanf(“%d”,&length);

if(length<10)

flag=0;

}

for(I=0;I

{p=(structstudent*)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(“\nNO.namesexage\n”);

while(p!

=NULL)

{printf(“%4s%8s%6s%6d\n”,p->num,p->name,p->sex,p->age);

p=p->next;

}

printf(“Inputage:

”);

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;

}

elsep=pt;

pt=pt->next;

}

if(!

find)

printf(“Notfound%d.”,iage);

p=head;

printf(“\nNO.namesexage\n”);

while(p!

=NULL)

{

printf(“%4s%8s”,p->num,p->name);

printf(“%6s%6d”,p->sex,p->age);

p=p->next;

}

}

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

解:

#defineNULL0

structstu

{intnum;

structstu*next;

}

main()

{intlen=1l

structstu*p1,*p2,*head,*new,*newhead;

p1=p2=head=(structstu*)malloc(sizeof(strctstu));

printf(“inputnumber(0:

listend):

”);

scanf(“%d”,&p1->num);

while(p1->num!

=o)

{p1=(structstu*)malloc(sizeof(structstu));

printf(“inputnumber(n:

listend):

”);

scanf(“%d”,&p1->num);

if(p1->num==0)

p2->next=null;

else

{p2=>next=p1;

p2=p1;

len++;

}

}

p1=head;

pritnf(“\ntheoriginallist:

\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\nThenewlistL\n);

p1=newhead;

for(I=0l;I

{pritf(“4d,p1->num”);

p1=p1->next,

}

printf(“\n”);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1