《C程序设计》谭浩强第四版课后答案下载

时间:2017-04-11 09:31:43 C语言答案 我要投稿

《C程序设计》谭浩强第四版课后答案下载

  由谭浩强教授著、清华大学出版社出版的《C程序设计》是一本公认的学习C语言程序设计的经典教材。以下是由阳光网小编整理关于《C程序设计》谭浩强第四版课后答案下载地址,希望大家喜欢!

  点击进入:《C程序设计》谭浩强第四版课后答案下载

  《C程序设计》谭浩强第四版课后答案预览

  11.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);

  }

  11.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

  }

  };

  11.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<N;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”);

  }

  11.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<N;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”);

  }

  }

  11.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<N;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<N;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);

  }

  11.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);

  }

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

  解:

  #define Null o

  #define NEWSIZE 1000

  char newbuf[NEWSIZE];

  char *newp=newbuf;

  free(char *p)

  {if((p>=newbuf)&&(p<newbuf+NEWSIZE))

  newp=p;

  }

  11.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。

  解:

  #include<stdio.h>

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

  }

  11.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(count<N-1)

  {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(“\nThe last one is”);

  for(I=1;ii<=N;I++)

  if(link[i].number)

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

  }

  11.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;p1<a=LA;i++)

  {p=p1;

  p1->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;p2<b+LB;I++)

  {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{“\n result:\n”};

  while(p1!=NULL)

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

  p1=p1->next;

  }

  }

  11.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<lenth;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;

  }

  }

  11.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;I<len;I++)

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

  p1=p1->next,

  }

  printf(“\n”);


【《C程序设计》谭浩强第四版课后答案下载】相关文章:

1.C程序设计第四版(谭浩强著)课后答案下载

2.《C程序设计》(谭浩强著)课后答案下载

3.C程序设计第三版(谭浩强)课后答案-WORD版 免费下载

4.《C++面向对象程序设计》谭浩强课后习题答案完整版免费下载 清华

5.C++面向对象程序设计(谭浩强版)课后题答案详解

6.C语言程序设计教程第三版(谭浩强 张基温著)课后答案下载

7.C语言程序设计(杨勇著)课后答案下载

8.C程序设计(李玲玲著)课后答案下载