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,按大小顺序输出
- 要求:使用指针方法
- 程序源代码:
- 第一种解:
#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; }
- 第二种解:
#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,数组,最大值与最小值分别对最前和最后进行交换
- 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
- 要求:使用指针进行编写
- 程序源代码:
- 第一种解:
#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; }
- 第二种解:
#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;
- 要求:用指针和数组进行编写
- 程序源代码:
- 第一种解:
#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); } }
- 第二种解:
#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函数中输入字符串,并输出其长度。
- 要求:使用指针和数组来进行编写
- 程序源代码:
- 第一种解:
#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); }
- 第二种解:
#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; }