当前位置:文档之家› C程序设计第三版第十章题解

C程序设计第三版第十章题解

第十章指针10.1 输入3个整数,按照从小到大的顺序输出#include<stdio.h>void main(){void swap(int *p1, int *p2);int n1,n2,n3;int *p1,*p2,*p3;printf("input three integer:");scanf_s("%d,%d,%d",&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2) swap(p1,p2);if(n1>n3) swap(p1,p3);if(n2>n3) swap(p2,p3);printf("the order: %d,%d,%d\n",n1,n2,n3); }void swap(int *p1, int *p2){int temp;temp=*p1;*p1=*p2;*p2=temp;}NOTE:scanf的参数为地址,printf参数为参数10.2输入三个字符串,按照从小到大的顺序输出#include<stdio.h>#include<string.h>void main(){void swap(char *p1, char *p2);char str1[20],str2[20],str3[20];printf("input three string:");gets_s(str1);gets_s(str2);gets_s(str3);if(strcmp(str1,str2)) swap(str1,str2);if(strcmp(str1,str3)) swap(str1,str3);if(strcmp(str2,str3)) swap(str2,str3);printf("the order: %s,%s,%s\n",str1,str2,str3);}void swap(char *p1, char *p2){char temp[20];strcpy(temp,p1);strcpy(p1,p2);strcpy(p2,temp);}NOTE:gets()用于获取字符串输入。

strcmp() 和strcpy()的应用10.3 输入10个整数,将其中最小的数和第一个数对换,把最大的数和最后一个数对换,写三个函数:①输入十个数;②进行处理;③输出十个数#include<stdio.h>void main(){void input(int *);void output(int *);void proceed(int *);int number[10];input(number);proceed(number);output(number);}void input(int *number){int i;printf("input ten integer:\n");for (i=0;i<10;++i){scanf("%d",&number[i]);}}void proceed(int *number)int i,*min,*max,temp;min=max=&number[0];for (i=0;i<10;++i){if (*min>number[i])min = &number[i];if(*max<number[i])max= &number[i];}temp= number[0];number[0]=*min;*min= temp;temp= number[9];number[9]=*max;*max= temp;}void output(int *number){int i;printf("After Proceeding,these numbers are\n");for (i=0;i<10;++i){printf("%d\n",number[i]);}}NOTE:对于只是改变部分数值,而不是单单取出某个数值,必须要利用指针,获取对应的地址,在将地址对于的数据进行交换操作,交换一般用temp保存中间数据10.4 有n个整数,使前面各数顺序向后移m个位置,最后m个数字变成最前面的m个数字。

写一个函数实现此功能,在主函数中输入n个数字和输出调整后的n个数字#include<stdio.h>void main(){void move(int *number,int n,int m);int n,m,number[20];printf("input the total number(n<=20):êo");scanf("%d",&n);printf("input these %d numbers\n",n);for(int i=0;i<n;++i)scanf("%d",&number[i]);printf("input the number you want to move backward:");scanf("%d",&m);if (m>n)printf("m must <=n,input a new m:");scanf("%d",&m);}move(number,n,m);printf("After moving,these numbers are:");for (int i=0;i<n;++i)printf("%d ",number[i]);}void move(int *number,int n,int m){int *p,number_end;number_end = *(number+n-1);for (p=number+n-1;p>number;p--)*p=*(p-1);*number=number_end;m--;if(m>0) move(number,n,m);} //后移m位函数10.5有n个人围成一圈,顺序排号。

第一个人开始报数(从1到3报数),凡报道3的人退出圈子,问最后留下来的是原来的几号。

算法思路:先给n个数字标上号,当一个编号报数到3,则将其置零,不断报数,同时用一个数字记录推出人数,当退出人数m<n-1时候,则置零完成,在遍历,找到没有置零的那个,输出即可#include<stdio.h>void main(){int n,number[50],*p;printf("how many students? ");scanf_s("%d",&n);p=number;for (int i=0;i<n;++i)*(p+i)=i+1;int i=0;int baoshu=0;int number_quit=0;while (number_quit<n-1)if(*(p+i)!=0) baoshu++;if(baoshu==3){*(p+i)=0;baoshu=0;number_quit++;}i++;if(i==n) i=0;}while(*p==0) p++;printf("the last number left in the circle is:%d",*p);}10.6写一个函数,求一个字符串的长度,在main中输入字符串,并输出长度#include<stdio.h>void main(){void strlength(char *);char str[50];printf("input the string\n");scanf_s("%s",str);strlength(str);}void strlength(char *str){int count=0;char *p;p=str;while(*p != '\0'){count++;p++;}printf("%d",count);}10.7有一字符串,包含n个字符,写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串#include<stdio.h>void main(){void strcopy_from_m(char *str,int m);char str[50];int m;printf("input the string\n");gets_s(str);printf("input the number m:\n");scanf_s("%d",&m);strcopy_from_m(str,m);}void strcopy_from_m(char *str,int m){char *p,second_str[50];p=str+m-1;int i=0;while(*p != '\0'){second_str[i]=*p;p++;i++;}second_str[i]='\0';printf("%s",second_str);}10.8输入一行文字,找出其中大写字母,小写字母,空格,数字以及其他字符各有多少?#include<stdio.h>void main(){intA_count=0,a_count=0,space_count=0,number_count=0,other_count=0 ,i=0;char str[50];char *p;printf("input a string: ");//scanf("%s",str);while((str[i]=getchar())!='\n') i++;p=str;while (*p != '\n'){if(*p>='A'&&*p<='Z') ++A_count;else if(*p>='a'&&*p<='z') ++a_count;else if(*p==' ') ++space_count;else if(*p>='0'&&*p<='9') ++number_count;else ++other_count;p++;}printf("大䨮写¡ä字Á?母?%d 小?写¡ä字Á?母?%d 空?格?%d 数ºy字Á?%d 其?他?字Á?符¤?%d",A_count,a_count,space_count,number_count,other_count);}10.9写一个函数,将一个3*3整形矩阵转置#include<stdio.h>void main(){void transfer(int *p);void printfmetric(int *p);int init[3][3]={{1,2,3},{4,5,6},{7,8,9}};int *p;p=&init[0][0];printfmetric(p);transfer(p);printfmetric(p);}void printfmetric(int *p){for (int i=0;i<3;i++)printf("%d %d %d\n",*(p+3*i),*(p+3*i+1),*(p+3*i+2));}void transfer(int *p){int i,j,temp;for (i=0;i<3;i++)for(j=i;j<3;j++)//note:j==i,j!=0{temp=*(p+3*i+j);*(p+3*i+j)=*(p+3*j+i);*(p+3*j+i)=temp;}}10.10讲一个5*5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放,写一个函数实现之。

相关主题