龙空技术网

C语言经典100例——66-70

scanf科技 704

前言:

现在朋友们对“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语言按大小顺序输出多个数