您的位置:首页 > 其它

第17周项目6--学生成绩统计(文件操作2-设计自定义函数实现任务)

2014-12-23 08:34 681 查看
/* 
* Copyright (c) 2014, 烟台大学计算机学院 
* All rights reserved. 
* 文件名称:test.cpp 
* 作    者:刘畅 
* 完成日期:2014 年 12  月  23  日 
* 版 本 号:v1.0 
* 
* 问题描述: score.txt中是一些同学的学号、姓名、C++、高数、英语成绩,利用前面定义的结构体数组,读取文件score.txt中的数据,完成下面的应用:
在前面工作的基础拟出新的需求,将程序用一个“菜单”组织起来(如图所示),做成一个“学生成绩管理系统”之类的应用程序。
•从文件中读出数据,存放到结构体数组中;
•求出每名同学的总分(可以在读入过程中“顺便”计算);
•输出结构体数组中所有同学的记录。
•按总分排序(降序);
•输出排序后的成绩单;
•有30名同学可以获得奖学金,规则是总分高者优先,有挂科不能得奖学金。请输出可以得奖学金同学的名单。若符合得将的最后一名同学有重复(例如总分全为S),则总分为S的同学全得奖。
。  
* 输入描述:已初始化,无需输入。
* 程序输出:按照要求输出同学的成绩单。


#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

struct Student
{
    char num[13];
    char name[10];
    int cpp;
    int math;
    int english;
    int grade;
};
int main()
{
    int i,n,stuNum=0;
    Student stu[1000];
    ifstream infile("score.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    i=0;
    while(infile>>stu[i].num>>stu[i].name>>stu[i].cpp>>stu[i].math>>stu[i].english)
    {
        stu[i].grade=stu[i].cpp+stu[i].math+stu[i].english;
        ++stuNum;
        ++i;
    }
    infile.close();
    void Outputscore(Student s[],int num);
    void sort(Student s[],int num);
    void outputExcellent(Student s[],int num);
    void outputCfail(Student s[],int num);
    void outputallfail(Student s[],int num);
    do
    {
        cout<<"请选择下面的功能:"<<endl;
        cout<<"1. 输出成绩单"<<endl;
        cout<<"2. 按总分排序并输出成绩单"<<endl;
        cout<<"3. 输出获得奖学金的同学的名单"<<endl;
        cout<<"4. 输出C++不及格同学姓名和C++成绩"<<endl;
        cout<<"5. 输出三科都不及格同学的成绩单"<<endl;
        cout<<"0. 结束"<<endl;
        cout<<"请选择(0-5):";
        cin>>n;
        switch(n)
        {
        case 1:
            Outputscore(stu,stuNum);
            break;
        case 2:
            sort(stu,stuNum);
            Outputscore(stu,stuNum);
            break;
        case 3:
            outputExcellent(stu,stuNum);
            break;
        case 4:
            outputCfail(stu,stuNum);
            break;
        case 5:
            outputallfail(stu,stuNum);
            break;
        case 0:
            return 0;
        }
        cout<<endl;
    }
    while (1);
}

void Outputscore(Student s[],int num)
{
    int i;
    for (i=0; i<num; ++i)
    {
        cout<<s[i].num<<"\t"<<s[i].name<<"\t"<<s[i].cpp<<"\t"<<s[i].math<<"\t"<<s[i].english<<"\t"<<s[i].grade<<endl;
    }
    cout<<endl;
}

void sort(Student s[],int num)
{
    Student t;
    int i,j;
    for (j=0; j<=num-1; ++j)
    {
        for (i=0; i<num-1-j; ++i)
        {
            if (s[i].grade<s[i+1].grade)
            {
                t=s[i];
                s[i]=s[i+1];
                s[i+1]=t;
            }
        }
    }
}

void outputExcellent(Student s[],int num)
{
    int i;
    for(i=0; i<30; ++i)
    {
        if((s[i].cpp>=60)&&(s[i].math>=60)&&(s[i].english>=60))
        {
            cout<<s[i].num<<'\t'<<s[i].name<<'\t'<<s[i].grade<<endl;
        }
    }
    for(i=30; i<num; ++i)
    {
        if(s[i].grade==s[29].grade)
            cout<<s[i].num<<'\t'<<s[i].name<<'\t'<<s[i].grade<<endl;
    }
}

void outputCfail(Student s[],int num)
{
    int i;
    for (i=0; i<num; ++i)
    {
        if (s[i].cpp<60)
            cout<<s[i].num<<"\t"<<s[i].name<<"\t"<<s[i].cpp<<endl;
    }
}

void outputallfail(Student s[],int num)
{
    int i;
    for (i=0; i<num; ++i)
    {
        if((s[i].cpp<60)&&(s[i].math<60)&&(s[i].english<60))
            cout<<s[i].num<<"\t"<<s[i].name<<"\t"<<s[i].cpp<<"\t"<<s[i].math<<"\t"<<s[i].english<<"\t"<<s[i].grade<<endl;
        else
            cout<<"恭喜你没有全挂!!!还有希望,好好加油!!"<<endl;
    }
}


运行结果:











学习心得:

在前面的基础上改的,突然有了疑问,在第5种输出的时候,怎么让它只输出一次(除了设置变量记录满足if中的要求的次数,然后用是否为0判断再输出那句话的方法外)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐