当前位置:网站首页>【C语言】 题集 of Ⅸ

【C语言】 题集 of Ⅸ

2022-07-06 20:10:00 InfoQ

write in front

​​Hello,大家好我是泽 En,一起共同学习,多多指教(●'◡'●)
欢迎各位→点赞 + 收藏️ + 留言
️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本
总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
2021 年度博客之星物联网与嵌入式开发 TOP5~2021 博客之星 Top100~阿里云专家 ^ 星级博主~掘金⇿InfoQ 创作者~周榜 77»总榜 1479

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

输入一个无符号数字,无非就是用输入函数scanf()进行输入,但是要注意下这是无符号输入那么我们就要在数据类型前面加上unsigned(无符号类型)才可以。
计算数字每一位之和,就是假设我们输入的数字是19,那么就是相当于9+1=10,这样。
用递归进行实现,在前面的题已经都说过了,那么再来说下。
概述:一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。
那么递归它也是具有限制条件的,不然它就会造成死递归,这个就相当于死循环一样。
存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。每次递归调用之后都会越来越接近这个限制条件。
当然,这道题目不用递归也是非常好解决的,关键点就两行代码如下↓
sum += n % 10;//求个位sum = sum + n % 10
n = n / 10; //把个位抹去


第四十二题→冒泡排序

题目内容→创建一个函数Bubble_Sort()实现冒泡排序。
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
 
 
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定性算法。
冒泡排序基础的排序算法,也是我们必须要牢牢掌握的一种算法。

null

第四十三题→学习小组

  

题目内容→张三同学有一个学习小组有⑤个人,每个人有③门课的考试成绩,求全组分科的平均成绩和各科总平均成绩,请用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
#include<stdio.h>
int print(unsigned int n)
{
//这里之所以是n>9是因为n<10的话无论我们输入什么数字都是最终相加之和
if (n > 9)
{
//取模得到个位,除以得到十位。
return print(n / 10) + n % 10;
}
else
{
return n;
}
}
int main(void)
{
unsigned int num = 0;
printf(&quot;请输入数字→&quot;);
scanf(&quot;%d&quot;, &num);
int ret = print(num);
printf(&quot;ret = %d\n&quot;, ret);
return 0;
}

运行结果&nbsp;
请输入数字→1234
ret = 10

第四十二题の代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void 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 < sz - 1 - i; j++)
{
//第一个数字和第二个数字比较,当第一个数字大于第二个数字时候进行交换。
if (arr[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(&quot;%d &quot;, arr[i]);
}
return 0;
}

运行结果&nbsp;
0 1 2 3 4 5 6 7 8 9&nbsp;

第四十三题の代码

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

运行结果&nbsp;
请输入各科学生的成绩:
一门学科数入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 <stdio.h>
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(&quot;请输入两个数字:&quot;);
scanf(&quot;%d %d&quot;, &i, &j);
Multiply(i, j);
printf(&quot;%d\n&quot;, Multiply(i, j));
return 0;
}

运行结果&nbsp;
请输入两个数字:4&nbsp; 5&nbsp;
20
&nbsp;

第四十五题の代码

#include<stdio.h>
#define number 5
int 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(&quot;没交换之前的值:arr1[%d] = %d\n&quot;,i + 1, arr1[i]);
 }
for (i = 0; i < number; i++)
{
printf(&quot;没交换之前的值:arr2[%d] = %d\n&quot;, i + 1, arr2[i]);
}
printf(&quot;\n&quot;);
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(&quot;arr1[%d] = %-2d &quot;, i + 1, arr1[i]);
printf(&quot;arr2[%d] = %-2d\n&quot;, i + 1, arr2[i]);
}
return 0;
}

运行结果&nbsp;
&nbsp;
没交换之前的值: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] = 10arr1[1] = 2 &nbsp; arr2[1] = 1&nbsp;arr1[2] = 4 &nbsp; arr2[2] = 3&nbsp;arr1[3] = 6 &nbsp; arr2[3] = 5&nbsp;arr1[4] = 8 &nbsp; arr2[4] = 7&nbsp;arr1[5] = 10 &nbsp;arr2[5] = 9&nbsp;
原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/b7f9b39eac394e9f9e287ed12