




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c语⾔第⼗章课后作业答案,c语⾔第⼗章指针参考答案10.12⽤指针数组处理上⼀题⽬,字符串不等长。解:程序如下:(xt10-12.c)#include#includemain(){voidsort(char*p[]);inti;char*p[10],str[10][20];for(i=0;i<10;i++)p[i]=str[i];/*将第i个字符串的⾸地址赋予指针数组p的第i个元素*/printf("Input10strings:\n");for(i=0;i<10;i++)scanf("%s",p[i]);sort(p);printf("Now,thesequenceis:\n");for(i=0;i<10;i++)printf("%s\n",p[i]);}voidsort(char*p[]){inti,j;char*temp;for(i=0;i<9;i++)for(j=0;j<9-i;j++)if(strcmp(*(p+j),*(p+j+1))>0){temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;}}运⾏情况如下:Input10strings:China↙Japan↙Yemen↙Pakistan↙Mexico↙Korea↙Brazil↙Iceland↙Canada↙Mongolia↙Now,thesequenceis:BrazilCanadaChinaIcelandJapanKoreaMexicoMongoliaPakistanYemen10.13写⼀个⽤矩形法求定积分的通⽤函数,分别求:,,(说明:sin、cos、exp已在系统的数学函数库中,程序开头要⽤#include)。解:程序如下:(xt10-13.c)#include#includemain(){floatintegral(float(*p)(float),floata,floatb,intn);floata1,b1,a2,b2,a3,b3,c,(*p)(float);floatfsin(float);/*声明fsin函数*/floatfcos(float);/*声明fcos函数*/floatfexp(float);/*声明fexp函数*/intn=20;printf("Inputa1,b1:");/*输⼊求sinx定积分的下限和上限*/scanf("%f,%f",&a1,&b1);printf("Inputa2,b2:");/*输⼊求cosx定积分的下限和上限*/scanf("%f,%f",&a2,&b2);printf("Inputa3,b3:");/*输⼊求定积分的下限和上限*/scanf("%f,%f",&a3,&b3);p=fsin;c=integral(p,a1,b1,n);/*求出sinx的定积分*/printf("Theintegralofsin(x)is:%f\n",c);p=fcos;c=integral(p,a2,b2,n);/*求出cosx的定积分*/printf("Thtintegralofcos(x)is:%f\n",c);p=fexp;c=integral(p,a3,b3,n);/*求出ex的定积分*/printf("Theintegralofexp(x)is:%f\n",c);}floatintegral(float(*p)(float),floata,floatb,intn)/*⽤矩形法求定积分的通⽤函数*/{inti;floatx,h,s;h=(b-a)/n;x=a;s=0;for(i=1;i<=n;i++){x=x+h;s=s+(*p)(x)*h;}return(s);}floatfsin(floatx)/*计算sinx的函数*/{returnsin(x);}floatfcos(floatx)/*计算cosx的函数*/{returncos(x);}floatfexp(floatx)/*计算ex的函数*/{returnexp(x);}运⾏情况如下,Inputa1,b1:0,1↙Inputa2,b2:-l,1↙Inputa3,b3:0,2↙Theintegralofsin(x)is:O.480639Theintegralofcos(x)is:1.681539Theintegralofexp(x)is:6.713833说明:sin、cos和exp是系统提供的数学函数。在程序中定义3个函数fsin、fCOS和fexp分别⽤来计算sin(x)、cos(x)和exp(x)的值,在main函数中要声明这3个函数。在main函数中定义p为指向函数的指针变量,定义形式是“float(*p)(float)”,表⽰p指向的函数有⼀个实型形参,p可指向返回值为实型的函数。在main函数中有“p=fsin;”,表⽰将fsin函数的⼈⼝地址赋给p。在调⽤integral函数时,⽤p作为实参,把fsin函数的⼈⼝地址传递给形参p(形参p也定义为指向函数的指针变量),这样形参P也指向fsin函数,(*p)(x)就相当于fsin(x)。fsin(x)的值就是sinx的值。因此通过调⽤integral函数求出了sinx的定积分。求其余两个函数定积分的情况与此类似。10.14将n个数按输⼊顺序的逆序排列,⽤函数实现。解:程序如下:(xt10-14.c)#includemain(){voidsort(int*p,intm);inti,n;int*p,num[20];printf("inputn:");scanf("%d",&n);printf("pleaseinputthesenumbers:\n");for(i=0;iscanf("%d",&num[i]);p=&num[0];sort(p,n);printf("Now,thesequenceis:\n");for(i=0;iprintf("%d",num[i]);}voidsort(int*p,intm){inti;inttemp,*p1,*p2;for(i=0;i{p1=p+i;p2=p+(m-1-i);temp=*p1;*p1=*p2;*p2=temp;}}运⾏结果:inputn:l0↙pleaseinputthesenumbers:l0987654321↙Now,thesequenceis:1234567891010.15有⼀个班4个学⽣,5门课。(1)求第⼀门课的平均分;(2)找出有两门以上课程不及格的学⽣,输出他们的学号和全部课程成绩及平均成绩;(3)找出平均成绩在90分以上或全部课程成绩在85分以上的学⽣。分别编3个函数实现以上3个要求。解:程序如下:(xt10-15.c)#includemain(){voidavsco(float*psco,float*pave);voidavcour1(char*pcou,float*psco);voidfali2(charcourse[5][10],intnum[4],floatscore[4][5],floataver[4]);voidgood(charcourse[5][10],intnum[4],floatscore[4][5],floataver[4]);inti,j,*pnum,num[4];floatscore[4][5],aver[4],*psco,*pave;charcourse[5][10],*pcou;printf("Inputcourse:\n");pcou=course[0];for(i=0;i<5;i++)scanf("%s",course[i]);printf("InputNO.andscoures:\n");printf("NO.");for(i=0;i<5;i++)printf(",%s",course[i]);printf("\n");psco=&score[0][0];pnum=&num[0];for(i=0;i<4;i++){scanf("%d",pnum+i);for(j=0;j<5;j++)scanf(",%f",psco+5*i+j);}pave=&aver[0];printf("\n\n");avsco(psco,pave);/*求出每个学⽣的平均成绩*/avcour1(pcou,psco);/*求出第⼀门课的平均成绩*/printf("\n\n");fali2(pcou,pnum,psco,pave);/*找出2门课不及格的学⽣*/printf("\n\n");good(pcou,pnum,psco,pave);/*找出成绩好的学⽣*/}voidavsco(float*psco,float*pave)/*求每个学⽣的⼲均成绩的函数*/{inti,j;floatsum,average;for(i=0;i<4;i++){sum=0.0;for(j=0;j<5;j++)sum=sum+(*(psco+5*i+j));/*累计每个学⽣的各科成绩*/average=sum/5;/*计算平均成绩*/*(pave+i)=average;}}voidavcour1(char*pcou,float*psco)/*第⼀门课的平均成绩的函数*/{inti;floatsum,average1;sum=0.0;for(i=0;i<4;i++)sum=sum+(*(psco+5*i));/*累计每个学⽣的得分*/average1=sum/4;/*计算平均成绩*/printf("course1:%s,averagescore:%6.2f.\n",pcou,average1);}voidfali2(charcourse[5][10],intnum[4],floatscore[4][5],floataver[4])/*找两门以上课程不及格的学⽣的函数*/{inti,j,k,label;printf("========Studentwhoisfail============\n");printf("NO.");for(i=0;i<5;i++)printf("%10s",course[i]);printf("average\n");for(i=0;i<4;i++){label=0;for(j=0;j<5;j++)if((score[i][j])<60.0)label++;if(label>=2){printf("%5d",num[i]);for(k=0;k<5;k++)printf("%10.2f",score[i][k]);printf("%10.2f\n",aver[i]);}}}voidgood(charcourse[5][10],intnum[4],floatscore[4][5],floataver[4])/*找成绩优秀的学⽣(各门85分以上或平均90分以上)的函数*/{inti,j,k,n;printf("========Studentwhosescoreisgood========\n");printf("NO.");for(i=0;i<5;i++)printf("%10s",course[i]);printf("average\n");for(i=0;i<4;i++){n=0;for(j=0;j<5;j++)if((score[i][j])>85.0)n++;if((n==5)||(aver[i]>=90)){printf("%5d",num[i]);for(k=0;k<5;k++)printf("%10.2f",score[i][k]);printf("%10.2f\n",aver[i]);}}}运⾏情况如下:Inputcourse:(输⼊课程名称)English↙Computer↙Math↙Physics↙Chemistry↙InputNO.andscoures:(输⼊学号和各门课成绩)NO.,English,Computer,Math,Physics,Chemistry(按此顺序输⼊)101,34,56,88,99,89↙102,77,88,99,67,78↙103,99,90,87,86,89↙104,78,89,99,56,77↙course1:English,averagescore:72.00.(第⼀门课英语的平均成绩)========Studentwhoisfail============(有两门课不及格者)NO.EnglishComputerMathPhysicsChemistryaverage10134.0056.0088.0099.0089.0073.20========Studentwhosescoreisgood========(成绩优良者)NO.EnglishComputerMathPhysicsChemistryaverage10399.0090.0087.0086.0089.0090.20说明:程序中num是存放4个学⽣学号的⼀维数组,course是存放5门课名称的⼆维字符数组,score是存放4个学⽣5门课成绩的⼆维数组,aver是存放每个学⽣平均成绩的数组,pnum是指向num数组的指针变量,pcou是指向course数组的指针变量,psco是指向score数组的指针变量,pave是指向aver数组的指针变量函数的形参调⽤⽤数组,调⽤函数时的实参⽤指针变量。形参也可以不⽤数组⽽⽤指针变量,请读者⾃⼰分析。10.16输⼊⼀个字符串,内有数字和⾮数字字符,如:a123x456ㄩ17960?302tab5876将其中连续的数字作为⼀个整数,依次存放到⼀数组a中。例如:123放在a[0]中,456放在a[1]中……统计共有多少个整数,并输出这些数。解:程序如下:(xt10-16.c)#includemain(){charstr[50],*pstr;inti,j,k,m,e10,digit,ndigit,a[10],*pa;printf("Inputastring:\n");gets(str);printf("\n");pstr=&str[0];/*字符指针pstr置于数组str⾸地址*/pa=&a[0];/*指针pa置于数组a⾸地址*/ndigit=0;/*ndigit代表有多少个整数*/i=0;/*代表字符串中字符的位置*/j=0;/*代表连续数字的位数*/while(*(pstr+i)!='\0'){if((*(pstr+i)>='0')&&(*(pstr+i)<='9'))j++;else{if(j>0){digit=*(pstr+i-1)-48;/*将个数位赋予digit*/k=1;while(k/*将含有两位以上数的其他位的数值累计于digit*/{e10=1;for(m=1;m<=k;m++)e10=e10*10;/*e10代表该位数所应乘的因⼦*/digit=digit+(*(pstr+i-1-k)-48)*e10;/*将该位数的数值累加于digit*/k++;/*位数k⾃增*/}*pa=digit;/*将数值赋予数组a*/ndigit++;pa++;/*指针pa指向a数组下⼀元素*/j=0;}}i++;}if(j>0)/*以数字结尾字符串的最后⼀个数据*/{digit=*(pstr+i-1)-48;/*将个数位赋予digit*/k=1;while(k/*将含有两位以上数的其他位的数值累计于digit*/{e10=1;for(m=1;m<=k;m++)e10=e10*10;/*e10代表该位数所应乘的因⼦*/digit=digit+(*(pstr+i-1-k)-48)*e10;/*将该位数的数值累加于digit*/k++;/*位数k⾃增*/}*pa=digit;/*将数值赋予数组a*/ndigit++;j=0;}printf("Thereare%dnumbersinthisline.Theyare:\n",ndigit);j=0;pa=&a[0];for(j=0;j/*打印数据*/printf("%d",*(pa+j));printf("\n");}运⾏情况如下:Inputastring:a123x45617960?302tab5876↙Thereare6numbersinthisline.Theyare:12345617903025810.17写⼀函数,实现两个字符串的⽐较。即⾃⼰写⼀个strcmp函数,函数原型为:intstremp(char*p1,char*p2)设p1指向字符串s1,p2指向字符串s2。要求:当s1=s2时,返回值为0。当s1不等于s2时,返回它们⼆者的第⼀个不同字符的ASCII码差值(如“BOY”与“BAD”,第⼆字母不同,“O”与“A”之差为79-65=14);如果s1>s2,则输出正值;如果s1解:程序如下:(xt10-17.c)#includemain(){intstrcmp(char*p1,char*p2);intm;charstr1[20],str2[20],*p1,*p2;printf("Inputtwostrings:\n");scanf("%s",str1);scanf("%s",str2);p1=&str1[0];p2=&str2[0];m=strcmp(p1,p2);printf("result:%d\n",m);}intstrcmp(char*p1,char*p2)/*两个字符串⽐较的函数*/{inti;i=0;while(*(p1+i)==*(p2+i))if(*(p1+i++)=='\0')return(0);/*相等时返回结果0*/return(*(p1+i)-*(p2+i));/*不等时返回结果为第⼀个不等字符ASCII码的差值*/}运⾏情况如下:①Inputtwostrings:CHINA↙Chen↙Result:-32②Inputtwostrings:hello!↙Hello!↙Result:0③Inputtwostings:dog↙cat↙result:110.18编⼀个程序,打⼊⽉份号,输出该⽉的英⽂⽉名。例如,输⼊“3”,则输出“March”,要求⽤指针数组处理。解:程序如下:(xt10-18.c)#includemain(){char*month_name[13]={"illegalmonth","January","February","March","April","May","June","July","August","September","October","November","December"};intn;printf("Inputmonth:");scanf("%d",&n);if((n<=12)&&(n>=1))printf("Itis%s.\n",*(month_name+n));elseprintf("Itiswrong.\n");}运⾏结果:①Inputmonth:2↙ItisFebruary.②Inputmonth:8↙ItisAugust.③Inputmonth:13↙Itiswrong.10.19编写⼀个函数alloc(n),⽤来在内存区新开辟⼀个连续的空间(n个字节)。此函数的返回值是⼀个指针,指向新开辟的连续的空间的起始地址。再写⼀个函数free(p),将地址p开始的各单元释放(不能再被程序使⽤,除⾮再度开辟)。提⽰,先在内存规定出⼀⽚相当⼤的连续空间(例如1000个字节)。然后开辟与释放都在此空间内进⾏。假设指针变量p原已指向未⽤空间的开头,调⽤alloc(n)后,开辟了n个字节可供程序使⽤(例如,可以赋值到这些单元中)。现在需要使p的值变成p+n,表⽰空⽩未⽤区从p+n地址开始,同时要将新开辟区的起始位置(p)作为函数值返回,以表⽰可以利⽤从此点开始的单元。如果更新开辟的区太⼤(n⼤),超过了预设的空间(1000字符),则alloc(n)函数返回指针NULL,表⽰开辟失败。alloc(n)应返回⼀个指向字符数据的指针(因为开辟的区间是以字节为单位被利⽤的)。解:程序如下:(xt10-19.c)#defineNULL0/*当开辟失败时返回标志*/#defineALLOCSIZE1000/*可以开辟的最⼤的空间*/charallocbuf[ALLOCSIZE];/*开辟⼀个字符数组,作为存储区*/char*allocp=allobuf;/*指针指向存储区的起端*/char*alloc(intn)/*开辟存储区函数,开辟存储区后返回指针*/{if(allocp+n<=allocbuf+ALLOCSIZE){sallocp+=n;return(allocp-n);/*返回⼀个指针,它指向存区的开始位置*/}elsereturn(NULL);/*当存区不够分配时,返回⼀个空指针*/}voidfree(char*p)/*释放存储区函数*/{if(p>=allocbuf&&p>alloebuf+ALLOCSIZE)allocp=p;}说明:定义⼀个全局指针变量a11ocp,它指向指定的存储区中下⼀个可⽤的元素。开始时,allocp指向此存储区allocbuf的开头,当调⽤alloc(n)函数后,allocp指向a11ocbuf中的第n个元素如果调⽤时⽤以下语句:pt=alloc(n);则pt的值为刚才所开辟的空间的⾸地址(allocp'-n)。在调⽤free函数时,如果写出以下调⽤语句:free(pt);则把allocp的值改成pt,即使得allocp指向刚才开辟空间的开头,恢复allocp的原值,就相当于释放此段空间,使这段空间可以做其他⽤途。10.20⽤指向指针的指针的⽅法对5个字符串排序并输出。解:程序如下:(xt10-20.c)#include#defineLINEMAX20/*定义字符串的最⼤长度*/main(){voidsort(char**p);inti;char**p,*pstr[5],str[5][LINEMAX];for(i=0;i<5;i++)pstr[i]=str[i];/*将第i个字符串的⾸地址赋予指针数组pstr的第i个元素*/printf("Input5strings:\n");for(i=0;i<5;i++)scanf("%s",pstr[i]);p=pstr;sort(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农家书屋可持续发展影响因素分析与对策研究
- 公司定岗定级管理制度
- 2025企业新进员工试用期合同
- 福建省连城县2024~2025学年 高二下册3月月考数学试卷附解析
- 安徽省合肥市2024-2025学年高三下册2月检测数学试卷附解析
- 2024年杭州建德市医疗卫生事业单位招聘真题
- 孩子毕业家长发言材料
- 2024年贵州省粮食储备集团有限公司招聘考试真题
- 社区社区服务体系建设管理基础知识点归纳
- 社区邻里关系管理基础知识点归纳
- 《桥边的老人》公开课教案分享
- 09智能护理imedical管理用户手册
- 加油站安全隐患排查检查表
- 品牌策略营销课件(共105页).ppt
- 《饮料总酸度的测定》教学设计
- 煤炭工业露天煤矿可行性研究报告编制内容
- 广州市登革热疫情应急演练方案
- 螺杆制冷机组操作手册
- 篮球《原地单手肩上投篮》教案
- 实验室生物安全记录.doc
- 中国金矿地理分布
评论
0/150
提交评论