下面部分地方使用指针,也有地方不使用指针。

(或许这里我都应该使用指针来让大家理解一下,但是一些时候指针不是必需品,当然,如果你要向硬件方面发展,那还是得学习指针的)

要学习指针可以看一下这里:(其他资料请自行检索)

一直流浪:C语言重点——指针篇(一篇让你完全搞懂指针)4693 赞同 · 205 评论文章

c语言编程题经典1000例(C语言经典100例66-70)(1)

题目66

题目:输入3个数a,b,c,按大小顺序输出。

程序分析:用指针实现

#include<cstdio> void sswap(int *p1,int *p2) { //*有取值的作用 int p = *p1; *p1 = *p2; *p2 = p; } int main() { int x,y,z; int *p1,*p2,*p3; scanf("%d%d%d",&x,&y,&z); p1 = &x;// 指针指向地址 p2 = &y; p3 = &z; //不运行看看这里是按什么顺序输出 if(x > y) sswap(p1,p2); if(x > z) sswap(p1,p3); if(y > z) sswap(p2,p3); printf("%d %d %d",x,y,z); }

题目67

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

这里给出两种实现方式,指针和非指针:

非指针方式:

#include<cstdio> #define R register // 本人不太喜欢使用指针,指针部分代码后给出。 int a[11]; // 不加&还有什么解决办法? // 这里函数的作用是寻找数组中最大、最小的两个数的位置 void max_min_num_pos(int &pos_max,int &pos_min) //可以想想要是想传入数组a怎么办 { //这个函数达成的目的是返回最大数的位置与最小数的位置 //这里默认知道数组长度 //其实在OI中一般是已知的( int maxx = -1;//找最大的要设置小的,为什么? int minn = 2147483641;//对应 for(R int i = 1;i <= 10;i ) { if(a[i] > maxx) maxx = a[i],pos_max = i; if(a[i] < minn) minn = a[i],pos_min = i; } } void sswap(int &x,int &y) { int t = x; x = y; y = t; } int main() { for(R int i = 1;i <= 10;i ) scanf("%d",&a[i]); int pos_max, pos_min; max_min_num_pos(pos_max,pos_min); // printf("%d %d",pos_max,pos_min); sswap(a[1],a[pos_max]); sswap(a[10],a[pos_min]); for(R int i = 1;i <= 10;i ) printf("%d ",a[i]); } // in:20 4 3 9 1 33 2 6 0 3 // out:


指针方式

#include<cstdio> #define R register //这里代码不打算过分解释,应该都能看懂 // 不理解的地方大家可以查阅一下资料,深入探讨一下 int num[11]; void input(int *a) { for(R int i = 1;i <= 10;i ) scanf("%d",&a[i]); } void max_min(int *a) { int *max,*min; int *p,*a_end; a_end = a 10;//为啥加10? max = min = a 2; for(p = a 2; p <= a_end;p ) { if(*p > *max) max = p; if(*p < *min) min = p; } // 这里的p有什么作用,与上面一样吗 *p = a[1]; a[1] = *max; *max = *p; *p = a[10];a[10] = *min; *min = *p; } void print(int *a) { int *p; for(p = a 1 ; p <= a 10;p ) printf("%d ",*p); // a 1等价于 a[1]吗? //自己动手试一试,这里不是很难看出来 } //in:20 4 3 9 1 33 2 6 0 3 int main() { // 三个函数的形式会让主函数显得很简洁 input(num); max_min(num); print(num); }

题目68

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

#include<cstdio> #define R register // 看看是否能自己看懂 int n,m;//n代表数组长度,m代表位置( int a[15]; void do_work(int *a,int len,int mm) { int idx = len - mm; for(R int i = 1;i <= mm;i ) { int *p = a idx i; int tmp = *p; for(R int j = idx i; j > i ;j--) { *p = *(p-1); p--; } *(a i) = tmp; } } int main() { scanf("%d%d",&n,&m); for(R int i = 1;i <= n;i ) scanf("%d",&a[i]); do_work(a,n,m); for(R int i = 1;i <= n;i ) printf("%d ",a[i]); }

题目69

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

#include<cstdio> int n,left,pos = 0,num,m; int in[111]; // 这里实际上是约瑟夫环问题,直接拿来用了 /* n 个人围成一圈,从第一个人开始报数,数到 m 的人出列, 再由下一个人重新从 1 开始报数,数到 m 的人再出圈, 依次类推,直到所有的人都出圈,请输出依次出圈人的编号。*/ int main() { scanf("%d%d",&n,&m); // n个人报数,报到m的出圈 left = n;//留在里面的最开始有n个 //在圈里是 0,不在圈里是1 while(1) { pos = pos % n 1; //环 while(in[pos]) pos = pos % n 1; num ; if(num % m == 0) { in[pos] = 1,left--;//出圈 printf("%d ",pos); } if(left == 1)break; } for(int i = 1;i <= n;i ) if(!in[i]){ printf("%d",i); break; } } // 其实可以数学推导出最后一个出圈的人是序号几,可查一下资料 // 有时间可能补充一下推导

题目70

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

#include<cstdio> #include<cstring> #define R register // 其实有现成的计算字符串长度的函数strlen(),调用cstring char s[20]; int len(char *s) { int cnt = 0; for(R int i = 0;;i ) { if(s[i] == '\0')break; cnt ; } return cnt; } int main() { scanf("%s",s);//用%s输入,注意这样子的写法从s[0]存储 printf("%d\n",len(s)); // printf("%d\n",strlen(s)); }


其实上面swap也有现成的函数,可以调用iostream库来使用

,