门户网站app开发/手机搭建网站
特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。
66,输入3个数a,b,c,按大小顺序输出
1.题目:输入3个数a,b,c,按大小顺序输出
2.要求:使用指针方法
3.程序源代码:
- 第一种解:
#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,数组,最大值与最小值分别对最前和最后进行交换
1.题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
2.要求:使用指针进行编写
3.程序源代码:
- 第一种解:
#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,数组,后移
1.题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
例: n = 5; 数组为:1 2 3 4 5;m = 2; 后移为:4 5 1 2 3;
2.要求:用指针和数组进行编写
3.程序源代码:
- 第一种解:
#include <stdio.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define max 30 //这个函数的意义为:随机生成最大的数为30
#define min 10 //这个函数的意义为:随机生成最小的数为10void 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,剩下几号
1.题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
2.要求:使用指针进行编写
3.程序源代码:
#include <stdio.h>
#define nmax 50int 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,求字符串的长度
1.题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
2.要求:使用指针和数组来进行编写
3.程序源代码:
- 第一种解:
#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;
}