C语言必会100题(14)。输入3个数a,b,c,按大小顺序输出/数组,最大值与最小值分别对最前和最后进行交换/数组,后移/n个人报数,去掉3,剩下几号/求字符串的长度

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

66,输入3个数a,b,c,按大小顺序输出

  • 题目:输入3个数a,b,c,按大小顺序输出
  • 要求:使用指针方法
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    
    int main(void)
    {
        int a, b, c;
        int *p1, *p2, *p3;
        int max;
        p1 = &a, p2 = &b, p3 = &c;
    
        printf("请输入三个数,我们将会按大小顺序输出!\n");
        scanf("%d %d %d", p1, p2, p3);
    
    
        if (*p1 < *p2) {
    
            max = *p2;
            *p2 = *p1;
            *p1 = max;
        }
        if (*p1 < *p3) {
    
            max = *p3;
            *p3 = *p1;
            *p1 = max;
        }
        if (*p2 < *p3) {
    
            max = *p3;
            *p3 = *p2;
            *p2 = max;
        }
    
        printf("%d %d %d\n", *p1, *p2, *p3);
    
        return 0;
    }
  2. 第二种解:
    #include <stdio.h>
    
    void swap(int *p, int *q);
    
    int main(void)
    {
        int a, b, c;
        int *p1, *p2, *p3;
        p1 = &a; p2 = &b; p3 = &c;
    
        printf("请输入三个数,我们将会按大小顺序输出!\n");
        scanf("%d %d %d", p1, p2, p3);
    
    
        if (*p1 < *p2) {
    
            swap(p1, p2);
        }
        if (*p1 < *p3) {
    
            swap(p1, p3);
        }
        if (*p2 < *p3) {
    
            swap(p2, p3);
        }
    
        printf("%d %d %d\n", *p1, *p2, *p3);
    
        return 0;
    }
    
    void swap(int *p, int *q)
    {
        int max;
    
        max = *q;
        *q = *p;
        *p = max;
    }

67,数组,最大值与最小值分别对最前和最后进行交换

  • 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
  • 要求:使用指针进行编写
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int a[10];
        int count = 0;
        int n;
        int i = 0;
        int max, num1;
        int temp;
        int min, num2;
    
        printf("请输入一个小于十位数的数组:\n");
    
        while ( (n = getchar()) != '\n' ) {
    
            if (n == ' ') {
    
            } else {
    
                a[count] = n;
                count++;
            }
    
        }
        printf("您一共输入了%d个数字\n", count);
    
        // 输出数组
        printf("\n");
        printf("您输入的数组为:\n");
        for (i = 0; i < count; i++) {
    
            putchar(a[i]);
            printf(" ");
        }
        printf("\n");
    
        // 找出用户输入数组的最大值
        max = a[0];
        for (i = 1; i < count; i++) {
    
            if (max > a[i]) {
    
            } else {
    
                max = a[i];
                num1 = i;
            }
        }
    
        // 将数组中最大的数字与第一个数字进行交换
        temp = a[num1];
        a[num1] = a[0];
        a[0] = temp;
    
        // 输出数组
        printf("\n");
        printf("将数组中最大的数字与第一个数字进行交换:\n");
        for (i = 0; i < count; i++) {
    
            putchar(a[i]);
            printf(" ");
        }
        printf("\n");
    
        // 找出用户输入数组的最小值
        min = a[0];
        for (i = 1; i < count; i++) {
    
            if (min < a[i]) {
    
            } else {
    
                min = a[i];
                num2 = i;
            }
        }
    
        // 将数组中最小的数字与最后的数字进行交换
        temp = a[num2];
        a[num2] = a[count -1];
        a[count -1] = temp;
    
        // 输出数组
        printf("\n");
        printf("将数组中最小的数字与最后的数字进行交换:\n");
        for (i = 0; i < count; i++) {
    
            putchar(a[i]);
            printf(" ");
        }
    
        return 0;
    }
  2. 第二种解:
    #include <stdio.h>
    
    // 用户输入是个数字的数组
    void input(int number[10]);
    // 交换顺序
    void max_min(int number[10]);
    // 输出交换后的数组
    void output(int number[10]);
    
    int main()
    {
        int number[10];
    
        input(number);
        max_min(number);
        output(number);
    }
    
    // 用户输入是个数字的数组
    void input(int number[10])
    {
        int i;
    
        for(i = 0; i < 9; i++) {
    
            scanf("%d", &number[i]);
        }
        scanf("%d", &number[9]);
    }
    
    // 交换顺序
    void max_min(int array[10])
    {
        int *max, *min, k, l;
        int *p, *arr_end;
        arr_end = array + 10;
        max = min = array;
    
        // 找出最大值与最小值
        for(p = array + 1; p < arr_end; p++) {
    
            if(*p > *max) {
    
                max = p;
            } else if(*p < *min) {
    
                min = p;
            }
        }
        
        // 交换顺序
        k = *max;
        l = *min;
        *p = array[0]; array[0] = k; *max = *p;
        *p = array[9]; array[9] = l; *min = *p;
    }
    
    // 输出交换后的数组
    void output(int array[10])
    {
        int *p;
    
        for(p = array; p < array + 9; p++) {
    
           printf("%d,", *p);
        }
        printf("%d\n",array[9]);
    }

68,数组,后移

  • 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
     例:	n = 5; 数组为:1 2 3 4 5;
     	m = 2; 后移为:4 5 1 2 3;
  • 要求:用指针和数组进行编写
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #define max 30   //这个函数的意义为:随机生成最大的数为30
    #define min 10    //这个函数的意义为:随机生成最小的数为10
    
    void move(int array[10], int n,int m);
    
    int main(void)
    {
        int m, n, num;
        int i;
    
        printf("请输入一个整数,我们将会随机生成一个数组,大小为这个整数");
        printf("这个数组的最大值为30,最小值为10\n");
        printf("请输入这个整数:\n");
        scanf("%d", &n);
        int array[n];
    
        srand(time(0)); // 给这个随机算法一个启动的种子
        for (i = 0; i < n; i++) {
    
            num = rand() % (max - min) + min;  // 这里的意义,“%”为模运算
            array[i] = num;
        }
        printf("\n");
        printf("已随机生成%d个数字,他们分别是:\n", n);
        for (i = 0; i < n; i++) {
    
            printf("%d ", array[i]);
        }
    
        printf("\n\n");
        printf("请输入一个小于%d的数字,我们将会对这个数组进行移位:\n", n);
        scanf("%d", &m);
    
        move(array, n, m);
        printf("\n");
        printf("进行移位后的数组为:\n");
        for (i = 0; i < n; i++) {
    
            printf("%d ", array[i]);
        }
    
        printf("\n");
        system("pause");  //这个代码可以让弹出的黑框不会一下就消失
        return 0;
    }
    
    void move(int array[10], int n,int m)
    {
        int *p, array_end;
    
        array_end = *(array + n - 1);
        for(p = array + n - 1; p > array; p--) {
    
            *p = *(p-1);
        }
        *array = array_end;
        m--;
    
        if(m>0) {
    
            move(array,n,m);
        }
    }
  2. 第二种解:
    #include <stdio.h>
    
    void move (int array[20], int n, int m);
    
    int main()
    {
        int number[20], n, m, i;
    
        printf("the total numbers is:");
        scanf("%d", &n);
        printf("back m:");
        scanf("%d", &m);
    
        for (i = 0; i < n - 1; i++) {
    
             scanf("%d,", &number[i]);
        }
        scanf("%d", &number[n - 1]);
    
        move(number, n, m);
    
        for (i = 0; i < n - 1; i++) {
    
            printf("%d,", number[i]);
        }
        printf("%d", number[n - 1]);
    
        return 0;
    }
    
    void move (int array[20], int n, int m)
    {
        int *p, array_end;
        array_end = *(array + n - 1);
        
        for(p = array + n - 1; p > array; p--) {
            
            *p = *(p-1);
        }
        *array = array_end;
        m--;
        
        if(m>0) {
            
            move(array,n,m);
        }
    }

69,n个人报数,去掉3,剩下几号

  • 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
  • 要求:使用指针进行编写
  • 程序源代码:
    #include <stdio.h>
    #define nmax 50
    
    int main()
    {
        int i, k, m, n, num[nmax], *p;
    
        printf("please input the total of numbers:");
        scanf("%d", &n);
    
        // 指针p指向数组
        p = num;
    
        // 对数组num从1到n进行赋值
        for(i = 0; i < n; i++) {
    
            *(p + i) = i + 1;
        }
    
        i = 0;
        k = 0;
        m = 0;
    
        while(m < n - 1) {
    
            if(*(p + i) != 0) {
    
                k++;
            }
    
            if(k == 3) {
    
                *(p + i) = 0;
                k = 0;
                m++;
            }
    
            i++;
            if(i == n) {
    
                i = 0;
            }
        }
    
        while(*p == 0)  {
    
            p++;
        }
        
        printf("%d is left\n", *p);
        
        return 0;
    }

70,求字符串的长度

  • 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
  • 要求:使用指针和数组来进行编写
  • 程序源代码:
  1. 第一种解:
    #include <stdio.h>
    
    void print();
    
    int main(void)
    {
        printf("请输入一个字符串,我们将会输出其长度\n");
    
        print();
    
        return 0;
    }
    
    void print()
    {
        int n;
        int count = 0;;
    
        while ( (n = getchar()) != '\n' ) {
    
            count++;
        }
    
        printf("长度为:%d\n", count);
    
    }
  2. 第二种解:
    #include <stdio.h>
    
    int length(char *p);
    
    int main()
    {
        int len;
    
        char str[20];
    
        printf("please input a string:\n");
        scanf("%s", str);
    
        len = length(str);
        printf("the string has %d characters.", len);
    }
    
    int length(char *p)
    {
        int n = 0;
    
        while(*p != '\0')
        {
            n++;
            p++;
        }
    
        return n;
    }
posted @ 2022-03-20 21:20  炸天帮帮主  阅读(376)  评论(0编辑  收藏  举报