




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计第五版谭浩强课后答案第⼋章习题答案C语⾔程序设计第五版谭浩强课后答案C语⾔程序设计第五版第⼋章答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。1.输⼊3个整数,要求按由⼩到⼤的顺序输出。解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include<stdio.h>voidswap(int*p_a,int*p_b){inttemp=*p_a;*p_a=*p_b;*p_b=temp;}intmain(){inta,b,c,*p_a=&a,*p_b=&b,*p_c=&c;//获取每个变量空间的地址printf("Pleaseenterthreenumbers:");scanf_s("%d%d%d",p_a,p_b,p_c);if(*p_a>*p_b){swap(p_a,p_b);//通过指针进⾏指向空间内的数据交换}if(*p_a>*p_c){swap(p_a,p_c);}if(*p_b>*p_c){swap(p_b,p_c);}printf("%d%d%d\n",*p_a,*p_b,*p_c);system("pause");return0;}2.输⼊3个字符串,要求按由⼩到⼤的顺序输出。解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。答案:#include<stdio.h>intmain(){charstr[3][32];char*p[3];printf("Pleaseenterthreestrings:");for(inti=0;i<3;i++){p[i]=str[i];scanf_s("%s",p[i],32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//p[0]p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]让和进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for(inti=0;i<2;i++){for(intj=i+1;j<3;j++){if(strcmp(p[i],p[j])>0){char*tmp=p[i];p[i]=p[j];p[j]=tmp;}}}printf("%s%s%s\n",p[0],p[1],p[2]);system("pause");return0;}3.输⼊10个整数,将其中最⼩的数与第⼀个数对换,把最⼤的数与最后⼀个数对换。写3个函数:①输⼈10个数;②进⾏处理;③输出10个数。解题思路:在进⾏数值逐个⽐较的同时找到最⼩值的空间地址以及最⼤值的空间地址,使⽤这两个空间中的数据最终与第⼀和最后数据进⾏对换即可。答案:#include<stdio.h>voidinput(int*arry,intlen){for(inti=0;i<len;i++){scanf_s("%d",&arry[i]);}}voidprint(int*arry,intlen){for(inti=0;i<len;i++){printf("%d",arry[i]);}printf("\n");}voidhandle(int*arry,intlen){intmax_num=arry[0],min_num=arry[0];int*p_max=NULL,*p_min=NULL;for(inti=1;i<len;i++){if(min_num>arry[i]){//逐个⽐对后找出最⼩值min_num=arry[i];p_min=&arry[i];//逐个⽐对后找到最⼩值的空间地址}if(max_num<arry[i]){//逐个⽐对后找出最⼤值max_num=arry[i];p_max=&arry[i];//逐个⽐对后找到最⼤值的空间地址}}inttmp;tmp=*p_min;*p_min=arry[0];arry[0]=tmp;//最⼩值与第⼀个数据交换tmp=*p_max;*p_max=arry[len-1];arry[len-1]=tmp;//最⼤值与最后⼀个数据交换}intmain(){intarry[10];printf("Pleaseentertennums:");input(arry,10);handle(arry,10);print(arry,10);system("pause");return0;}4.有n个整数,使前⾯各数顺序向后移m个位置,最后m个数变成最前⾯m个数,见图8.43。写⼀函数实现以上功能,在主函数中输⼈n个整数和输出调整后的n个数。解题思路:找出倒数第m个数据,从这⾥开始保存倒数第m位置的数据,因为倒数第m位置的数据要放到数组最前⽅,将m之前的数据向后偏移⼀位,然后将数组第⼀个位置的数据替换为保存的m位的数据,逐个往后递增即可。答案:#include<stdio.h>voidmove(int*arry,intn,intm){intend_idx=n-m;//找到倒数第m个数据的位置,也就是要移动到数组⾸部的数据的起始位置for(inti=0;i<m;i++){int*p=arry+end_idx+i;//从倒数第m个数据的位置开始逐渐向后偏移直到数组尾部inttmp=*p;//获取到这个位置的值,⽤于数组前边数据向后偏1移位之后,向数组第位i赋值从第位开始逐个向后偏移⼀位for(intj=end_idx+i;j>i;j--){//i*p=*(p-1);p--;}*(arry+i)=tmp;//i数组的前第个数字逐个替换为后边被覆盖的值}}intmain(){intnumber[32],n,m,i;printf("Pleaseenterthenumberofnumbers:");scanf_s("%d",&n);//先确定要输⼊多少个数字printf("Pleaseenter%dnumbers:",n);for(i=0;i<n;i++){scanf_s("%d",&number[i]);//输⼊指定个数的数字}printf("Numberofpositionstomove:");scanf_s("%d",&m);//确定要向后移动多少个位置move(number,n,m);for(i=0;i<n;i++){printf("%d",number[i]);}printf("\n");system("pause");return0;}5.有n个⼈围成⼀圈,顺序排号。从第1个⼈开始报数(从1到3报数),凡报到3的⼈退出圈⼦,问最后留下的是原来第⼏号的那位。解题思路:从第⼀个⼈开始,逐个报数,谁报3就退出,并且重置报数,直到最后⼀个⼈后,⼜重新从第⼀个⼈继续报数,直到最终只剩⼀个⼈的时候退出即可。答案:#include<stdio.h>intmain(){intpeople[128],n;printf("Pleaseinputhowmanypeople:");scanf_s("%d",&n);for(inti=0;i<n;i++){people[i]=i+1;//对每个⼈顺序排号}intremain=n;intnum_off=0;int*p=NULL;while(remain>1){p=people;while(p!=people+n){//,每次从第⼀个位置开始,直到最后⼀个位置报数是⼀直递增的if((*p)!=0){//若这个位置⼈还在num_off++;//则报数if(num_off==3){//否则当前的⼈即将要报的数字是3*p=0;//则剔除这个⼈num_off=0;//并且重新开始计数,下边会++,所以是从1开始报数remain--;//-1剩余⼈数}}p++;}}for(inti=0;i<n;i++){if(people[i]!=0){printf("Serialnumberoftheremainingperson:%d\n",people[i]);}}printf("\n");system("pause");return0;}6.写⼀函数,求⼀个字符串的长度。在main函数中输⼊字符串,并输出其长度。解题思路:字符串以\0作为结尾,则从第⼀个字符开始向后移动遇到\0认为字符串结束。答案:#include<stdio.h>intmystrlen(char*str){intlen=0;char*ptr=str;while(*ptr!='\0'){ptr++;len++;}returnlen;}intmain(){charbuf[1024];printf("Pleaseenterastring:");scanf_s("%s",buf,1024);printf("stringlen:%d\n",mystrlen(buf));system("pause");return0;}7.有⼀字符串,包含n个字符。写⼀函数,将此字符串中从第m个字符开始的全部字符复制成为另⼀个字符串。解题思路:当字符串指针移动到源字符串的第m位时,则开始向另⼀个缓冲区中写⼊剩下的数据答案:#include<stdio.h>#include<string.h>intmain(){charbuf1[1024],buf2[1024];printf("Pleaseenterastring:");scanf_s("%s",buf1,1024);intm;printf("Pleaseenteralocationtostartcopying:");scanf_s("%d",&m);if(m<0||m>strlen(buf1)){//检测输⼊的位置是否合法printf("Illegallocationentered\n");return-1;}char*ptr1=buf1+m;//从第m个位置开始复制新数据char*ptr2=buf2;while(*ptr1!='\0'){*ptr2++=*ptr1++;}*ptr2='\0';//不要忘了字符串结尾标志printf("%s\n",buf2);system("pause");return0;}8.输⼊⼀⾏⽂字,找出其中⼤写字母、⼩写字母、空格、数字以及其他字符各有多少。解题思路:字符可以直接进⾏⽐较,但是要注意字符串中的数字是字符数字,必须以字符的形式⽐较,也就是加上单引号答案:#include<stdio.h>#include<string.h>intmain(){charbuf[1024];printf("Pleaseenterastring:");gets_s(buf,1024);intupper_count=0,lower_count=0,digit_count=0,space_count=0,other_count=0;char*ptr=buf;while(*ptr!='\0'){if(*ptr>='A'&&*ptr<='Z'){//⼤写字母upper_count++;}elseif(*ptr>='a'&&*ptr<='z'){//⼩写字母lower_count++;}elseif(*ptr>='0'&&*ptr<='9'){//数字字符digit_count++;}elseif(*ptr==''){//空格字符space_count++;}else{//其他字符other_count++;}ptr++;}printf("upper:%d;lower:%d;digit:%d;space:%d;other:%d\n",\upper_count,lower_count,digit_count,space_count,other_count);system("pause");return0;}9.写⼀函数,将⼀个3x3的整型矩阵转置。解题思路:矩阵转置就是⾏变列,列变⾏,说⽩了就是arry[i][j]转换为arry[j][i];但是需要注意的是,⼀.因为⾏列个数可能并⾮相同,转换后⾏数或者列数变多了或者变少,因此不能直接转换。需要重新申请空间存储转换后的数据。⼆.⼆维数组是线性扁平化存储的,⽆法确定列数的情况下传参后,在函数中使⽤时需要头指针向后偏移列数*第n⾏才能访问到第n⾏的数据。例如在函数中访问arry[i][j],需要通过arry+col_num*i+j⽅式进⾏访问。答案:#include<stdio.h>int**transform(int**arry,introw_count,intcol_count){//列变⾏,⾏变列,则⾏的个数是以前列的个数,列的个数是以前⾏的个数int**p=NULL;//矩阵中有多少⾏,取决于以前有多少列,然后申请地址空间p=(int**)malloc(sizeof(int*)*col_count);for(inti=0;i<col_count;i++){//⼀⾏中有多少列,取决于以前有多少⾏,然后申请空间p[i]=(int*)malloc(sizeof(int)*row_count);}for(inti=0;i<col_count;i++){for(intj=0;j<row_count;j++){//ji⼆维数组的存储是扁平化的,访问第⾏第列的数据,应该是arry+j*列数+i//j是新数组的列,但是是源数组的⾏p[i][j]=(arry+col_count*j)[i];}}returnp;}intmain(){intarry[3][4];printf("Pleaseentera3x4matrix:\n");for(inti=0;i<3;i++){for(intj=0;j<4;j++){scanf_s("%d",&arry[i][j]);}}int**p=transform(arry,3,4);printf("\n");for(inti=0;i<4;i++){for(intj=0;j<3;j++){printf("%d",p[i][j]);}free(p[i]);//释放⼆级指针中每个⼀级指针申请的空间printf("\n");}free(p);//释放总体⼆级指针的空间system("pause");return0;}10.将⼀个5x5的矩阵中最⼤的元素放在中⼼,4个⾓分别放4个最⼩的元素(顺序为从左到右,从上到下依次从⼩到⼤存放),写⼀函数实现之。⽤main函数调⽤。解题思路:将⼆维数组当做⼀维数组进⾏处理⽐较⽅便,⽽⼆维数组本⾝就是扁平化存储,所以直接使⽤⾸地址即可。先遍历找到最⼤值,将其与中间数字交换,⽽中间数字的下标就是数字总数除以2;其次寻找四次最⼩值,每次寻找的时候将最⼩值的下标记录起来,前提是这个数字如果已经是选中的最⼩数字之⼀,则需要跳过,也就是只跟剩余的数字作⽐较。(第⼆次开始遍历找最⼩数字的时候,千万不能与第⼀个最⼩数进⾏⽐较,否则永远都只有⼀个最⼩数)。答案:
#include<stdio.h>#include<string.h>voidtransform(int*arry,intcol_row){//找到最⼤值intmax=arry[0],max_idx;for(inti=0;i<col_row*col_row;i++){if(max<arry[i])max=arry[i];//找出最⼤数max_idx=i;}//⾏列相乘得到总数量,除以2后加1则为中⼼点(暂时不考虑偶数的情况)intcenter_idx=(col_row*col_row)/2;inttmp=arry[center_idx];arry[center_idx]=arry[max_idx];arry[max_idx]=tmp;//找到四个最⼩值intmin_idx[4];for(inti=0;i<4;i++){//循环4次获取到最⼩值intmin_tmp=arry[col_row*col_row-1];for(intj=0;j<col_row*col_row;j++){//遍历所有数据,逐个⽐较获取最⼩值intk=0;for(;k<i;k++){//但是要注意如果某个下标的数据已经是获取过的最⼩,值则不能进⾏判断(因为这个肯定是最⼩的)if(j==min_idx[k])break;}if(k!=i){continue;}//k和i不同表⽰j这个坐标已经是找到的最⼩的⼏个数字之⼀,则找下⼀个判断if(min_tmp>arry[j]){//相当于在剩下的数中找到最⼩的那个数字min_tmp=arry[j];min_idx[i]=j;//并且记录这个数字的位置}}}intchange_idx[4];//先计算四个⾓的下标,便于后边进⾏交换change_idx[0]=0;//第⼀个要置换的数据的下标,也就是左上⾓change_idx[1]=col_row-1;//第⼆个要置换的数据的下标,也就是右上⾓change_idx[2]=col_row*(col_row-1);//第⼀个要置换的数据的下标,也就是左下⾓change_idx[3]=(col_row*col_row)-1;//第⼀个要置换的数据的下标,也就是右下⾓for(inti=0;i<4;i++){inttmp=arry[change_idx[i]];arry[change_idx[i]]=arry[min_idx[i]];arry[min_idx[i]]=tmp;}return;}intmain(){intarry[5][5];printf("Pleaseentera5x5matrix:\n");for(inti=0;i<5;i++){for(intj=0;j<5;j++){scanf_s("%d",&arry[i][j]);}}transform(*arry,5);//将⼆维数组当做⼀维数组传⼊处理,并且传⼊⾏列数printf("\n");for(inti=0;i<5;i++){for(intj=0;j<5;j++){printf("%d",arry[i][j]);}printf("\n");}system("pause");return0;}11.在主函数中输⼊10个等长的字符串。⽤另⼀函数对它们排序。然后在主函数输出这10个已排好序的字符串。解题思路:排序⽅式与数字⽐较没什么不同,先遍历⽐较找出最⼤的字符串,与第⼀个字符串进⾏交换,然后剩下的进⾏⽐较找出最⼤的字符串与第⼆个交换…需要主机的就是字符串的⽐较采⽤strcmp接⼝,返回值⼤于0表⽰第⼀个字符串⼤于第⼆个字符串答案:#include<stdio.h>#include<string.h>voidsort(chars[10][32]){inti,j;for(i=0;i<10;i++){for(j=i;j<10;j++){if(strcmp(s[i],s[j])>0){chartmp[32];strcpy_s(tmp,32,s[i]);strcpy_s(s[i],32,s[j]);strcpy_s(s[j],32,tmp);}}}}intmain(){charstr[10][32];printf("Pleaseentertenstrings:\n");for(inti=0;i<10;i++){scanf_s("%s",str[i],32);}sort(str);printf("\n");for(inti=0;i<10;i++){printf("%s\n",str[i]);}system("pause");return0;}12.⽤指针数组处理上⼀题⽬,字符串不等长。解题思路:与数字的⽐较没什么区别,只不过需要采⽤strcmp进⾏字符串的⼤⼩⽐较,使⽤指针实现需要在最早接收数据的时候就采⽤字符串指针数组,这样的好处在于指针的指向可以直接通过赋值进⾏改变,⽽指针数组中的字符串的顺序只需要交换不同字符串的地址就可以实现答案:#include<stdio.h>#include<string.h>voidsort(char*s[10]){inti,j;for(i=0;i<10;i++){for(j=i;j<10;j++){if(strcmp(s[i],s[j])>0){char*tmp=s[i];//指针的好处在于直接通过赋值可以改变指向s[i]=s[j];//只要交换了字符串的地址就实现了字符串的交换s[j]=tmp;//因此通过指针指向的交换就能够实现数组中字符串的排序}}}}intmain(){char*str[10];printf("Pleaseentertenstrings:\n");for(inti=0;i<10;i++){str[i]=malloc(32);//为每⼀个指针分配空间scanf_s("%s",str[i],32);}sort(str);printf("\n");for(inti=0;i<10;i++){printf("%s\n",str[i]);free(str[i]);}system("pause");return0;}11113.写⼀个⽤矩形法求定积分的通⽤函数,分别求∫0sinxdx,∫0cosxdx,∫0exdx,,说明:sin,cos,exp函数已在系统的数学函数库中,程序开头要⽤#include<math.h>。解题思路:矩形法,学过⾼等数学就知道化曲为直的思想。将定积分化为多个函数连续的和。基本思想是将区间[a,b]化成n等分,当n越⼤的时候结果越准确。图形化成⼀⼩块⼀⼩块的矩形。底边长都为(b-a)/n.⾼为每个等分点的函数值。然后将每个矩形的⾯积相加即为所求。因为被分成n等分,就可以认为每⼀等分是⼀个矩形,那么每⼀矩形的⾯积为:每⼀个矩形⾯积为:Sn=f(x)(b-a)/n;总⾯积为:S=S1+S2+…+Sn;具体计算过程根据公式套即可这⾥主要在于函数指针的应⽤,将函数作为参数传递给另⼀个函数,在另⼀个函数中进⾏调⽤的⽅式向外提供统⼀接⼝,⽽接⼝内的处理⽅式随着传⼊的函数⽽不同。答案:#include<stdio.h>#include<math.h>doubleintegral(double(*handler)(double),doublea,doubleb,intn){doublei,s=0;doubleh=(b-a)/n;for(i=a;i<=b;i+=h){s+=handler(i)*h;}returns;}intmain(){doublea,b;intn=200000;//区间划分个数intfunc_idx;//计算函数选择idprintf("Pleaseenterthelowerandupperlimitofintegration:");scanf_s("%lf%lf",&a,&b);printf("Pleaseenterspecificcalculationfunction(1-sin/2-cos/3-exp):");scanf_s("%d",&func_idx);switch(func_idx){case1:printf("Theintegralofsin(x)is:%lf\n",integral(sin,a,b,n));break;case2:printf("Theintegralofcos(x)is:%lf\n",integral(cos,a,b,n));break;case3:printf("Theintegralofexp(x)is:%lf\n",integral(exp,a,b,n));break;default:printf("functioniderror\n");return-1;}system("pause");return0;}14.将n个数按输⼊时顺序的逆序排列,⽤函数实现。解题思路:定义两个指针,⼀个指向数组头部,⼀个指向数组尾部,头部每次+1,尾部每次-1;则在头部⼩于尾部的情况下进⾏数据交换即可。答案:#include<stdio.h>#include<math.h>voidreorder(int*arry,intn){int*start=arry;int*end=arry+n-1;for(;start<end;start++,end--){inttmp=*start;*start=*end;*end=tmp;}return;}intmain(){intarry[10];printf("Pleaseentertennumbers:");for(inti=0;i<10;i++){scanf_s("%d",&arry[i]);}reorder(arry,10);printf("\n");for(inti=0;i<10;i++){printf("%d",arry[i]);}printf("\n");system("pause");return0;}15.有⼀个班4个学⽣,5门课程。①求第1门课程的平均分;②找出有两门以上课程不及格的学⽣,输出他们的学号和全部课程成绩及平均成绩;③找出平均成绩在90分以上或全部课程成绩在85分以上的学⽣。分别编3个函数实现以上3个要求。解题思路:4个学⽣,5门课程就是⼀个4x5的⼆维数组,1.求第⼀门课的平均分,就是将第0列数据相加除以学⽣⼈数2.遍历每个学⽣的成绩,判断不及格次数,若⼤于2则输出信息即可3.统计每个学⽣总成绩,以及对每门课程成绩进⾏判断即可答案:#include<stdio.h>#include<stdio.h>#include<math.h>floatavg(intarry[][5],intn){floatsum=0;for(inti=0;i<n;i++){sum+=arry[i][0];}printf("Averageofcourse1:%f\n",(sum/n));return(sum/n);}voidfail(intarry[][5],intn){printf("Informationonstudentswhofailinmorethantwocourses:");for(inti=0;i<n;i++){intsum=0,fail_count=0;for(intj=0;j<5;j++){if(arry[i][j]<60){fail_count++;}}if(fail_count<=2){continue;}printf("seq:%d",i+1);printf("score:");for(intj=0;j<5;j++){sum+=arry[i][j];printf("%d",arry[i][j]);}printf("avg:%d",sum/5);printf("\n");}return;}voidexcellent(intarry[][5],intn){inti,j;for(i=0;i<n;i++){intsum=0,count=0;for(j=0;j<5;j++){sum+=arry[i][j];//计算总分⽤于计算平均分if(arry[i][j]>85){count++;//若每门课都⼤于85则count总会与j同步++}}if((sum/5)>90||count==j){printf("Excellentstudents:%d\n",i+1);}}return;}intmain(){intarry[4][5];printf("Pleaseentera4x5matrix:\n");for(inti=0;i<4;i++){for(intj=0;j<5;j++){scanf_s("%d",&arry[i][j]);}}avg(arry,4);fail(arry,4);excellent(arry,4);printf("\n");system("pause");return0;}16.输⼊⼀个字符串,内有数字和⾮数字字符,例如:A123x45617960?,302tab5876,将其中连续的数字作为⼀个整数,依次存放到⼀数组a中。例如,123放在a[0],456放在a1[1]…统计共有多少个整数,并输出这些数。解题思路:遇到数字字符,则开始统计连续数字字符的个数,统计完毕后,则从右往左每次乘以10(除了个位数)作为数字的单位,最终相加得到数字;然后越过这个数字,从后边继续查找。答案:#include<stdio.h>#include<string.h>voidcount_digit(char*str){intdigit[32],count=0;char*ptr=str;inti=0,str_len=strlen(str);while(i<str_len){if(*(ptr+i)>='0'&&*(ptr+i)<='9'){intlen=1;//⽤于统计连续数字的个数while(*(ptr+i+len)>='0'&&*(ptr+i+len)<='9'&&(i+len)<str_len){//找出从当前位置连续数字的个数len++;}intsum=*(ptr+i+len-1)-'0';//先获取个位数的数据intunit=1;//每⼀位的单位,从⼗位开始每次乘以10作为单位for(intj=len-2;j>=0;j--){//从右往左逐个处理unit*=10;sum+=(*(ptr+i+j)-'0')*unit;}digit[count++]=sum;i+=len;//i需要加上len的长度,越过这个数字,防⽌⼀个连续数字中的字符重复处理continue;}i++;}for(inti=0;i<count;i++){printf("%d",digit[i]);}return;}intmain(){charbuf[1024]={0};printf("Pleaseenterastringwithnumbers:\n");gets_s(buf,1024);count_digit(buf);printf("\n");system("pause");return0;}17.写⼀函数,实现两个字符串的⽐较。即⾃⼰写⼀个strcmp函数,函数原型为intstrcmp(char*p1,char*p2);设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0;若s1≠s2,返回它们⼆者第1个不同字符的ASCII码差值(如"BOY"与"BAD",第2个字母不同,0与A之差为79-65=14)。如果s1>s2,则输出正值;如果s1<s2,则输出负值。解题思路:使⽤两个指针指向两个字符串⾸部,逐个往后进⾏⽐较,不相等的时候则将数据进⾏相减,作为返回值。答案:#include<stdio.h>#include<string.h>intmystrcmp(char*str1,char*str2){char*ptr1=str1;char*ptr2=str2;intres;while(*ptr1!='\0'&&*ptr2!='\0'){if(*ptr1!=*ptr2){res=*ptr1-*ptr2;break;}ptr1++;ptr2++;}if(*ptr1=='\0'||*ptr2=='\0'){//注意⼀个字符串到达结尾或者两个都到达结尾的情况res=*ptr1-*ptr2;}returnres;}intmain(){charbuf1[1024]={0};charbuf2[1024]={0};while(1){printf("Pleaseentertwostrings:\n");gets_s(buf1,1024);gets_s(buf2,1024);printf("mystrcmp:%d",mystrcmp(buf1,buf2));printf("\n");}system("pause");return0;}18.编⼀程序,输⼊⽉份号,输出该⽉的英⽂⽉名。例如,输⼈3,则输出"March",要求⽤指针数组处理。解题思路:⾸先定义字符串指针数字,数组中每⼀个元素都存放⼀个字符串指针,每个指针指向不同字符串的位置。则输⼊⽉份数字后,根据下标获取对应⽉份字符串的地址即可答案:#include<stdio.h>intmain(){intmonth;char*Month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};while(1){printf("Pleaseenterthemonth:");scanf_s("%d",&month);if(month<1&&month>12){printf("Inputerror,Monthshouldbegreaterthan0andlessthan12\n");}printf("%s\n",Month[month-1]);}return0;}19.(1)编写⼀个函数new,对n个字符开辟连续的存储空间,此函数应返回⼀个指针(地址),指向字符串开始的空间。new(n)表⽰分配n个字节的内存空间。(2)写⼀函数free,将前⾯⽤new函数占⽤的空间释放。free§表⽰将p(地址)指向的单元以后的内存段释放。解题思路:封装malloc函数申请空间,封装free函数释放空间;答案:#include<stdio.h>#include<stdlib.h>void*mynew(intn){returnmalloc(n);}voidmyfree(char*p){returnfree(p);}intmain(){intnum;char*str=NULL;printf("Pleaseenternumber:");scanf_s("%d",&num);printf("beforenewp--%p:%s\n",str,str);//申请空间之前,查看指针的地址和指向空间数据str=(char*)mynew(num);printf("afternewp--%p:%s\n",str,str);//申请空间之后,查看指针的地址和指向空间数据printf("Pleaseenterastring:");scanf_s("%s",str,num);printf("beforefreep--%p:%s\n",str,str);//释放空间之前,查看指针的地址和指向空间数据myfree(str);printf("afterfreep--%p:%s\n",str,str);//释放空间之后,查看指针的地址和指向空间数据system("pause");return0;}20.⽤指向指针的指针的⽅法对5个字符串排序并输出。**解题思路:**指向指针的指针其实就是⼆级指针,使⽤⼆级指针的保存⼀级指针的地址,让这个⼀级指针指向具体的数据空间;定义⼀个字符串指针数组包含5个元素,每个元素可以保存⼀个字符串的⾸地址,⽽这个地址指向的是具体的字符串数据空间,通过指针访问实现对指向空间内的字符串进⾏⽐较排序交换即可。答案:#include<stdio.h>#include<string.h>voidsort(char*s[10]){inti,j;for(i=0;i<10;i++){for(j=i;j<10;j++){if(strcmp(s[i],s[j])>0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年小学劳动技术试卷及答案
- 2025年基础护理学环境考研题库及答案
- 广联达bim相关考试题目及答案
- 2025年营养师考试专项训练试卷:高效复习精准押题
- 福建省厦门市一中2025-2026学年高三10月月考语文试题(含答案)(解析版)
- 卫生技术人员继续教育考试题及答案-知识题库
- 水稳培训课件
- 水的资源课件
- 流动广告展示服务创新创业项目商业计划书
- 老年智能家电控制系统创新创业项目商业计划书
- 2022智慧园区设计、建设与验收技术规范
- 自备车补贴申请表
- 注塑成型技术培训之工艺理解课件
- 信息论与编码(第4版)完整全套课件
- 广西佑太药业有限责任公司医药中间体项目环评报告书
- 汽修厂安全风险分级管控清单
- 海绵城市公园改造施工组织设计
- 上体自编教材-体育运动概论-模拟
- 05625《心理治疗》案例分析
- GB/T 2679.7-2005纸板戳穿强度的测定
- GB/T 25840-2010规定电气设备部件(特别是接线端子)允许温升的导则
评论
0/150
提交评论