> 文档中心 > 【C语言】 题集 of ⑨

【C语言】 题集 of ⑨


 🚩write in front🚩


🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金⇿InfoQ创作者~周榜34»总榜1892🏅
🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知
📝个人主页⇥打打酱油desuCSDN博客💬
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏⇥【C】题目_謓泽的博客-CSDN博客[〇~①]🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩 

『C~题集』of

 🚩write in front🚩

🌸第四十一题→数字每一位之和『递归』🌸

🌸第四十二题→冒泡排序🌸

🌸第四十三题→学习小组🌸  

🌸第四十四题→正整数的相乘🌸

🌸第四十五题→数组元素交换🌸

🍀第四十一题の代码🍀

🍀第四十二题の代码🍀

🍀第四十三题の代码🍀

🍀第四十四题の代码🍀

🍀第四十五题の代码🍀

🌸第四十一题→数字每一位之和『递归』🌸

输入一个无符号数字,无非就是用输入函数scanf()进行输入,但是要注意下这是无符号输入那么我们就要在数据类型前面加上unsigned(无符号类型)才可以。

计算数字每一位之和,就是假设我们输入的数字是19,那么就是相当于9+1=10,这样。

用递归进行实现,在前面的题已经都说过了,那么再来说下。

概述:一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。

那么递归它也是具有限制条件的,不然它就会造成死递归,这个就相当于死循环一样。

存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。
每次递归调用之后都会越来越接近这个限制条件。

当然,这道题目不用递归也是非常好解决的,关键点就两行代码如下↓

sum += n % 10;//求个位sum = sum + n % 10n = n / 10;   //把个位抹去

🌸第四十二题→冒泡排序🌸

题目内容→创建一个函数Bubble_Sort()实现冒泡排序。

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定性算法。

冒泡排序基础的排序算法,也是我们必须要牢牢掌握的一种算法。

🌸第四十三题→学习小组🌸  

题目内容→张三同学有一个学习小组有⑤个人,每个人有③门课的考试成绩,求全组分科的平均成绩和各科总平均成绩,请用C语言编程帮张三同学实现一下吧。

输入描述:三行输入,分别输入五个人的语文成绩,数学成绩、英语成绩。

输出描述:二行输出,一门学科的平均分和三门各科总平均分。

题解思路如下↓

这道题目主要的就是考察下对数组的使用(一维数组、二维数组),注意:当我们计算完当前科目的总成绩的时候,并且它进行了当前科目的平均分。要记得给它在当前科目总成绩进行清0的操作。

🌸第四十四题→正整数的相乘🌸

题目内容→本道题目要求使用递归来实现不使用 * 运算符,实现两个正整数的相乘。

其实递归我们已经在前面的题型已经讲了很多次了,这里再把递归的限制条件说下↓

每一个递归函数都应该只进行有限次的递归调用,否则它就会进入死胡同,永远也不能退出了,这样的程序是没有意义的。

存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。

每次递归调用之后都会越来越接近这个限制条件。

实际上递归不用看的太过于复杂,把递归看的简单点,了解题的特性实际上这样使用递归效果更好。这也是我推荐初学者认识递归的最好的办法。像这道题目我jiode是函数实参肯定是要有两个参数的,首先题目要求了我们是不能使用乘法并且是递归的,那么我们还有加减法,那么可以思考下怎么样往这方面用递归的方法来解决,4 * 4 = 16 = (4 + 4 * (4-1))就比如这个那么你是不是可以弄成递归的特性来解决呢。注:递归的限制条件在这里是非常的容易的,由于0x任何数都得0那么我们这里就可以设 a 或 b 二者位限制条件。

🌸第四十五题→数组元素交换🌸

题目内容→将数组 arr1 的元素的数字和数组 arr2 的元素的进行交换。

int arr1[5] = { 1, 3, 5, 7, 9 };

int arr2[5] = { 2, 4, 6, 8, 10 };

把这两组的值进行交换,得到下面交换的值。如下所示↓

int arr1[5] = { 2, 4, 6, 8, 10 };
int arr2[5] = { 1, 3, 5, 7, 9 };

输出内容:要把每个元素给打印出来,交换前的元素和交换后的电路。

这道题目如果你会把两个变量进行交换的方法,那么你就可以很轻松的解决这道题目了。只不过还加上了一维数组的知识点。稍稍的比普通的交换难上了那么一丢丢而已,那么快点去实现它吧。


🍀第四十一题の代码🍀

#define _CRT_SECURE_NO_WARNINGS 1#includeint print(unsigned int n){//这里之所以是n>9是因为n 9){//取模得到个位,除以得到十位。return print(n / 10) + n % 10;}else{return n;}}int main(void){unsigned int num = 0;printf("请输入数字→");scanf("%d", &num);int ret = print(num);printf("ret = %d\n", ret);return 0;}

运行结果🖊 

请输入数字→1234

ret = 10

🍀第四十二题の代码🍀

#define _CRT_SECURE_NO_WARNINGS 1#includevoid Bubble_Sort(int arr[],int sz){int i = 0;//确定排序的次数for (i = 0; i < sz - 1; i++){//每次交换的次数,第一次交换次数n-1,依次......int j = 0;//防止无效循环,也就是当我们数组已经是冒泡排序的情况。int flag = 1; //确定交换的次数。for (j = 0; j  arr[j + 1]){//创建临时变量,进行交换!int change;change = arr[j];arr[j] = arr[j+1];arr[j+1] = change;flag = 0;}}if (flag == 1){break;}}}int main(void){int i = 0;//数组的逆序排序int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };//sz是数组总元素的大小int sz = sizeof(arr) / sizeof(arr[0]);//调用函数Bubble_Sort(arr,sz);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;}

运行结果🖊 

0 1 2 3 4 5 6 7 8 9 


🍀第四十三题の代码🍀

#define _CRT_SECURE_NO_WARNINGS 1#include int main(){int i = 0;int j = 0;//循环初始化下标int arr[3][5] = { 0 };//行-科目,列-学生。int sum = 0;  //当前科目的总成绩int average = 0;  //总平均分int v[3];     //各科平均数printf("请输入各科学生的成绩:\n");for (i = 0; i < 3; i++){printf("\n一门学科数入5次成绩\n");if (i == 0)printf("数学学科:");if (i == 1)printf("语文学科:");if (i == 2)printf("英语学科:");for (j = 0; j < 5; j++){scanf("%d", &arr[i][j]);  //输入每个同学的各科成绩sum += arr[i][j];//计算当前科目的总成绩(sum)}v[i] = sum / 5;  // 当前科目的平均分,用总的成绩除以5sum = 0;     // 把当前科目总成绩清0}printf("\n数学成绩 = %d\n语文成绩 = %d\n英语成绩 = %d\n", v[0], v[1], v[2]);average = v[0] + v[1] + v[2];printf("平均分: %d\n", average / 3);return 0;}

运行结果🖊 

请输入各科学生的成绩:

一门学科数入5次成绩
数学学科:80 80 80 80 80
一门学科数入5次成绩
语文学科:90 90 90 90 90
一门学科数入5次成绩
英语学科:100 100 100 100 100
数学成绩 = 80
语文成绩 = 90
英语成绩 = 100
平均分: 90


🍀第四十四题の代码🍀

#define _CRT_SECURE_NO_WARNINGS 1#include int Multiply(int a, int b){if (b == 0){return 0;}return a + Multiply(a, b - 1);// a + a * b}int main(void){int i = 0;int j = 0;printf("请输入两个数字:");scanf("%d %d", &i, &j);Multiply(i, j);printf("%d\n", Multiply(i, j));return 0;}

运行结果🖊 

请输入两个数字:4  5 

20 


🍀第四十五题の代码🍀

#include#define number 5int main(void){int i = 0;int arr1[number] = { 1, 3, 5, 7, 9 };int arr2[number] = { 2, 4, 6, 8, 10 };    for (i = 0; i < number; i++)    { printf("没交换之前的值:arr1[%d] = %d\n",i + 1, arr1[i]);    }for (i = 0; i < number; i++){printf("没交换之前的值:arr2[%d] = %d\n", i + 1, arr2[i]);}printf("\n");int sz = sizeof(arr1) / sizeof(arr1[0]);for (i = 0; i < sz; i++){int tmp;tmp = arr1[i];arr1[i] = arr2[i];arr2[i] = tmp;printf("arr1[%d] = %-2d  ", i + 1, arr1[i]);printf("arr2[%d] = %-2d\n", i + 1, arr2[i]);}return 0;}

运行结果🖊  

没交换之前的值:arr1[1] = 1
没交换之前的值:arr1[2] = 3
没交换之前的值:arr1[3] = 5
没交换之前的值:arr1[4] = 7
没交换之前的值:arr1[5] = 9
没交换之前的值:arr2[1] = 2
没交换之前的值:arr2[2] = 4
没交换之前的值:arr2[3] = 6
没交换之前的值:arr2[4] = 8
没交换之前的值:arr2[5] = 10
arr1[1] = 2   arr2[1] = 1 
arr1[2] = 4   arr2[2] = 3 
arr1[3] = 6   arr2[3] = 5 
arr1[4] = 8   arr2[4] = 7 
arr1[5] = 10  arr2[5] = 9