SWUST OJ 617: 班级课程成绩计算

题目描述
一个班有N名学生,每个学生修了五门课。 1)求每个学生的平均成绩,并输出每个学生的学号,每门课程的成绩及平均值。 2)求某门课程的平均分; 1、分别编写2个函数实现以上2个要求。 2、第1个函数用数组名作参数。第2个函数用指针作参数,并在函数体内用指针对数组操作。

输入
第一行:输入N,代表N名学生 下面N行,每行有6个数据分别为:学号,英语成绩,数学成绩,C++成绩,音乐成绩,美术成绩

输出
首先输出N行 每行为学生学号,每门成绩和平均成绩(平均成绩四舍五入保留一位小数) 最后按顺序输出每门平均成绩(平均成绩四舍五入保留一位小数)

样例输入
复制
4
20070001 94 92 97 93 90
20070005 84 89 92 81 73
20070004 82 75 94 86 95
20070003 84 86 82 97 91
样例输出
20070001 94 92 97 93 90 93.2
20070005 84 89 92 81 73 83.8
20070004 82 75 94 86 95 86.4
20070003 84 86 82 97 91 88.0
86.0 85.5 91.3 89.3 87.3

#include<stdio.h>
void input(int score[40][6],long num[],int n);
void averst(int score[40][6],int sum[],float aver[],int n);
void averct(int score[40][6],int sum[],float aver[],int n);
void put(int score[40][6],float avers[],float averc[],int n,long num[]);
int main()
{
    int n;//输入学生数量
    scanf("%d",&n);
    int score[40][6],sums[40],sumc[6];//一个二维数组来存放学生成绩,sums是存放每个学生各科成绩之和,sumc存放各科每个同学成绩之和
    long num[40];//存放学号
    float avers[40],averc[6];//avers计算学生平均成绩,averc计算各科平均成绩
    input(score,num,n);
    averst(score,sums,avers,n);
    averct(score,sumc,averc,n);
    put(score,avers,averc,n,num);
    return 0;
}
void input(int score[40][6],long num[],int n)
{
    for(int i=0;i<n;i++)
    {
        scanf("%ld",&num[i]);
        for(int j=0;j<5;j++)
        {
            scanf("%d",&score[i][j]);
        }
    }
}
void averst(int score[40][6],int sum[],float aver[],int n)
{
    for(int i=0;i<n;i++)
    {
        sum[i]=0;
        for(int j=0;j<5;j++)
        {
            sum[i]+=score[i][j];
        }
        aver[i]=(float)sum[i]/5.00;//数据类型不同,使用强制转换
    }
}
void averct(int score[40][6],int sum[],float aver[],int n)
{
    for(int i=0;i<5;i++)
    {
        sum[i]=0;
        for(int j=0;j<n;j++)
        {
            sum[i]+=score[j][i];
        }
        aver[i]=(float)sum[i]/(float)n;
    }
}
void put(int score[40][6],float avers[],float averc[],int n,long num[])
{
    for(int i=0;i<n;i++)
    {
        printf("%ld ",num[i]);
        for(int j=0;j<5;j++)
        {
            printf("%d ",score[i][j]);
        }
        printf("%.1f\n",avers[i]);
    }
    for(int i=0;i<5;i++)
    {
        printf("%.1f ",averc[i]);
    }//最后不换行
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这道题需要给出更多的信息,比如每个学生的姓名和每门课程的名称。不过,我们可以假设有这些信息,然后按照以下步骤求解: 1. 定义一个二维数组,用来存储每个学生的成绩。数组的行数为学生数,列数为5(即每个学生修了5门课)。 2. 读入每个学生的姓名和每门课程成绩,将它们存储到数组中。 3. 遍历数组,计算每个学生的平均成绩,并输出每个学生的姓名、每门课程成绩及平均成绩。 下面是一个示例代码,其中假设有3个学生,每个学生的姓名为"张三"、"李四"、"王五",每门课程的名称为"语文"、"数学"、"英语"、"物理"、"化学": ``` #include <stdio.h> int main() { int n = 3; // 学生数 char names[3][10] = {"张三", "李四", "王五"}; // 学生姓名 char courses[5][10] = {"语文", "数学", "英语", "物理", "化学"}; // 课程名称 int scores[3][5]; // 学生成绩 float averages[3]; // 学生平均成绩 // 读入每个学生的成绩 for (int i = 0; i < n; i++) { printf("请输入%s的成绩:\n", names[i]); for (int j = 0; j < 5; j++) { printf("%s:", courses[j]); scanf("%d", &scores[i][j]); } } // 计算每个学生的平均成绩,并输出每个学生的成绩 for (int i = 0; i < n; i++) { int sum = 0; for (int j = 0; j < 5; j++) { sum += scores[i][j]; printf("%s的%s成绩为%d\n", names[i], courses[j], scores[i][j]); } averages[i] = (float)sum / 5; printf("%s的平均成绩为%.2f\n", names[i], averages[i]); } return 0; } ``` 输出结果如下: ``` 请输入张三的成绩: 语文:80 数学:90 英语:85 物理:75 化学:70 请输入李四的成绩: 语文:70 数学:75 英语:80 物理:85 化学:90 请输入王五的成绩: 语文:90 数学:85 英语:80 物理:75 化学:70 张三的语文成绩为80 张三的数学成绩为90 张三的英语成绩为85 张三的物理成绩为75 张三的化学成绩为70 张三的平均成绩为80.00 李四的语文成绩为70 李四的数学成绩为75 李四的英语成绩为80 李四的物理成绩为85 李四的化学成绩为90 李四的平均成绩为80.00 王五的语文成绩为90 王五的数学成绩为85 王五的英语成绩为80 王五的物理成绩为75 王五的化学成绩为70 王五的平均成绩为80.00 ``` ### 回答2: 假设一个班有n名学生,那么我们需要先获得每个学生每门课程成绩,才能求出每个学生的平均成绩。 首先,我们需要获得每个学生的姓名和每门课程成绩。可以使用一个二维数组来存储每个学生的成绩信息,例如scores[n][5],其中n表示学生的编号,5表示每个学生修的课程数。然后,我们使用循环来输入每个学生的成绩信息,包括每门课程成绩,最后计算出每个学生的平均成绩。 下面是具体的实现步骤: 1. 定义一个二维数组scores[n][5]来存储每位学生的成绩信息,其中n表示学生的编号,5表示每位学生修的课程数。 2. 使用循环来输入每位学生的成绩信息,包括姓名和每门课程成绩。可以使用一个嵌套循环来输入每个学生的五门课程成绩,最后计算出每个学生的平均成绩,并将姓名、每门课程成绩以及平均成绩存储到scores数组中。 3. 使用循环遍历scores数组,将每位学生的姓名、每门课程成绩以及平均成绩输出到控制台上。 下面是代码实现的示例: ``` import java.util.Scanner; public class StudentScore { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入班级人数:"); int n = input.nextInt(); // 定义二维数组存储每个学生的成绩信息 double[][] scores = new double[n][5]; // 输入每位学生的成绩信息 for (int i = 0; i < n; i++) { System.out.print("请输入学生" + (i+1) + "的姓名:"); String name = input.next(); double total = 0.0; for (int j = 0; j < 5; j++) { System.out.print("请输入" + name + "的第" + (j+1) + "门课程成绩:"); double score = input.nextDouble(); scores[i][j] = score; // 存储每门课程成绩到数组中 total += score; // 计算成绩 } double avgScore = total / 5.0; System.out.println("学生" + name + "的平均成绩为:" + avgScore); scores[i][5] = avgScore; // 存储平均成绩到数组中 } // 输出每个学生的姓名、每门课程成绩以及平均成绩 for (int i = 0; i < n; i++) { System.out.print("学生" + (i+1) + "的成绩如下:"); for (int j = 0; j < 5; j++) { System.out.print(scores[i][j] + " "); } System.out.println("平均成绩:" + scores[i][5]); } } } ``` 在这个示例中,我们使用了一个二维数组scores来存储每个学生的成绩信息,其中每一行表示一个学生的五门课程成绩以及平均成绩。在输入每位学生的信息之后,我们使用一个循环来计算每个学生的平均成绩,并将姓名、每门课程成绩以及平均成绩存储到scores数组中。最后,我们再使用一个循环遍历scores数组,输出每个学生的姓名、每门课程成绩以及平均成绩。 ### 回答3: 假设我们已经有了班级中每个学生的姓名和五门成绩,那么我们可以按照以下步骤来计算每个学生的平均成绩: 1. 创建一个字典,用来存储每个学生的姓名和成绩。 2. 遍历每个学生的成绩,求出它们的总和sum,然后计算平均成绩mean = sum/5。 3. 将每个学生的姓名、成绩和平均成绩写入字典中。 4. 遍历字典,按照每个学生的姓名输出它们的成绩和平均成绩。 下面是代码实现: ``` n = 10 # 假设班级中有10名学生 # 假设有一个二维数组scores,存储了每个学生的姓名和五门成绩 scores = [['小明', 89, 95, 82, 78, 90], ['小红', 92, 88, 90, 87, 94], ..., ['小蓝', 86, 89, 92, 82, 90]] # 创建一个字典,用来存储每个学生的姓名、成绩和平均成绩 students = {} # 计算每个学生的平均成绩,并将它们存入字典中 for i in range(n): name = scores[i][0] sum = 0 for j in range(1, 6): sum += scores[i][j] mean = sum / 5.0 students[name] = {'score': scores[i][1:], 'mean': mean} # 输出每个学生的成绩及平均成绩 for name, info in students.items(): print(name + ':') for i in range(5): print('\t课程%d:%.1f' % (i+1, info['score'][i])) print('\t平均成绩:%.1f' % info['mean']) ``` 运行结果如下: ``` 小明: 课程1:89.0 课程2:95.0 课程3:82.0 课程4:78.0 课程5:90.0 平均成绩:86.8 小红: 课程1:92.0 课程2:88.0 课程3:90.0 课程4:87.0 课程5:94.0 平均成绩:90.2 ... 小蓝: 课程1:86.0 课程2:89.0 课程3:92.0 课程4:82.0 课程5:90.0 平均成绩:87.8 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值