专业的编程技术博客社区

网站首页 > 博客文章 正文

C语言经典100例——66-70(c语言经典一百例)

baijin 2024-08-13 00:53:24 博客文章 6 ℃ 0 评论

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

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

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

一直流浪: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 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库来使用

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表