第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;yi)

{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=q;p--) *p=*(p-x);

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**(p+j))

{pchange=*(p+i); *(p+i)=*(p+j); *(p+j)=pchange; } } } }

本文来源:https://www.bwwdw.com/article/mp9p.html

Top