第10章指针
更新时间:2024-04-12 06:40:01 阅读量: 综合文库 文档下载
第10章指针
【10.1】输入三个整数,按由小到大的顺序输出。解: main()
{ int a,b,c,*p1,*p2,*p3,t; scanf(\,&a,&b,&c); p1=&a;p2=&b;p3=&c; if(*p1>*p2)
{t=p1;p1=p2;p2=t;} if(*p1>*p3)
{t=p1;p1=p3;p3=t;} if(*p2>*p3)
{t=p2;p2=p3;p3=t;}
printf(\,*p1,*p2,*p3); } 或 main()
{int a,b,c,*p1,*p2,*p3,t; scanf(\,&a,&b,&c); p1=&a;p2=&b;p3=&c; if(a>b)
{t=*p1;*p1=*p2;*p2=t;} if(a>c)
{t=*p1;*p1=*p3;*p3=t;} if(b>c)
{t=*p2;*p2=*p3;*p3=t;}
printf(\,a,b,c); }
【10.2】输入三个字符串,按由小到大的顺序输出 解:
#define N 3 #define M 20 main()
{char str0[N][M],str1[M],*p,*q; int i,l,m,n; q=str0;
for(;p l=strcmp(q,q+1); if(l>0) {strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);} m=strcmp(q,q+2); if(m>0) {strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);} n=strcmp(q+1,q+2); if(n>0) {strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);} for(p=q;p 【10.3】输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;①输入10个数;②进行处理;③输出10个数。 解: f(x,n) int x[],n; {int *p0,*p1,i,j,t,y; i=j=x[0];p0=p1=x; for(y=0;y {i=x[y];p0=&x[y];} else if(x[y] t=*p0;*p0=x[n-1];x[n-1]=t; t=*p1;*p1=x[0];x[0]=t; return; } main() {int a[10],u,*r; for(u=0;u<10;u++) scanf(\,&a[u]); f(a,10); for(u=0,r=a;u<10;u++,r++) printf(\,a[u]); printf(\); } 【10.4】有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。 解: #define N 10 void shift(p,x) float *p;int x; {float a[N],*q,*o;int i; o=a;q=p; for(i=0;i for(i=0;i {float shuzhu[N],*u,*v; int h,i;u=v=shuzhu; scanf(\,&h); for(;u for(u=v;u 【10.5】有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 解: #define N 5 main() {int i,j,k,a[N+1],*p; for(i=0,p=a;p<=a+N;i++,p++) *p=i; p=a+1;k=N; for(i=0,j=1;k!=1;j++) {if(p>(a+N)) p=a+1; if(*p!=0) i++; if((i-3)==0) {*p=0;i=0;k--;} p++; } for(i=1;i<=N;i++) if(a[i]!=0) printf(\,a[i]);} 【10.6】写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。 解: main() {int len; char *str[20]; scanf(\,str); len=length(str); printf(\,len); } length(p) char *p; {int n=0; while(*p!='\\0') {n++;p++;} return(n); } 【10.7】有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 解: #include\ #define N 10 main() {char a[N+1],b[N+1],*p,*q; int m; gets(a); scanf(\,&m); p=a+m;q=b; strcpy(q,p); puts(q); } 【10.8】输入一行文字,找出其中大写字母、小写字母、空格、数字以及其它字符各有多少? 解: #include\ main() {int cle=0,sle=0,di=0,wsp=0,ot=0,i; char *p,s[20]; for(i=0;i<20;i++)s[i]=0; i=0; while((s[i]=getchar())!='\\n')i++; p=s; while(*p!='\\n') {if(*p>='a'&&*p<='z') ++sle; else if(*p>='A'&&*p<='Z') ++cle; else if(*p==' ') ++wsp; else if(*p>='0'&&*p<='9') ++di; else ++ot; p++; } printf(\,sle,cle,wsp,di,ot);} 【10.9】写一函数,将一个3×3的矩阵转置。 解: main() {int a[3][3],*p,i; for(i=0;i<3;i++) scanf(\,a[i][0],a[i][1],a[i][2]); p=a; move(p); for(i=0;i<3;i++) printf(\,a[i][0],a[i][1],a[i][2]); } move(pointer) int *pointer; {int i,j,t; for(i=0;i<2;i++) for(j=i+1;j<3;j++) {t=*(pointer+3*i+j); *(pointer+3*i+j)=*(pointer+3*j+i); *(pointer+3*j+i)=t; } } 【10.10】将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。 解: main() {int a[5][5],*p,i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf(\,&a[i][j]); p=a; change(p); for(i=0;i<5;i++) {printf(\); for(j=0;j<5;j++) printf(\,a[i][j]); } } change(p) int *p; {int i,j,change; int *pmax,*pmin; pmax=p; pmin=p; for(i=0;i<5;i++) for(j=0;j<5;j++) {if(*pmax<*(p+5*i+j))pmax=p+5*i+j; if(*pmin>*(p+5*i+j))pmin=p+5*i+j; } change=*(p+12); *(p+12)=*pmax; *pmax=change; change=*p; *p=*pmin; *pmin=change; pmin=p+1; for(i=0;i<5;i++) for(j=0;j<5;j++) if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j; change=*(p+4); *(p+4)=*pmin; *pmin=change; pmin=p+1; for(i=0;i<5;i++) for(j=0;j<5;j++) if(((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j; change=*(p+20); *(p+20)=*pmin; *pmin=change; pmin=p+1; for(i=0;i<5;i++) for(j=0;j<5;j++) if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20)) &&(*pmin>*(p+5*i+j)))pmin=p+5*i+j; change=*(p+24); *(p+24)=*pmin; *pmin=change; } 【10.11】在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。 解: main() {int i; char *p,str[10][10]; for(i=0;i<10;i++) scanf(\,str[i]); p=str; sort(p); for(i=0;i<10;i++) printf(\,str[i]); } sort(p) char *p; {int i,j; char s[10],*smax,*smin; for(i=0;i<10;i++) {smax=p+10*i; for(j=i+1;j<10;j++) {smin=p+10*j; if(strcmp(smax,smin)>0) {strcpy(s,smin); strcpy(smin,smax); strcpy(smax,s); } } } } 【10.12】用指针数组处理上一题目,字符串不等长。 解: #define MAX 20 main() {int i; char *pstr[10],str[10][MAX]; for(i=0;i<10;i++) pstr[i]=str[i]; for(i=0;i<10;i++) scanf(\,pstr[i]); sort(pstr); for(i=0;i<10;i++) printf(\,pstr[i]); } sort(pstr) char *pstr[10]; {int i,j; char *p; for(i=0;i<10;i++) {for(j=i+1;j<10;j++) {if(strcmp(*(pstr+i),*(pstr+j))>0) {p=*(pstr+i); *(pstr+i)=*(pstr+j); *(pstr+j)=p; } } } } 【10.13】写一个用矩形法求求积分的通用函数,分别求: Sinx (范围0~1)、Cosx (范围-1~+1)、e^x (范围0~2)的定积分。(说明:sin、cos、exp已在系统数字库函数中,程序开头要用#include #include\ main() {int n=20; float a,b,a1,b1,a2,b2,c,(*p)(),jiff(); scanf(\,&a,&b); scanf(\,&a1,&b1); scanf(\,&a2,&b2); p=sin; c=jiff(a,b,n,p); printf(\,c); p=cos; c=jiff(a1,b1,n,p); printf(\,c); p=exp; c=jiff(a2,b2,n,p); printf(\,c); } float jiff(a,b,n,p) float a,b,(*p)(); int n; {int i; float x,f,h,area; h=(b-a)/n; x=a; area=0; for(i=1;i<=n;i++) {x=x+h; area=area+(*p)(x)*h; } return(area); } 【10.14】将n个数按输入时顺序的逆序排列,用函数实现。解: main() {int i,n,num[20]; char *p; scanf(\,&n); for(i=0;i scanf(\,&num[i]); p=num; sort(p,n); for(i=0;i printf(\,num[i]); } sort(p,m) char *p; int m; {int i; char change,*p1,*p2; for(i=0;i p2=p+(m-1-i); change=*p1; *p1=*p2; *p2=change; } } 【10.15】有一个班4个学生,5门课。①求第一门课的平均分;②找出有2门以上课程不及格的学生,输出他们的学号和全部课程成绩和平均分;③找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求。 解: main() {int i,j,*pnum,num[4]; float score[4][5],aver[4],*psco,*pave; char course[5][10],*pcou; pcou=course[0]; for(i=0;i<5;i++) scanf(\,pcou+10*i); printf(\); for(i=0;i<5;i++) printf(\,pcou+10*i); printf(\); psco=score; pnum=num; for(i=0;i<4;i++) {scanf(\,pnum+i); for(j=0;j<5;j++) scanf(\,psco+5*i+j); } pave=aver; printf(\); avsco(psco,pave); avcour1(pcou,psco); printf(\); fali2(pcou,pnum,psco,pave); printf(\); good(pcou,pnum,psco,pave); } avsco(psco,pave) float *psco,*pave; {int i,j; float sum,average; for(i=0;i<4;i++) {sum=0; for(j=0;j<5;j+) sum+=(*(psco+5*i+j)); average=sum/5; *(pave+i)=average; } } avcour1(pcou,psco) char *pcou; float *psco; {int i; float sum,average1; sum=0; for(i=0;i<4;i++) sum+=(*(psco+5*i)) average1=sum/4; printf(\,pcou,average1);} fali2(pcou,pnum,psco,pave) char *pcou; int *pnum; float *psco,*pave; {int i,j,k,label; printf(\); for(i=0;i<5;i++) printf(\,pcou+10*i); printf(\); for(i=0;i<4;i++) {label=0; for(j=0;j<5;j++) if(*(psco+5*i+j)<60.0)label++; if(label>=2) {printf(\,*(pnum+i)); for(k=0;k<5;k++) printf(\,*(psco+5*i+k)); printf(\,*(pave+i)); } } } good(pcou,pnum,psco,pave) char *pcou; int *pnum; float *psco,*pave; {int i,j,k,label; printf(\); for(i=0;i<5;i++) printf(\,pcou+10*i); printf(\); for(i=0;i<4;i++) {label=0; for(j=0;j<5;j++) if(*(psco+5*i+j)>=85.0)label++; if((label>=5)||(*(pave+i)>=90)) {printf(\,*(pnum+i)); for(k=0;k<5;k++) printf(\,*(psco+5*i+k)); printf(\,*(pave+i)); } } } 【10.16】输入一个字符串,内的数字和非数字字符,如: a123x456ㄩ17960?302tab5876 将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放入a[0],456放入a[1]??。统计共有多少个整数,并输出这些数。 解: #include\ main() {char str[50],*pstr; int i,j,k,m,e10,digit,ndigit,a[10],*pa; gets(str); pstr=str; pa=a; ndigit=0; i=j=0; while(*(pstr+i)!='\\0') {if((*(pstr+i)>='0')&&(*(pstr+i)<='9')) j++; else {if(j>0) {digit=*(pstr+i-1)-48; k=1; while(k for(m=1;m<=k;m++) e10=e10*10; digit+=(*(pstr+i-1-k)-48)*e10; k++; } *pa=digit; ndigit++; pa++; j=0; } } i++; } if(j>0) {digit=*(pstr+i-1)-48; k=1; while(k for(m=1;m<=k;m++) e10=e10*10; digit+=(*(pstr+i-1-k)-48)*e10; k++; } *pa=digit; ndigit++; j=0; } printf(\,ndigit); j=0; pa=a; for(j=0;j 【10.17】写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函散原型为 int strcmp(char *pl,char *p2)) 设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时t返回值为0,若s1≠s2,返回它们二者第一个不同字符的ASCii码差值(如“BOY”与\,第二个字母不同,“O”与“A”之差为79-65=14)。如果sl>s2,则输出正值,如sl char str1[20],str2[20],*p1,*p2; scanf(\,str1); scanf(\,str2); p1=str1; p2=str2; m=strcmp(p1,p2); printf(\,m); } strcmp(p1,p2) char *p1,*p2; {int i=0; while(*(p1+i)==*(p2+i)) if(*(p+i++)=='\\0')return(0); return(*(p1+i)-*(p2+i)); } 【10.18】编一程序.打入月份号.输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组赴理。 解: main() {static char *mname[13]={\,\,\,\, \,\,\,\,\,\,\, \,\}; int n; scanf(\,&n); if((n>=1)&&(n<=12)) printf(\,*(mname+n)); else printf(\); } 【10.19】编写一个函数allot(n),用来在内存区新开辟一个连续的空间(n个字节)a此函数的返回值是一个指针,指向新开辟的连续空间的起始地址。再写一个函数free(p),将地址p开始的各单元释放(不能再被程序使用,除非再度开辟)。 提示;先在内存区定出一片相当大的连续空间(例如1000个字节)。然后开辟与释放都在此空问内进行。假设指针变量p原已指向未用空间的开头,调用alloc(n)后,开辟了n个字节可供程序使用(例如,可以赋值到这些单元中)。现在需要使p的值变成p+n,表示空白未用区从p+n地址开 始.同时要将新开辟区的起始位置(p)作为函数值返回,以表示可以利用从此点开始的单元。如果要新开辟的区太大(n大),超过了预设的空间——1000字符),则alloc(n)函数返回指针NULL,表示开辟失败。 alloc(n)应返回一个指向字符型数据的指针(因为开辟的区问是以字节为单位被利用 的)。 解: /*开辟存区函数与释放存区函数*/ #define NULL 0/*当开辟失败时返回标志*/ #define ALLOCSIZE 1000/*最大开辟存区*/ static char allocbuf [ALLOCSIZE];/*开辟一十最大存区*/ static char *allocp=allocbuf;/*指针指向第一个可用存区的始端*/ char*alloc(n)/*开辟存区函数,开辟存区后返回指针*/ int n; { if(a11ocp+n<=allocbuf+ALLOCSIZE) { allocp+=n; return(allocp-n);/*返回一个指针,它指向存区的开始位置*/ } else return(NULL);/*当存区不够分配时,返回一个空指针*/ } ftee(p)/*释放存区函数*/ char *p; { if(p>=allocbuf&&p 说明:定义一个全局指针变量allocp,它指向指定的存储区中下一个可用的元素。开始时,allocp指向此存储区allocbuf的开头,当调用alloc(n)函数后,allocp指向allocbuf中的第n个元素。如果调用时用以下语句: pt=alloc(n); 则pt的值为刚才所开辟的空间的首地址(allocp-n)。 在调用free函数时,如果写出以下调用语句: free(pt); 则把allocp的值改成pt,即使得allocp指向刚才开辟空间的开头,恢复allocp的原值,这就相当于释放此段空间,使这段空间可以用作其它用途。 【10.20】用指向指针的指针的方法对5个字符串排序并输出。 解: main() {int i; char **p,*pstr[5],str[5][10]; for(i=0;i<5;i++) pstr[i]=str[i]; for(i=0;i<5;i++) scanf(\,pstr[i]); p=pstr; sort(p); for(i=0;i<5;i++) printf(\,pstr[i]); } sort(p) char **P; {int i,j; char *pchange; for(i=0;i<5;i++) {for(j=i+1;j<5;j++) {if(strcmp(*(p+i),*(p+j))>0) {pchange=*(p+i); *(p+i)=*(p+j); *(p+j)=pchange; } } } } 【10.21】用指向指针的指针的方法对”个整数排序并输出。要求将排序单独写成一个函数。5个整数和n在主函数中输入。最后在主函数中输出。 解: main() {int i,n,digit[20],**p,*pstr[20]; scanf(\,&n); for(i=0;i scanf(\,pstr[i]); p=pstr; sort(p,n); for(i=0;i printf(\,*pstr[i]); } sort(p,n) int **p,n; {int i,j,*pchange; for(i=0;i {for(j=i+1;j {pchange=*(p+i); *(p+i)=*(p+j); *(p+j)=pchange; } } } }
正在阅读:
第10章指针04-12
帮扶责任人访谈提纲01-20
卉原中学学习心得 Word 文档05-04
单片机控制的水箱液位检测装置03-09
国际金融复习(修复答案)203-19
如何设计女塑料拖鞋项目可行性研究报告评审方案(2013年发改委立项详细标准及甲级案例范文)09-01
微弱信号检测方法的研究11-05
公务员面试新题型精讲之材料题08-14
14升华和凝华06-10
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 指针
- 《人力资源管理》案例库
- 2011昌平高三二模数学(文科)
- 西南交大题库
- C++第五章 类与对象习题解答
- 国际金融复习资料
- 四川电子科技大学大学生艺术团章程2014年修订版
- 基于执行力的高校绩效管理探析 doc
- 深圳市建设项目交通影响评价技术指引 - 图文
- 香蕉(HS 0803000001)2015-2016菲律宾(1679个)出口商排名 - 图
- 南充市华雅财富国际城临水临电施工方案
- 项目管理学要点(1)
- LUC-40型 液压油防爆精细滤油车使用说明书
- 全国高尔夫球场名单
- 小学生秋季学期第1-20周国旗下讲话稿(新)
- 2017年创新教学工作总结
- 2012-2013下国际经济学练习题
- 2017考研政治马克思主义当代资本主义新变化核心考点
- 2018形式主义官僚主义集中整治工作方案
- MIS(双语)上机实验报告 - 08计算机
- 安徽省泗县双语中学2013届高三5月模拟测试(一)语文试题 Word版