C语言程序与设计第四版课后习题 - 第七章(三)

7.11 函数计算平均分

题目概述:

输入 10 个学生 5 门课的成绩,分别用函数实现下列功能:

1.计算每个学生平均分;
2.计算每门课的平均分;
3.找出所有 50 个分数中最高的分数所对应的学生和课程

题目思路:
  • PS:由于本题数据有50个,输入太废劲…所以本题在初始化数组时已经把分数初始进去了
  • 首先我们可以定义一个11*6的数组,第六列存放学生平均成绩,第11行存放课程成绩,然后依次遍历,把存放的值放入数组中
  • 然后计算第三个最高成绩时候,由于要输出行和列,我们可以定义一个全局变量用来存放。因为要打印最高成绩,所以函数的返回类型是float类型,用一个float类型的变量来接收
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include 
int row = 0;
int col = 0;
void ave_stu(float arr[][6]) //arr[][6]是算学生平均成绩的
{
	int i = 0;
	int j = 0;
	float sum = 0.0;

	for (i = 0; i < 10; i++)
	{
		sum = 0.0;
		for (j = 0; j < 5; j++)
		{
			sum += arr[i][j];
			arr[i][5] = sum / 5;
		}
	}
}

void ave_cor(float arr[][6])
{
	int i = 0;
	int j = 0;
	float sum = 0.0;

	for (j = 0; j < 5; j++)
	{
		sum = 0.0;
		for (i = 0; i < 10; i++)
		{
			sum += arr[i][j];
		}
		arr[10][j] = sum / 10;
	}
}

float find_high(float arr[][6])
{
	int i = 0;
	int j = 0;
	float max = 0.0;

	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 5; j++)
		{
			if (max < arr[i][j])
			{
				max = arr[i][j];
				row = i + 1;
				col = j + 1;
			}
		}
	}

	return max;

}

int main()
{
	float arr[11][6] = { {87,88,92,67,78},{88,86,87,98,90},{76,75,65,65,78},
		{67,87,60,90,67},{77,78,85,64,56},{76,89,94,65,76},{78,75,64,67,77},
		{77,76,56,87,85},{84,67,78,76,89},{86,75,64,69,90} };
	int i = 0;
	int j = 0;


	ave_stu(arr);
	ave_cor(arr);
	float max = find_high(arr);

	printf("每个学生的平均成绩是:");
	for (i = 0; i < 10; i++)
	{
		printf("%.2f ", arr[i][5]);
	}

	printf("\n每个课程的平均成绩是:");
	for (j = 0; j < 5; j++)
	{
		printf("%.2f ", arr[10][j]);
	}

	printf("\n最高成绩是:%.2f,学生号是:%d,课程号是:%d", max, row, col);

	return 0;
}

7.12 不知道起什么题目名 X

题目概述:

写几个函数:
①输人 10 个职工的姓名和职工号
②按职工号由小到大顺序排序,姓名顺序也随之调整
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名

代码实现:

本体代码实现是官方教材课后习题标准答案,非本人写

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#define N 10
int main()
{
	void input(int[], char name[][8]);
	void sort(int[], char name[][8]);
	void search(int, int[], char name[][8]);
	int num[N], number, flag = 1, c;
	char name[N][8];
	input(num, name);
	sort(num, name);
	while (flag == 1)
	{
		printf("\ninput number to look for:");
		scanf("%d", &number);
		search(number, num, name);
		printf("continue or not(Y/N)?");
		getchar();
		c = getchar();
		if (c == 'N' || c == 'n')
		{
			flag = 0;
		}
	}

	return 0;
}

void input(int num[], char name[N][8])
{
	int i;
	for (i = 0; i < N; i++)
	{
		printf("input No.:");
		scanf("%d", &num[i]);
		printf("input name: ");
		getchar();
		gets(name[i]);
	}
}

void sort(int num[], char name[N][8])
{
	int i, j, min, templ;
	char temp2[8];
	for (i = 0; i < N - 1; i++)
	{
		min = i;
		for (j = i; j < N; j++)
			if (num[min] > num[j])
				min = j;
		templ = num[i];
		strcpy(temp2, name[i]);
		num[i] = num[min];
		strcpy(name[i], name[min]);
		num[min] = templ;
		strcpy(name[min], temp2);
	}
	printf("\n result: \n");
	for (i = 0; i < N; i++)
	{
		printf("\n %5d%10s", num[i], name[i]);
	}
}

void search(int n, int num[], char name[N][8])//折半查找的函数
{
	int top, bott, mid, loca, sign;
	top = 0;
	bott = N - 1;
	loca = 0;
	sign = 1;
	if ((n < num[0]) || (n > num[N - 1]))
		loca = -1;
	while ((sign == 1) && (top <= bott))
	{
		mid = (bott + top) / 2;
		if (n == num[mid])
		{
			loca = mid;
			printf("NO.%d,his name is %s.\n", n, name[loca]);
			sign = -1;
		}
		else if (n < num[mid])
			bott = mid - 1;
		else
			top = mid + 1;
	}

	if (sign == 1 || loca == -1)
		printf("%d not been found.\n", n);
}

7.13 递归返回最大值

题目概述:

输入 4 个整数,找出其中最大的数。用函数的递归调用来处理

题目思路:
  • 本题要明白递归是什么,递归递归,是先递推再回归,如图所示,假设本题a,b,c,d输入值为1,2,3,4
  • 图解
    C语言程序与设计第四版课后习题 - 第七章(三)_第1张图片
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include 
int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}

int findmax(int a, int b, int c, int d)
{
	int max = Max(Max(Max(a, b),c),d);
	return max;
}

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;

	scanf("%d %d %d %d", &a, &b, &c, &d);

	int max = findmax(a, b, c, d);

	printf("%d", max);


	return 0;
}

7.14 整数转换字符串

题目概述:

用递归法将一个整数转换成字符串。例如,输入 483,应输出字符串"483",n的位数不确定,可以是任意位数的整数。

题目思路:

画图理解:

红色线是递推,绿色线是回归,递归递归先递推后回归
C语言程序与设计第四版课后习题 - 第七章(三)_第2张图片

  • 整数+字符变成字符
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include 
void change(int n)
{
	if (n / 10 != 0)
	{
		change(n / 10);
	}
	printf("%c", n % 10 + '0');
}

int main()
{
	int num = 0;

	scanf("%d", &num);

	change(num);


	return 0;
}

7.15 计算该日是该年的第n天

题目概述:

给出年、月、日,计算该日是该年的第 n 天

题目思路:
  • 该年的第几天,只需要把月和日加起来就好了,但是有个问题,因为年有闰年,而闰年是29天,所以我们还要多判断一个闰年便于计算
  • 我们可以专门
    • 写一个函数专门判断闰年,
    • 写一个函数专门计算该年的月份有多少天,而这个函数我们存月份的天数的时候,可以用数组存放可以建立一个长度为13的数组,下标为0的部分存放29,也就是闰年的二月,那么从下标为1开始就是对应的1-12月。
    • 写一个函数专门计算年月日(年月函数+日)
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include 
int is_leap_year(int year)
{
	if ((year % 4 == 0 && year / 100 != 0) || (year % 4 == 0))
		return 1;
	return 0;
}

int cal_year_month(int year, int month)
{
	int arr[13] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };

	if (month == 2 && is_leap_year(year))
		return arr[0];
	return arr[month];
}

int cal_year_month_day(int year, int month, int day)
{
	int i = 0;
	int days = 0;
	for (i = 1; i < month; i++)
	{
		days += cal_year_month(year, i);
	}

	days += day;

	return days;
}

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;

	scanf("%d %d %d", &year, &month, &day);

	int days = cal_year_month_day(year, month, day);

	printf("%d年%d月%d日是该年的第%d天", year, month, day, days);

	return 0;
}

运行结果如下:
在这里插入图片描述

随便找个工具验证:
C语言程序与设计第四版课后习题 - 第七章(三)_第3张图片

你可能感兴趣的:(c语言,算法,数据结构)