zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【C语言】 题集 of ⑨

2023-02-18 15:49:55 时间

 ?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 % 10
n = 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
#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("请输入数字→");
	scanf("%d", &num);
	int ret = print(num);
	printf("ret = %d\n", ret);
	return 0;
}

运行结果?  请输入数字→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("%d ", arr[i]);
	}
	return 0;
}

运行结果?  0 1 2 3 4 5 6 7 8 9 


?第四十三题の代码?

#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("请输入各科学生的成绩:\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;  // 当前科目的平均分,用总的成绩除以5
		sum = 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 <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("请输入两个数字:");
	scanf("%d %d", &i, &j);
	Multiply(i, j);
	printf("%d\n", Multiply(i, j));
	return 0;
}

运行结果?  请输入两个数字:4  5  20


?第四十五题の代码?

#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("没交换之前的值: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