蓝桥杯——指针问题典例二(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
- 蓝桥杯——指针问题典例二(2017.3.2)
- 蓝桥杯——指针问题典例一(2017.2.28)
- 文件指针问题(2)
- 指针类型问题??(指针指向问题)
- C++指针——(2)指针的进阶知识
- LOB(2) — 指针
- 简单问题6——指针
- 指针(一)——指针与二级指针
- 指针(一)C语言指针问题
- Exe7 删除字符串中指定的字符 (还有有问题——指针的问题)
- 初学J2ME遇到的问题——空指针问题
- 一个函数重载问题—指针和整数问题
- 指针总结(—)
- C语言深度剖析之—指针与内存地址(函数指针,普通指针,指针数组,数组的指针,指针的指针)
- C语言深度剖析之—指针与内存地址(函数指针,普通指针,指针数组,数组的指针,指针的指针)
- C语言深度剖析之—指针与内存地址(函数指针,普通指针,指针数组,数组的指针,指针的指针)
- 【指针】16周问题2
- 数组排序问题(指针)
- Log4j2在项目中的应用
- java安全架构____AES加密原理
- Android应用启动的流程
- POJ 3169 Layout
- Greenplum Database 大数据处理学习
- 蓝桥杯——指针问题典例二(2017.3.2)
- 九度OJ-1003:A+B
- 分布式服务框架学习笔记5 消息队列
- Android Studio 的初始设置
- 引入Activiti配置文件activiti.cfg.xml
- 博览网C++课程 第六周
- cdoj 1061 秋实大哥与战争 线段树,合并区间,单点更新,单点查询区间长度
- 利用 ELK 处理 Percona 审计日志
- 136. Single Number(C++)