IE盒子

搜索
查看: 83|回复: 0

C++ 要求打印出3门课的总平均成绩,以及最高分的学生的数据

[复制链接]

5

主题

7

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2022-12-28 15:59:31 | 显示全部楼层 |阅读模式
题目:
有10个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入10个学生的数据  
要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课成绩,平均分)
附加要求:按总成绩从大到小排序,以自己的姓名+学号存起来(xiaoyan.txt)
实现代码如下:
#include <iostream>
#include <iomanip>
#include <cassert>
#include <fstream>
using namespace std;

const int n = 10;  //这是学生数量
//下面开始构建一个学生类
struct student
{
    char num[10]; //学号
    char name[8]; //姓名
    int score[3]; //成绩
    float avr;//平均成绩
}stu[n];

int main(){
    void input(student stu[]);

    input(stu);

    float average = 0;
    int max = 0;
    int maxi = 0;
    int i, j;

    for (int i = 0; i < n;i++){
        int sum = 0;
        for (int j = 0; j < 3;j++)
            sum += stu.score[j];
        stu.avr= (sum / 3.0);
      
        average += stu.avr;
        if(sum>max){
            max = sum;
            maxi = i;
        }
    }
//这里开始打印
    cout << "学号           姓名      语文     数学     英语      平均成绩" << endl;

        for (i = 0; i < n;i++){
            for(int m=i+1;m<n;m++){
                if(stu.avr<stu[m].avr){
                     int k =stu.avr;
                    stu.avr = stu[m].avr;
                    stu[m].avr = k;
                }
            }

        cout << stu.num << " " << setw(8) << stu.name << "      "; //打印学号姓名
        for (j = 0; j < 3;j++)
            cout << setw(3) << stu.score[j] << "      ";  //打印三科成绩
        cout << "     "<<stu.avr << endl;
        cout << endl;
    }

    cout << endl;
    cout << "三科的总平均成绩为: " << (average/n) << endl;
    cout << endl;
    int maxsum = (stu[maxi].score[0] + stu[maxi].score[1] + stu[maxi].score[2]);
    cout << "最高分是学生:" << stu[maxi].name << "学号为: " << stu[maxi].num << "  各科成绩为  " << stu[maxi].score[0] << "  " << stu[maxi].score[1] << "  " << stu[maxi].score[2] << "平均分为:" << stu[maxi].avr << "总分为: " << maxsum << endl;
    cout << endl;



    return 0;
}

//输入函数
void input(student stu[]){
    ofstream ofile("xiaoyan.txt");
    assert(ofile);

    int i, j;
    for ( i = 0; i < n; i++)
    {
        cout << "学号8位:  ";  //提示输入八位的学号
        cin >> stu.num;  //将学号加到第i个的num的位置

        cout << "姓名: ";  //提示输入姓名
        cin >> stu.name;  //将姓名加到第i个的name的位置


        for ( j = 0; j < 3; j++)  //一个for循环,用来获取三科的成绩
        {
            cout << "成绩" << j+1 << ":  ";
            cin >> stu.score[j];
        }
        cout << endl;
        ofile << stu.num << "  " << stu.name << "  " << stu.score[0] << "  " << stu.score[1]<< "  " << stu.score[2]<< endl;
    }
    ofile.close();

}



当n=2的时候(只有两个学生)的效果图

涉及的部分知识点:

  • assert()断言函数,用于在调试过程中捕捉程序错误
( assert() 的用法很简单,我们只要传入一个表达式,它会计算这个表达式的结果:如果表达式的结果为“假”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。)
2. setw()的意思是输出数据的占位宽度而不是数据与数据之间的间隔。它由头文件iomanip定义。
例如:
cout<<'s'<<setw(8)<<'a'<<endl;
则在屏幕显示
s        a
//s与a之间有7个空格,setw()只对其后面紧跟的输出产生作用,如上例中,表示'a'共占8个位置,不足的用空格填充。若输入的内容超过setw()设置的长度,则按实际长度输出。
setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。

cout<<setfill('*')<<setw(5)<<'a'<<endl;
则输出:
****a //4个*和字符a共占5个位置。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表