题目
编写程序,实现如下功能:一个学习小组有5个人,每个人有Math,C,Database三门课的考试成绩,求该组各科成绩的平均分及所有成绩的平均分并输出到屏幕。
解题步骤
(1)给出结构体;
(2)分析变量;
(3)计算总 / 各科成绩平均分;
(4)输出结果;
Java
import java.util.Scanner;
public class Demo {
static class Student {
private float Math;
private float C;
private float Database;
private float Sum = 0;
public void SetValue(float Math, float C, float Database) {
this.Math = Math;
this.C = C;
this.Database = Database;
Sum = Math + C + Database;
}
public float GetMath() {
return Math;
}
public float GetC() {
return C;
}
public float GetDataBase() {
return Database;
}
public float GetSum() {
return Sum;
}
}
public static void main(String[] args) {
float Math = 0, C = 0, Database = 0, Total = 0, MathSum = 0, CSum = 0, DatabaseSum = 0;
Student[] student = new Student[5];
Scanner user = new Scanner(System.in);
for (int i = 0; i < 5; i++)
{
System.out.format("Please enter the math score of the %d student:", i + 1);
Math = user.nextFloat();
System.out.format("Please enter the C language score of the %d student::", i + 1);
C = user.nextFloat();
System.out.format("Please enter the database score of the %d student::", i + 1);
Database = user.nextFloat();
student[i] = new Student();
student[i].SetValue(Math, C, Database);
}
for (int i = 0; i < 5; i++) {
MathSum += student[i].GetMath();
CSum += student[i].GetC();
DatabaseSum += student[i].GetDataBase();
Total += student[i].GetSum();
}
System.out.format("MathAverage=%f CAverage=%f DatabaseAverage=%f", MathSum / 5.0, CSum / 5.0, DatabaseSum / 5.0);
System.out.format("\nTotalScoreAverage=%.3f", Total / 5.0);
}
}
说明
- Java是一种高级语言,它舍弃了C/C++中容易出错的指针、一些莫须有的语言结构(其中就包含结构体),所以这道题如果我们用Java语言解决,就需要用到类和对象。
- 我们在类中包含其属性和方法,不太容易想到的是三门科目的成绩从键盘接收并且需要循环五次的操作:使用对象数组
Student[] student = new Student[5];
并对其进行实例化实现动态接收数据。
- 在类和对象中,只要有需求,我们就添加方法解决问题。例如本题中设置返回三个科目成绩的方法实现单科成绩平均分、总成绩平均分求算。
- 对象数组需要进行实例化
student[i] = new Student();
,否则报错:空指针错误!!!
C语言
#include <stdio.h>
struct Student
{
float Math;
float C;
float Database;
} student[5];
int main()
{
float Math, C, Database, Sum;
for (int i = 0; i < 5; i++)
{
printf("please enter the three door subject grades of the first %d name classmate:", i + 1);
scanf("%f%f%f", &student[i].Math, &student[i].C, &student[i].Database); //注意 &
Sum += student[i].Math + student[i].C + student[i].Database;
Math += student[i].Math;
C += student[i].C;
Database += student[i].Database;
}
printf("MathAverage=%f CAverage=%f DatabaseAverage=%f", Math / 5.0, C / 5.0, Database / 5.0);
printf("\nTotalAverage=%f", Sum / 5.0);
return 0;
}
说明
- 关键点在于如何将不同科目的成绩和同学进行区分。这里我们采用结构体数组的方式解决:有5个元素的结构体数组
student[5]
包含Math
、C
和Database
三个变量对应不同科目成绩。考虑到这点,题目就变得非常简单,只要接收输入值,计算方可。
- 计算中,要考虑周全,成绩有可能是
float
类型。而计算平均值时用到的/
号,结果为整型,所以我们做除法的时候,除数应该是5.0
而不是5
。
异同点:
下面这道题目和本题类似,需要注意的点是使用
scanf()
时,若结构体中包含数组,就需要关注
&
是否需要存在。对比源码,进一步加深理解。
#include <stdio.h>
struct student
{
int num;
char name[20];
float score[3];
};
void main()
{
struct student s[3]; //struct student 等价于int,实质:编写了一个数据类型
int i, j;
float sum, avg[3];
for (i = 0; i < 3; i++)
{
sum = 0;
printf("请输入学号:\n");
scanf("%d", &s[i].num); // num 为int类型,是普通变量,不代表地址
printf("请输入姓名:\n");
scanf("%s", s[i].name); // 不需要 &s.name 因为数组名name代表首地址
printf("请输入三门科目成绩:\n");
for (j = 0; j < 3; j++)
{
scanf("%f", &s[i].score[j]);
sum = sum + s[i].score[j];
}
avg[i] = sum / 3.0;
}
printf("输出信息:\n");
for (i = 0; i < 3; i++)
printf("学号:%d,姓名:%s,平均分:%.2f\n", s[i].num, s[i].name, avg[i]);
}