C语言程序设计第八章课后习题第15题解答过程(附有完整注释)

15.有一个班4个学生,5门课程。1.求第一门课程的平均分;2.找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;3.找出平均成绩在90分以上或全部成绩在85分以上的学生。分别编3个函数实现以上3个要求。

//15.有一个班4个学生,5门课程。1.求第一门课程的平均分;2.找出有两门以上课程不及格的学生,输出
//他们的学号和全部课程成绩及平均成绩;3.找出平均成绩在90分以上或全部成绩在85分以上的学生。分别
//编3个函数实现以上3个要求。
#include <stdio.h>
double average_class1(int arr[][5])
{
	int i = 0;
	double sum = 0;
	for (i = 0; i < 4; i++)
	{
		sum += arr[i][0];//因为是求第一门课程的平均分,所以直接列就是0,只要行加1就行!
	}
	return (sum / 4);//这里是直接除以4就可以了,但是如果int是整型的话,那么就要乘以1.0哦!
}
void find_fail_student(long int arr[], int arr1[][5], char arr2[][50])
{
	int i = 0;
	int j = 0;
	double sum = 0;
	int k=1;
	for (i = 0; i < 4; i++)
	{
		int num = 0;//这里的num也要清零,因为另一个学生要重新开始计算!
		sum = 0;//注意,这里的sum要清零,因为sum一次只能计算一个学生的成绩总和!
		for (j = 0; j < 5; j++)
		{
			sum += arr1[i][j];//这里是遍历了第一个学生的5门课程!
			if (arr1[i][j] < 60)
			{
				num++;//num的数值代表了他有几科成绩不及格
			}
		}
		if (num > 2)
		{
			printf("未达标的第%d个学生的学号是%d,姓名是%s\n",k, arr[i], arr2[i]);
			printf("这个学生5门课程的平均成绩是%lf\n", sum / 5);
			printf("这个学生的各课程的成绩分别是:\n");
			k++;
			int a = 0;
			for (a = 0; a < 5; a++)
			{
				printf("%d ", arr1[i][a]);
			}
			printf("\n");//这里换行是为了美观!
		}
	}
}
void find_great_student(long int arr[], char arr1[][50], int arr2[][5])
{
	int i = 0;
	int j = 0;
	double sum = 0;
	int k = 1;
	for (i = 0; i < 4; i++)
	{
		int num = 0;
		sum = 0;//这里的清零,目的和上面的一样!
		for (j = 0; j < 5; j++)
		{
			if (arr2[i][j] > 85)
			{
				num++;
			}
			sum += arr2[i][j];
		}
		if (num == 5 || (sum / 5) > 90)//这是根据题目要求来实现的!
		{
			printf("\n第%d个优秀学生的学号是:%d,姓名是%s\n",k, arr[i],arr1[i]);
			k++;//这里使用k++是为了计算出第二个优秀学生,甚至更多的优秀学生!
		}
	}
}
int main()
{
	double average_class1(int arr[][5]);//这是一个求第一门课程的平均分函数
	void find_fail_student(long int arr[], int arr1[][5], char arr2[][50]);//这是一个求未达标的学生的函数
	void find_great_student(long int arr[], char arr1[][50], int arr2[][5]);//这是求优秀学生的函数
	long int arr1[4] = {};//存储学号的数组
	char arr2[4][50] = {};//存储姓名的数组
	//之所以将姓名放在一个二维数组里面就是因为,我如果放在一维数组里面的话,他又是存放的字符数组,所以这样就不对了!
	//所以我干脆将其放在一个二维数组里面,把名字放在每一行即可!
	int arr3[4][5] = {};//存储成绩的数组
	int i = 0;
	int j = 0;
	for (i = 0; i < 4; i++)
	{
		printf("请输入第%d个学生的学号:", i + 1);
		scanf_s("%d", &arr1[i]);
		(void)getchar();//在使用了scanf之后,会使用一个enter键,这时候要使用getchar把它吃掉!
		printf("请输入这个学生的姓名:");
		gets_s(arr2[i]);//运用gets来接受字符串!
		printf("请输入这个学生的5门课程的成绩:");
		for (j = 0; j < 5; j++)
		{
			scanf_s("%d", &arr3[i][j]);
			(void)getchar();//这里使用getchar也是同样的道理!
		}
		//(void)getchar();
	}
	printf("第一门课程的平均分是%lf\n", average_class1(arr3));
	find_fail_student(arr1, arr3, arr2);
	find_great_student(arr1, arr2, arr3);//这里对函数的调用就不必多说了!
	return 0;
}

最后祝大家天天开心,没事看看这个代码(给新手看看),欢迎大佬来改进我的代码,并给我一点指点!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值