前言:
现在朋友们对“c语言程序设计50例”可能比较关心,同学们都需要学习一些“c语言程序设计50例”的相关文章。那么小编在网上收集了一些关于“c语言程序设计50例””的相关文章,希望各位老铁们能喜欢,小伙伴们一起来了解一下吧!下面部分地方使用指针,也有地方不使用指针。
(或许这里我都应该使用指针来让大家理解一下,但是一些时候指针不是必需品,当然,如果你要向硬件方面发展,那还是得学习指针的)
要学习指针可以看一下这里:(其他资料请自行检索)
一直流浪:C语言重点——指针篇(一篇让你完全搞懂指针)4693 赞同 · 205 评论文章
题目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 3int 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库来使用
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #c语言程序设计50例 #c语言函数经典题目 #约瑟夫问题c语言详解 #c语言输出顺序表中的所有元素 #c语言按大小顺序输出多个数