专业任选课“面向对象程序设计”期末作业1——成绩统计

等女友一起吃晚饭,等了半天都没等到,程序乱七八糟了写了一部分,先贴上来去五餐吃“夜宵”,吃完才有力气继续写大笑

专业任选课“面向对象程序设计”期末作业:

1.成绩统计:

功能设计:

(1)录入学生学号、姓名、各科成绩;

(2)对已录入成绩的浏览、根据学号查询成绩、删除数据;

(3)对已录入的成绩按学号(默认)、指定科目的成绩、总成绩排名;

(4))对已录入的成绩统计分析;

程序代码:

/**
 * Student Performance Manage System
 *
 * @Author Jin Weiqing <jinmmd@gmail.com>
 * @Version 2011-11-23 19:31:13 Mumu.
 */
#include <iostream>//包含标准输入输出函数
#include <cstdlib>//包含数字文本互相转换及各种工具函数
#include <string>//包含字符串处理函数,string::getline
#include <fstream>//包含磁盘文件读写相关的函数
//#include <sstream>
#include <iomanip>//包含能格式化数据流的流操纵算子的函数
using namespace std;
//声明结构体类型
struct Student
{
    int id;
    string name;
    float score[3];
    float sum;
};
//声明函数
void Insert(Student *S);
//void Update(Student *S);
void Delete(Student *S, int pid);
int Search(Student *S, int pid);
void Find(Student *S, int pid);
void Clear(Student *S);
void View(Student *S);
void Load(Student *S);
void Save(Student *S);
void Statistic(Student *S);
void Rank(Student *S, char item);
void Exit(Student *S);
void ShowMenu();
void ShowTip();
void DoMenu(Student *S, char num);
//定义全局变量
int studentnum=0;
bool flag=true;
//声明MAXNUM为符号变量并初始化
const int MAXNUM=60;

void main()
{
    Student stu[MAXNUM];//定义保存学生数据的数组
    Load(stu);//载入学生成绩数据
    char ch;
    ShowMenu();
    cout<<"Select the corresponding number to operate:";
    while(1)
    {
        cin>>ch;
        system("cls");
        ShowMenu();
        DoMenu(stu, ch);
        ShowTip();
    }
}

int Search(Student *S, int pid)
{
    int i;
    for(i=1; i<=studentnum; i++)
        if(S[i].id == pid)
            return i;
    return 0;
}

void Insert(Student *S)//学生成绩数据录入
{
    Student t;
    cout<<"Student ID is an integer, enter 0 to terminate."<<endl;
    while(1)//循环录入,输入0结束
    {
		//输入前检测数据
        if(studentnum >= MAXNUM-1)//人数是否超过设置的最大人数
        {
            cout<<"Has reached the maximum number of students."<<endl;
            return;
        }
        cout<<"Please enter the student number(enter 0 to terminate):";
        if(!(cin>>t.id))
        {
            cout<<"Student ID is an integer, Please enter the student number:"<<endl;
            cin.clear();//清除状态标志,重置为0
            cin.sync();//清空输入缓冲区
            continue;
        }
        if(Search(S, t.id)>0)//查看是否已经存在该学号
        {
            cout<<"The Student ID already exists."<<endl;
            continue;
        }
        if(t.id == 0)//输入为0时结束录入
        {
            cout<<"Completed entry."<<endl;
            return;
        }
        cin.sync();
        cout<<"Please enter the student Name:";		
        getline(cin, t.name);//读取一行,string::getline
		//将输入流is中读到的字符存入t.name中,直到遇到终结符delim结束
		//函数终结符delim默认为 '\n'

        while(t.name == "")//检测输入的姓名是否为空
        {
            cin.sync();
            cout<<"Student Name can not be empty, please enter the student Name:"<<endl;
            getline(cin, t.name);
        }
        cout<<"Please enter the results of three subjects."<<endl;
        cin>>t.score[0]>>t.score[1]>>t.score[2];
        t.sum=t.score[0]+t.score[1]+t.score[2];
		//cout<<t.sum;
        ++studentnum;
        S[studentnum]=t;//将新录入的学生成绩数据加入数组中
        flag=true;//数据已改变
    }
}

void Delete(Student *S)//删除指定学号的学生成绩数据
{
    if(studentnum == 0)
    {
        cout<<"There is no student."<<endl;
        return;
    }
    else
    {
        int n,r=0;
        char q;
        cout<<"Please enter the number of the student who need to be removed.";
        cin>>n;
        r=Search(S, n);
        if(r == 0)
        {
            cout<<"Can not find the student who need to be removed.";
            return;
        }
        else
        {
            cout<<"Confirm to delete: y/n?";
            cin>>q;
            if(q == 'y' || q == 'Y')
            {
                for(int i=r; i<studentnum; i++)//删除学生成绩数据并将后面的数据向前覆盖
                    S[i]=S[i+1];
                --studentnum;//同时减少学生总数
                flag=true;
                cout<<"Successfully removed the student which Student ID is: "<<n<<endl;
            }
            else
                return;
        }
    }
}


void Clear(Student *S)//将学生总数重置为0
{
	studentnum=0;
}


void Find(Student *S)//查找并显示指定学号的学生成绩数据
{
    if(studentnum == 0)
    {
        cout<<"There is no student."<<endl;
        return;
    }
    else
    {
        int n,i;
        cout<<"Please enter the number of the student who need to be found."<<endl;
        cin>>n;
        i=Search(S, n);
        if(i == 0)
            cout<<"Can not find the student."<<endl;
        else
        {
            cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 1"<<setw(6)<<"Subject 2"<<setw(6)<<"Subject 3"<<endl;
            cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[0]<<setw(6)<<S[i].score[1]<<setw(6)<<S[i].score[2]<<endl;
        }
    }
}

void View(Student *S)//查看所有学生成绩信息
{
    if(studentnum == 0)
    {
        cout<<"There is no student."<<endl;
        return;
    }
    else
    {
        char n,w;
        //float average;
        Student u;
        cout<<"There are a total of "<<studentnum<<" of student records"<<endl;
		//选择需要查询的信息类型
        cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
        cin>>n;
        while(n != 'n')
        {
			cin.sync();
            if(n == 's' || n == 'S')
            {
                Statistic(S);
				cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
				cin>>n;
            }
            else if(n == 'r' || n == 'R')
            {
                cout<<"View student rankings sort by: subject1/subject2/subject3/sum/back?"<<endl;
                cin>>w;
				if(w == 'b' || w == 'B')
				{
					cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
					cin>>n;
				}
                Rank(S, w);
				flag=true;
            }
            else
            {
                cin.sync();
                cout<<"View all subjects statistical results or student rankings: s/r/n?"<<endl;
                cin>>n;
            }
        }
        return;
    }
}

void Rank(Student *S, char item)//根据项目种类排序
{
    int i,j,k=1;
    Student r;
    switch(item)
    {
        case '1':
            for(j=1; j<=studentnum; j++)
                for(i=1; i<=studentnum-j; i++)
                    if(S[i].score[0] < S[i+1].score[0])
                    {
                        r=S[i];
                        S[i]=S[i+1];
                        S[i+1]=r;
                    }
            cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 1"<<setw(6)<<"Ranking"<<endl;
            for(i=1; i<=studentnum; i++)
            {
                if(S[i].score[0] > S[i+1].score[0])
                    k=i;
                cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[0]<<setw(6)<<k<<endl;
            }
            break;
        case '2':
            for(j=1; j<=studentnum; j++)
                for(i=1; i<=studentnum-j; i++)
                    if(S[i].score[1] < S[i+1].score[1])
                    {
                        r=S[i];
                        S[i]=S[i+1];
                        S[i+1]=r;
                    }
            cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 2"<<setw(6)<<"Ranking"<<endl;
            for(i=1; i<=studentnum; i++)
            {
                if(S[i].score[1] > S[i+1].score[1])
                    k=i;
                cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[1]<<setw(6)<<k<<endl;
            }
            break;
        case '3':
            for(j=1; j<=studentnum; j++)
                for(i=1; i<=studentnum-j; i++)
                    if(S[i].score[2] < S[i+1].score[2])
                    {
                        r=S[i];
                        S[i]=S[i+1];
                        S[i+1]=r;
                    }
            cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 3"<<setw(6)<<"Ranking"<<endl;
            for(i=1; i<=studentnum; i++)
            {
                if(S[i].score[2] > S[i+1].score[2])
                    k=i;
                cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[2]<<setw(6)<<k<<endl;
            }
            break;
        case 's':
            for(j=1; j<=studentnum; j++)
                for(i=1; i<=studentnum-j; i++)
                    if(S[i].sum < S[i+1].sum)
                    {
                        r=S[i];
                        S[i]=S[i+1];
                        S[i+1]=r;
                    }
            cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Total Score"<<setw(6)<<"Ranking"<<endl;
            for(i=1; i<=studentnum; i++)
            {
                if(S[i].sum > S[i+1].sum)
                    k=i;
                cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].sum<<setw(6)<<k<<endl;
            }
            break;
        case 'i':
            for(j=1; j<=studentnum; j++)
                for(i=1; i<=studentnum-j; i++)
                    if(S[i].id > S[i+1].id)
                    {
                        r=S[i];
                        S[i]=S[i+1];
                        S[i+1]=r;
                    }
            cout<<setw(6)<<"Student ID"<<setw(10)<<"Name"<<setw(6)<<"Subject 1"<<setw(6)<<"Subject 2"<<setw(6)<<"Subject 3"<<setw(6)<<"Total Score"<<endl;
            for(i=1; i<=studentnum; i++)
            {
                cout<<setw(6)<<S[i].id<<setw(10)<<S[i].name<<setw(6)<<S[i].score[0]<<setw(6)<<S[i].score[1]<<setw(6)<<S[i].score[2]<<setw(6)<<S[i].sum<<endl;
            }
			break;
    }
}

void Load(Student *S)//从文件载入学生成绩数据
{
    int i;
    Student t;
    ifstream infile("data.txt");//创建文件输入流,文件相对位置在同一目录下
    if(!infile)
    {
        cerr<<"Error:File can not open.\n";
		exit(1);
    }
    else
    {
        for(i=1; infile>>S[i].id; i++)
        {
            infile>>S[i].name>>S[i].score[0]>>S[i].score[1]>>S[i].score[2]>>S[i].sum;
			//cout<<S[i].name<<S[i].score[0]<<S[i].score[1]<<S[i].score[2]<<S[i].sum<<endl;
            ++studentnum;
        }
    }
    flag=false;
    infile.close();
}

void Save(Student *S)//保存学生成绩数据到文件
{
    int i;
    ofstream outfile("data.txt");
    if(!outfile)
    {
        cerr<<"Error:File can not open.\n";
    }
    else
    {
        for(i=1; i<=studentnum; i++)
        {
            outfile<<S[i].id<<' '<<S[i].name<<' '<<S[i].score[0]<<' '<<S[i].score[1]<<' '<<S[i].score[2]<<' '<<S[i].sum<<endl;
        }
        flag=false;
        cout<<"Successfully Saved."<<endl;
    }
    flag=false;
    outfile.close();
}

void Exit(Student *S)
{
    char s;
    if(flag)//检测数据是否改变
    {
        cout<<"Data has been changed, whether to save: y/n?";
        cin>>s;
        if(s == 'y' || s == 'Y')
            Save(S);
    }
    cout<<"Successfully exit."<<endl;
    exit(0);
}

void ShowMenu()//显示功能菜单
{
    cout<<"|---------------------------------------------------|"<<endl;
    cout<<"|         Student Performance Manage System         |"<<endl;
    cout<<"|---------------------------------------------------|"<<endl;
    cout<<"|                     1.Clear                       |"<<endl;
    cout<<"|                     2.Insert                      |"<<endl;
    cout<<"|                     3.Delete                      |"<<endl;
    cout<<"|                     4.Find                        |"<<endl;
    cout<<"|                     5.View                        |"<<endl;
    cout<<"|                     6.Update                      |"<<endl;
    cout<<"|                     7.Save                        |"<<endl;
    cout<<"|                     0.Exit                        |"<<endl;
    cout<<"|---------------------------------------------------|"<<endl;
    return;
}

void ShowTip()//显示友好提示
{
    cout<<"|---------------------Finshed.----------------------|"<<endl;
    cout<<"|--------------Enter 0-7 to continue.---------------|"<<endl;
    cout<<"Enter number:"<<endl;
    return;
}

void DoMenu(Student *S, char num)//关联与菜单对应的功能函数
{
    switch(num)
    {
        case '1':
            Clear(S);
            //cout<<"Functions are under development."<<endl;
            break;
        case '2':
            Insert(S);
            break;
        case '3':
            Delete(S);
            break;
        case '4':
            Find(S);
            break;
        case '5':
            View(S);
            break;
        case '6':
            //Update(S);
            cout<<"Functions are under development."<<endl;
            break;
        case '7':
            Save(S);
            break;
        case '0':
            Exit(S);
            break;
        default:
            cout<<"Please enter a number between 0 to 7:"<<endl;
    }
}

/*
void Update(Student *S)
{
    
}
*/

void Statistic(Student *S)//对学生各科成绩数据统计分析
{
    //system("cls");
    //ShowMenu();
    cout<<setw(14)<<"Subject 1"<<setw(12)<<"Subject 2"<<setw(12)<<"Subject 3"<<endl;
    int i,j;
    float average[3]={0.0,0.0,0.0}, high[3]={0.0,0.0,0.0}, low[3]={0.0,0.0,0.0};
    int excellent[3]={0,0,0}, good[3]={0,0,0}, pass[3]={0,0,0};
	for(j=0; j<3; j++)
    {
		high[j]=S[1].score[j];
		low[j]=S[1].score[j];
    }
    for(i=1; i<=studentnum; i++)
    {
        for(j=0; j<3; j++)
        {
            average[j]=(S[i].score[j]+average[j])/studentnum;
            if(S[i].score[j] >= 90)
                excellent[j]++;
            else if(S[i].score[j] >= 75)
                good[j]++;
            else if(S[i].score[j] >= 60)
                pass[j]++;
			if(S[i].score[j] > high[j])
				high[j]=S[i].score[j];
			if(S[i].score[j] < low[j])
				low[j]=S[i].score[j];
        }
    }
    cout<<setw(8)<<"Excellent:"<<setw(7)<<excellent[0]<<setw(12)<<excellent[1]<<setw(12)<<excellent[2]<<endl;
    cout<<setw(8)<<"Good:"<<setw(12)<<good[0]<<setw(12)<<good[1]<<setw(12)<<good[2]<<endl;
    cout<<setw(8)<<"Pass:"<<setw(12)<<pass[0]<<setw(12)<<pass[1]<<setw(12)<<pass[2]<<endl;
    cout<<setw(8)<<"Fail:"<<setw(12)<<studentnum-pass[0]-good[0]-excellent[0]<<setw(12)<<studentnum-pass[1]-good[1]-excellent[1]<<setw(12)<<studentnum-pass[2]-good[2]-excellent[2]<<endl;
    cout<<setw(8)<<"Average:"<<setw(9)<<average[0]<<setw(12)<<average[1]<<setw(12)<<average[2]<<endl;
	cout<<setw(8)<<"Highest:"<<setw(9)<<high[0]<<setw(12)<<high[1]<<setw(12)<<high[2]<<endl;
	cout<<setw(8)<<"Lowest:"<<setw(10)<<low[0]<<setw(12)<<low[1]<<setw(12)<<low[2]<<endl;
	return;
}

加了点注释,方便回答老师的问题。

话说,其实参考了下百度文库:《C++课程设计报告 成绩管理》。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简要的需求分析: 已经提供的数据:   <1> 班级学生名单:学生的学号和姓名已经分别存储在以学生所在班级命名的文本文件中,每行存储一个学生的学号和姓名,中间用一个空格分隔。例如:2010级网络工程1班.txt文件中存放该班学生名单。内容为:   201030720102 陈纯   201030720103 陈娟娟   201030720104 陈伟健   201030720105 陈伊纯   ……   <2> 开设课程保存在名为:course.txt的文本文件中,每行存放一门课程的名称,如:   面向对象程序设计   操作系统   数据库系统      实现以下功能,所有功能以图形用户界面完成。   <1> 新建课程考试成绩单,功能描述如下: 程序界面显示已经开设的课程(从course.txt中读取),用户选择本次输入的课程。 用户选择为哪个班输入成绩(即选择相应班的名单文件)。如果该班的成绩已经输入(已经存在对应成绩单文件),则提示无需输入。 程序提供界面为该班的每个学生输入考试成绩。 输入的成绩单以对象文件格式存储到文件中,文件命名为:班级-课程名.dat。例如:2010级网络工程1班-面向对象程序设计.dat。   <2> 打开课程考试成绩单,功能描述如下: 用户选择打开的成绩单文件,程序打开并读取成绩单文件内容,并显示在界面中。   <3> 修改课程考试成绩单,功能描述如下: 打开某班某课程的成绩单后,可以选择修改其中某个或某几个考试成绩,并保存。   <4> 课程考试成绩分析,功能描述如下: 即打开某班某课程的成绩单后,点击成绩分析按钮或菜单,显示如下分析内容: 最高分:XX分,最低分:XX分,平均分:XX分 不及格(分数<60):XX人,占XX.XX% 及格(60<=分数<70):XX人,占XX.XX% 中等(70<=分数<80):XX人,占XX.XX% 良好(80<=分数<90):XX人,占XX.XX% 优秀(90<=分数<100):XX人,占XX.XX%   <5> 成绩图形分析,功能描述如下:    显示考试成绩分布的饼图和柱形图。 想用上饼状图和柱状图请看: http://www.open-open.com/lib/view/open1365997415828.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值