您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 理学 > 《C语言程序设计》清华大学课后答案
1习题9一.选择题1.A2.A3.A4.A5.B6.C二编程题9.2编写一函数,判断N×N矩阵是否为上三角阵。上三角阵是指不含主对角线,下半三角都是0的矩阵。#includestdio.hintfun(intx[][3],intn){intflag=1,i,j;for(i=1;in;i++)for(j=0;ji;j++)if(x[i][j]!=0){flag=0;break;}returnflag;}voidmain(){inta[3][3]={{1,4,5},{0,2,6},{0,0,3}};intresult=fun(a,3);if(result==1)printf(此矩阵是上三角矩阵!\n);elseprintf(此矩阵不是上三角矩阵!\n);}9.3有一个字符串,包含n个字符,将字符串从第i个字符到第j个字符间的字符逆置。程序代码:#includestdio.h#includestring.hvoidinvertsub(char*str,inti,intj){char*p,*q,c;intn=0;p=q=str;if(str==NULL)printf(strisNULL!\n);elseif(i=0||jstrlen(str))printf(iandjvalueerror!\n);else{while(*p!='\0'&&n!=i-1){p++;n++;}q=p;while(*q!='\0'&&n!=j-1){q++;n++;}while(pq){c=*p;*p++=*q;*q--=c;}}}voidmain(){charstr[]=abcdefg;printf(%s\n,str);invertsub(str,2,5);printf(%s\n,str);}9.4题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数.程序源代码:main(){intnumber[20],n,m,i;printf(thetotalnumbersis:);scanf(%d,&n);printf(backm:);scanf(%d,&m);for(i=0;in-1;i++)scanf(%d,,&number[i]);scanf(%d,&number[n-1]);move(number,n,m);for(i=0;in-1;i++)printf(%d,,number[i]);printf(%d,number[n-1]);}move(array,n,m)intn,m,array[20];{int*p,array_end;array_end=*(array+n-1);for(p=array+n-1;parray;p--)*p=*(p-1);*array=array_end;m--;if(m0)move(array,n,m);}9.5输入n个整数,将最小数与第一个数对换,把最大数与最后一个数对换2程序源代码:main(){intnumber[10];input(number);max_min(number);output(number);}input(number)intnumber[10];{inti;for(i=0;i9;i++)scanf(%d,,&number[i]);scanf(%d,&number[9]);}max_min(array)intarray[10];{int*max,*min,k,l;int*p,*arr_end;arr_end=array+10;max=min=array;for(p=array+1;parr_end;p++)if(*p*max)max=p;elseif(*p*min)min=p;k=*max;l=*min;*p=array[0];array[0]=l;l=*p;*p=array[9];array[9]=k;k=*p;return;}output(array)intarray[10];{int*p;for(p=array;parray+9;p++)printf(%d,,*p);printf(%d\n,array[9]);}9.6输入n个字符串,按由小到大顺序输出。程序源代码:main(){char*str1[20],*str2[20],*str3[20];charswap();printf(pleaseinputthreestrings\n);scanf(%s,str1);scanf(%s,str2);scanf(%s,str3);if(strcmp(str1,str2)0)swap(str1,str2);if(strcmp(str1,str3)0)swap(str1,str3);if(strcmp(str2,str3)0)swap(str2,str3);printf(afterbeingsorted\n);printf(%s\n%s\n%s\n,str1,str2,str3);}charswap(p1,p2)char*p1,*p2;{char*p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}9.7写一函数,功能是交换两个实数变量的值。voidswap(float*x,float*y);main(){floata,b,*p1,*p2;a=10;b=20;p1=&a;p2=&b;printf("a=%f,b=%f\n",a,b);swap(p1,p2);printf("a=%f,b=%f\n",a,b);/*或printf(″%d%d″,*p1,*p2)*/}voidswap(float*pa,float*pb{floattemp;temp=*pa;*pa=*pb;*pb=temp;}9.10写一个函数,求一个字符串的长度。程序源代码:main(){intlen;char*str[20];printf(pleaseinputastring:\n);3scanf(%s,str);len=length(str);printf(thestringhas%dcharacters.,len);}length(p)char*p;{intn;n=0;while(*p!='\0'){n++;p++;}returnn;}9.11约瑟夫环问题:n个人围成一圈,从第一个人开始报数,凡报到3的人退出,问最后剩下的是第几号。程序代码:#definenmax50main(){inti,k,m,n,num[nmax],*p;printf(pleaseinputthetotalofnumbers:);scanf(%d,&n);p=num;for(i=0;in;i++)*(p+i)=i+1;i=0;k=0;m=0;while(mn-1){if(*(p+i)!=0)k++;if(k==3){*(p+i)=0;k=0;m++;}i++;if(i==n)i=0;}while(*p==0)p++;printf(%disleft\n,*p);}9.12#includestdio.h#defineNULL0#defineLENsizeof(structstudent)/*LEN表示结构体student的长度*/structstudent{longnum;intscore;structstudent*next;};/*student成员中的next仍为student结构体类型,链表必用此种结构*/structstudentlistA,listB;/*listA,listB皆为student结构体类型*/intn,sum=0;voidprint(head)/*输出函数*/structstudent*head;4{structstudent*p;printf(\nsum%drecord,theyare:\n,sum);p=head;/*从表头开始*/if(p!=NULL)do/*未到结尾时*/{printf(%ld%d\n,p-num,p-score);/*输出学号和成绩*/p=p-next;}/*指针前进*/while(p!=NULL);}structstudent*insert(ah,bh)/*定义插入函数*/structstudent*ah,*bh;{structstudent*pa1,*pa2,*pb1,*pb2;/*这四个指针皆为student结构体类型*/pa2=pa1=ah;/*两个指针指向第一链表的表头*/pb2=pb1=bh;/*两个指针指向第二链表的表头*/do{while((pb1-numpa1-num)&&(pa1-next!=NULL))/*注意是按学号链接.当第二个链表的学号大于第一个链表的学号而且未到第一个链表结尾时*/{pa2=pa1;pa1=pa1-next;}/*用pa2记下第一个链表的当前位置,pa1前进到下一个结点.到此已经脱离循环*/if(pb1-numpa1-num)/*如果某一步第二个链表的学号小于第一个链表的学号了*/{if(ah==pa1)ah=pb1;/*如果现在ah指向第一个链表的某结点,则让ah指向第二个链表的当前结点,乃因第二个链表的学号比第一个链表的学号小.注意ah为目标链表*/elsepa2-next=pb1;/*否则,第二个链表pa2指针指向第二个链表的当前位置*/pb1=pb1-next;pb2-next=pa1;/*做完上面的事情,两指针同时前进到下一个结点*/pa2=pb2;pb2=pb1;}}/*pa2指向第二个链表的当前位置,pb2指向第二个链表的当前位置*/while((pa1-next!=NULL)||(pa1==NULL&&pb1!=NULL));/*当第一个链表未到末尾或者第一个链表结束而第二个链表未结束时,便重复做上面的事情*/if((pb1-numpa1-num)&&(pa1-next==NULL))/*脱离循环时如果是第一个链表结束而且第二个链表之序号大于第一个链表之序号则把pa1之next域指向第二个链表的当前位置*/pa1-next=pb1;return(ah);}/*返回目标链表的头地址*/structstudent*creat()/*定义建立链表函数*/5{structstudent*p1,*p2,*head;/*此三个指针皆为student结构体类型*/n=0;/*计数器n赋初值为0*/p1=p2=(structstudent*)malloc(LEN);/*为结构体分配地址,p1,p2都指向这个地址*/printf(inputsnoscore:\n);printf(input0end.);scanf(%ld,%d,&p1-num,&p1-score);/*输入学号和成绩*/head=NULL;/*表头先置为空指针*/while(p1-num!=0)/*当输入的学号不为0时*/{n=n+1;/*计数器增值1*/if(n==1)head=p1;/*如果是第生个结点,head指向第一个结点*/elsep2-next=p1;/*如果不是第一个结点,链结到p2中,p2是建立的链表*/p2=p1;/*指针p2前进*/p1=(structstudent*)malloc(LEN);/*再分配地址*/scanf(%ld,%d,&p1-num,&p1-score);}/*再输入学号及成绩*/p2-next=NULL;/*当脱离循环时,链表已经建立完毕.勿忘给表尾一个空指针*/return(head);}/*返回表头地址*/main(){structstudent*ahead,*bhead,*abh;/*三个变量皆为结构体student类型*/ahead=creat();print(ahead);/*调用建立链表函数建立链表llistA,把返回地址赋给指针ahead*/sum=n;/*n为链表结点数*/bhead=creat();print(bhead);/*调用建立链表函数建立链表llistB,把返
本文标题:《C语言程序设计》清华大学课后答案
链接地址:https://www.777doc.com/doc-2864512 .html