蓝桥杯——指针问题典例二(2017.3.2)

来源:互联网 发布:unity3d 5 动画系统 编辑:程序博客网 时间:2024/06/10 19:38

1. 通过函数实现3*3矩阵转置

源代码:

#include <stdio.h>void move(int *a){int i,j;int t;for(i=1;i<3;i++){for(j=0;j<i;j++){t=*(a+3*i+j);*(a+3*i+j)=*(a+3*j+i);*(a+3*j+i)=t;}}}int main(){int i,j;int a[3][3],*p;while(scanf("%d %d %d",&a[0][0],&a[0][1],&a[0][2])!=EOF){for(i=1;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);p=&a[0][0];                                            //使p指针指向矩阵的第一个元素 move(p);for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%d ",a[i][j]);printf("%d\n",a[i][2]);}}return 0;} 
程序截图:


2. 将一个5*5矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右从上到下依次从小到大存放),写一函数实现之。

源代码:

#include <stdio.h>void swap(int *a,int *b){int t;t=*a;*a=*b;*b=t;} void fun(int *p,int n){int i,j,t;int *pmax=p,*pmin=p;for(i=0;i<n;i++)               //找最大值和最小值的地址,并分别赋给pmax和pmin {for(j=0;j<n;j++){if(*(p+n*i+j)>*pmax)pmax=p+n*i+j;if(*(p+n*i+j)<*pmin)pmin=p+n*i+j;}}swap(pmax,p+n*n/2);            //将最大值换给中心元素swap(pmin,p);                  //将最小值换给左上角元素 pmin=p+1;for(i=0;i<n;i++)               //找第二最小值的地址赋给pmin {for(j=0;j<n;j++){if((*(p+n*i+j)<*pmin) && ((p+5*i+j)!=p))pmin=p+n*i+j;}}swap(pmin,p+n-1);              //将第二最小值换给右上角元素 pmin=p+1;for(i=0;i<n;i++)               //找第三最小值的地址赋给pmin {for(j=0;j<n;j++){if((*(p+n*i+j)<*pmin) && ((p+5*i+j)!=p) && ((p+5*i+j)!=(p+n-1)))pmin=p+n*i+j;}}swap(pmin,p+n*n-n);            //将第三最小值换给左下角元素pmin=p+1;for(i=0;i<n;i++)               //找第四最小值的地址赋给pmin {for(j=0;j<n;j++){if((*(p+n*i+j)<*pmin) && ((p+5*i+j)!=p) && ((p+5*i+j)!=(p+n-1)) && (p+5*i+j)!=(p+n*n-n))pmin=p+n*i+j;}}swap(pmin,p+n*n-1);            //将第四最小值换给右下角元素 }int main(){int i,j;int *p,a[5][5];while(scanf("%d",&a[0][0])!=EOF){for(j=1;j<5;j++)scanf("%d",&a[0][j]);for(i=1;i<5;i++)for(j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];                           //使p指向0行0列元素 fun(p,5);for(i=0;i<5;i++){for(j=0;j<4;j++)printf("%d ",a[i][j]);printf("%d\n",a[i][4]);}}return 0;} 
程序截图:


3. 写一函数,实现两个字符串的比较。若两个字符串相同则返回0,否则返回第一个字符串与第二个字符串第一个字符的ASCII码的差值。

源代码:

#include <stdio.h>#include <string.h>#define maxlen 105int strcmp(char *p1,char *p2){int i=0,j=0;int sub=0;while(*(p1+i)!='\0' || *(p2+j)!='\0'){if(*(p1+i)!=*(p2+j)){sub=*(p1+i)-*(p2+j);break;}i++,j++;}return sub;}int main(){char str1[maxlen]={'\0'},str2[maxlen]={'\0'};while(gets(str1)!=NULL){gets(str2);printf("%d\n",strcmp(str1,str2));memset(str1,'\0',sizeof(str1));memset(str2,'\0',sizeof(str2));}return 0;}
程序截图:


4. 编一程序,输入月份号,输出该月的英文月名,用指针数组实现。

源代码:

#include <stdio.h>int main(){int n;char *p;char *month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};while(scanf("%d",&n)!=EOF){p=*(month+n-1);                 //让指针p指向指针数组的第n-1个元素 printf("%s\n",p);}return 0;}

另解:使用指向指针的指针

#include <stdio.h>int main(){int n;char **p;char *month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};while(scanf("%d",&n)!=EOF){p=month+n-1;                 //让指针p指向指针数组的第n-1个元素 printf("%s\n",*p);           //"取出"指针数组的元素值,即第n-1个元素对应的字符串 }return 0;}

程序截图:


5. 输入一个字符串,内有数字和非数字字符,例如:

        A123x456 17960? 302tab5876

        将其中连续的数字作为一个整数,依次存放到一数组a中。例如123放在a[0],456放在a[1]……统计共有多少个整数,并输出之。

源代码:特别注意下标的移动是如何进行的

#include <stdio.h>#include <string.h>#include <math.h>#define maxn 1010#define maxlen 1010void Getnum(char *str,int *a){int i=0,j,k;int wei,l,m=0;int startloc=0,endloc=0;                          //记录数字起始与结束位置 char obj[maxlen];while(*(str+i)!='\0'){if(*(str+i)>='0' && *(str+i)<='9')            //当前字符是数字字符,startloc与endloc同时指向该字符 {startloc=i,endloc=i;for(j=i+1;j<strlen(str);j++)              //然后从当前字符后面的字符开始继续判断 {if(!(*(str+j)>='0' && *(str+j)<='9')) //发现非数字字符,跳出循环;否则判断后面的字符 break;}endloc=j-1;                               //endloc记录发现的第一个非数字字符前的字符的位置 l=0;for(k=startloc;k<=endloc;k++)             //保存发现的一串数字的每一位*(obj+l++)=*(str+k);*(obj+l)='\0';wei=endloc-startloc+1;                    //wei记录数字位数 for(k=0;k<l;k++)                          //将字符串转换为整数并存入数组a {*(a+m)+=( (*(obj+k)-'0')*pow(10,wei-1) );wei--;}m++;                                      //每存完一个整数m+1,然后继续从endloc指向的字符后面的字符开始判断 i=endloc+1;}else                                          //当前字符是非数字字符,继续判断后面的字符 i++;}for(k=0;k<m;k++)                                  //将所有整数及整数个数输出 printf("%d ",*(a+k));printf("count=%d\n",m);}int main(){char str[maxlen];int a[maxn];while(gets(str)!=NULL){memset(a,0,sizeof(a));Getnum(str,a);}return 0;}

程序截图:


6. 写一个矩形法求定积分的通用函数,输入积分上下限,分别求sin(x) cos(x) e^x的定积分。

源代码:

#include <stdio.h>#include <math.h>double fsin(double x)                               //计算sin(x)的函数 {return sin(x);}double fcos(double x)                               //计算cos(x)的函数 {return cos(x);}double fexp(double x)                               //计算exp(x)的函数 {return exp(x);}double integral(double a,double b,double (*p)(double),double n)  //用函数与x轴围成的封闭区域作为积分结果,将区域分成n个小矩形,相加求得最终结果 {int i;double x,h,sum;h=(b-a)/n;x=a;sum=0;for(i=1;i<=n;i++){x+=h;sum+=((*p)(x)*h);}return sum;}int main(){int n=20;double a1,b1,a2,b2,a3,b3,c;double (*p)(double);                            //函数指针 while(scanf("%lf %lf",&a1,&b1)!=EOF)            //求sin(x)定积分的上限与下限 {scanf("%lf %lf",&a2,&b2);                   //求cos(x)定积分的上限与下限 scanf("%lf %lf",&a3,&b3);                   //求e^x定积分的上限与下限 p=fsin;                                     //使p指向fsin函数,求出sin(x)的定积分 c=integral(a1,b1,p,n);printf("The integral of sin(x) is %.2lf\n",c);p=fcos;                                     //使p指向fcos函数,求出cos(x)的定积分 c=integral(a2,b2,p,n);printf("The integral of cos(x) is %.2lf\n",c);p=fexp;                                     //使p指向fexp函数,求出e^x的定积分 c=integral(a3,b3,p,n);printf("The integral of exp(x) is %.2lf\n",c);}return 0;}

程序截图:


0 0