首页 > 其他分享 >第一周实验

第一周实验

时间:2024-03-07 10:35:56浏览次数:20  
标签:case cout 第一周 void next score 实验 student

简介:我在博客园中找到了前人制作的一份小程序,学生成绩管理系统。
(1)来源https://www.cnblogs.com/esperanza/p/8056952.html

(2)运行环境:DEV C++
源代码如下:

点击查看代码 #include #include #include using namespace std;

int num; //总学生人数

class student {
friend class studentMessage;
private:
string ID;
string name;
double score[5]; //1-4代表math、English、OPP和总成绩 ,0号单元空出
student * next;
public:
student();
string getName(){return name;}
string getID(){return ID;}
double getMath(){return score[1];}
double getEnglesh(){return score[2];}
double getOPP(){return score[3];}
double gettotol(){return score[4];}
student* getNext(){return next;}

static void analyse(int ,student * ); //分析成绩
void display();                          //打印成绩
void swap();                          //交换对象和对象->next的信息

};

student::student()
{
cout<<"请输入学生学号 : ";cin>>ID;
cout<<"请输入学生姓名 : ";cin>>name;
cout<<"请输入学生的数学、英语和OPP成绩 : "<<endl;
int a,b,c;
cin>>a;
while(a<0||a>100)
{
cout<<"输入成绩有误,请重新输入: "<<endl;
cin>>a;
}
cin>>b;
while(b<0||b>100)
{
cout<<"输入成绩有误,请重新输入: "<<endl;
cin>>b;
}
cin>>c;
while(c<0||c>100)
{
cout<<"输入成绩有误,请重新输入: "<<endl;
cin>>c;
}
score[1]=a;
score[2]=b;
score[3]=c;
score[4]=a+b+c;
next=NULL;
}

void student::analyse(int a,student * first)
{
int you=0,liang=0,zhong=0,jige=0,bujige=0;
student * t=first;
double average=0; //平均分
while(t)
{
int b = int(t->score[a]/10);
switch(b)
{
case 10:
case 9:you++;break;
case 8:liang++;break;
case 7:zhong++;break;
case 6:jige++;break;
default:bujige++;
}
average+=t->score[a];
t=t->next;
}
average=average/num;
cout<<" 考生总人数 : "<<num<<" 平均分 : "<<average<<endl;
cout<<"\n 优 良 中 及格 不及格 "<<endl;
cout<<" "<<you<<" \t"<<liang<<" \t"<<zhong<<"\t"<<jige<<"\t"<<bujige<<endl;
}

void student::display()
{
cout<<" "<<setw(3)<<ID<<" "<<setw(3)<<name<<" ";
for (int i=1;i<=4;i++)
{
cout<<setw(3)<<score[i]<<" ";
}
cout<<endl;
}

void student::swap()
{
int j;
string na,id;
double sco[5];
na=name;name=next->name;next->name=na;
id=ID;ID=next->ID;next->ID=id;
for(j=1;j<=4;j++)
{
sco[j]=score[j];
score[j]=next->score[j];
next->score[j]=sco[j];
}
}

class studentMessage{
private:
student * first;
student * last;
public:
studentMessage();
student* getFirst(){return first;}
student* getLast(){return last;}
int getNum(){return num;}
void add(); //向表中增加学生成绩记录
void search(); //在表中查找学生成绩记录
void del(); //在表中删除学生成绩记录
void showOne(); //分析一门课的成绩
void showAll(); //输出所有同学所有科目的成绩
void sort(); //按一门课成绩或总成绩排序
void clear(); //清空所有信息并退出系统

};

studentMessage::studentMessage()
{
first=NULL;
last=NULL;
num=0;
}

void studentMessage::add()
{
student * t =new student;
student *p = first;
while(p){
if(p->IDt->ID)
{
cout<<"\n学号输入错误或该学生成绩已经存在!(如需修改,请先删除再重新录入)"<<endl;
return;
}
p=p->next;
}
num++;
if(first
NULL)
{
first=last=t;

}
else
{
    last->next=t;
    last=last->next;
}

}

void studentMessage::search()
{
string a;
cout<<"\n请输入要查找的学生的学号:";cin>>a;
student *t = first;
while(t){
if(t->ID==a)
break;
t=t->next;
}
if(!t)
{
cout<<"\n未找到要查找学生!"<<endl;
return;
}
cout<<"\n查找成功!"<<endl;
cout << " 学号 姓名 数学 英语 OPP 总成绩" << endl;
t->display();
}

void studentMessage::del()
{
string a;
cout<<"\n请输入要删除的学生的学号: ";cin>>a;
student *t = first;
student *p=NULL;
while(t){
if(t->ID==a)
break;
p=t;
t=t->next;
}
if(!t)
{
cout<<"\n未找到要删除学生!"<<endl;
return;
}
if(!p)
{
first=first->next;
cout<<"\n成功删除学生"<<a<<endl;
delete t;
}
else
{
p->next=t->next;
cout<<"成功删除学生"<<a<<endl;
delete t;
}

num--;

}

void studentMessage::showOne()
{
int a;
while(1)
{
cout<<"\n想要分析哪一门成绩?请输入相应序号(1:math 2:English 3:OPP): ";cin>>a;
if(a!=1&&a!=2&&a!=3)
cout<<"\n输入序号有误,请重新输入!"<<endl;
else
break;
}
cout<<"\n\t成绩分析如下: \n"<<endl;
student::analyse(a,first);
}

void studentMessage::showAll()
{
cout << "---------------------成绩列表----------------------"<< endl;
cout << " 学号 姓名 数学 英语 OPP 总成绩" << endl;
student *t = first;
while(t){
t->display();
t=t->next;
}
}

void studentMessage::sort()
{
int a,n=0; //n--排名
cout<<"想要按照什么成绩排序?请输入相应序号(1.数学 2.英语 3.OPP 4.总成绩): ";
while(1)
{
cin>>a;
if (a!=1&&a!=2&&a!=3&&a!=4)
cout<<"\n输入序号有误,请重新输入 : ";
else
break;
}
student *t=first;
student *p=t;
while(p->next)
{
t=first;
while(t->next)
{
if(t->next->score[a]>=t->score[a])
{
t->swap();
}
t=t->next;
}
p=p->next;
}
t = first;
cout<<"\n\t 成绩表如下: "<<endl;
cout<<"学号 姓名 成绩 排名"<<endl;
while(t){
n++;
cout<<" "<getID()<<" \t"<getName()<<" \t";
switch(a)
{
case 1 :cout<getMath()<<" \t"<<n<<endl;break;
case 2 :cout<getEnglesh()<<" \t"<<n<<endl;break;
case 3 :cout<getOPP()<<" \t"<<n<<endl;break;
case 4 :cout<gettotol()<<" \t"<<n<<endl;break;
}
t=t->next;
}
}

void studentMessage::clear()
{
int x;
cout<<"确认要清空所有信息?请输入1或2 (1:确认 2:取消) : ";cin>>x;
if (x==2)
{
cout<<"\n取消清空\n"<<endl;
return;
}
student *t = first;
student *p;
while(t){
p=t;
t=t->next;
delete p;
}
cout<<"\n清空成功!\n";
cout<<"退出成功!\n";
}

void showMenu()
{
cout << " \n";
cout << "=\n";
cout << " 学生成绩管理系统\n\n";
cout << " 1.显示所有学生成绩\n";
cout << " 2.添加信息\n";
cout << " 3.查询信息\n";
cout << " 4.删除信息\n";
cout << " 5.成绩排序\n";
cout << " 6.单科成绩分析\n";
cout << " 7.清空所有信息并退出系统\n";
cout << " 0.退出系统\n";
cout << "
=\n";
cout << " \n";
}

int main()
{
int h;
studentMessage stuM=studentMessage();
while(1)
{
showMenu();
cout << "请输入操作对应的序号 : ";
cin >>h;
cout<<endl;
switch(h)
{
case 1: stuM.showAll(); break;
case 2: stuM.add(); break;
case 3: stuM.search(); break;
case 4: stuM.del(); break;
case 5: stuM.sort(); break;
case 6: stuM.showOne(); break;
case 7: stuM.clear(); return 0;
case 0: cout<<"\n退出成功!";return 0;
default:cout<<"\n输入序号有误!请输入正确的序号。"<<endl;
}
}
}

运行截图:

(3)主要问题
1:没有清屏和暂停功能,窗口太繁杂

2:部分函数比较麻烦,效率不高,且注释不清楚

3:该系统没有文件读写功能,每次打开系统都要重新录入数据

(4)新代码如下
问题1:

点击查看代码
 system("pause");
    system("cls");

问题2:

点击查看代码

void student::analyse(int a, student *first) {
int you = 0, liang = 0, zhong = 0, jige = 0, bujige = 0;
double totalScore = 0.0; // 总分
student *t = first;

while (t) {
    int b = t->score[a] / 10;

    switch (b) {
        case 10:
        case 9:
            you++;
            break;
        case 8:
            liang++;
            break;
        case 7:
            zhong++;
            break;
        case 6:
            jige++;
            break;
        default:
            bujige++;
    }

    totalScore += t->score[a];
    t = t->next;
}

double average = totalScore / num;
cout << " 考生总人数 : " << num << "        平均分 : " << average << endl;
cout << "\n 优     良      中     及格    不及格  " << endl;
cout << " " << you << " \t" << liang << " \t" << zhong << "\t" << jige << "\t" << bujige << endl;

}

修改部分中,将变量 average 的计算放在循环外部,避免每次循环都重新计算。 将 totalScore 用于计算平均分,避免多次循环中的重复累加。 对代码进行了一些格式化和注释,以提高可读性。

问题3:

点击查看代码
 // 写入文件
    ofstream outfile("student_data.txt", ios::app); // 打开文件
    if (outfile.is_open()) {
        outfile << t->ID << " ";
        for (int i = 0; i < 10; ++i) {
            outfile << t->score[i] << " ";
        }
        outfile << endl;
        outfile.close(); // 关闭文件
    } else {
        cout << "无法打开文件!" << endl;
    }

    system("pause");
    system("cls");
}

(5)修改后程序运行截图

(6)总结
相对来说,这是一个小项目,存在着或多或少的问题,代码比较简洁,我尽力在源代码中寻找可以修改精进的部分,比较麻烦的地方是在文件读写部分中,文件读写是在大一时学习的,对部分知识有些遗忘,不过这次实验,可以让我回顾关于这方面的知识,对文件读写部分掌握更深了。在我看来,在开发软件时,一定要进行软件工程方面的思考,做好需求分析,明确软件的具体目标,定制计划,不能盲目的去进行软件的开发,以免对之后的繁琐修改。

标签:case,cout,第一周,void,next,score,实验,student
From: https://www.cnblogs.com/cyl2004/p/18057377

相关文章

  • 第一周-软件二次开发
    项目来源本次作业的项目来源于本人在GitHub上面找到的一个简单的酒店管理系统。运行环境Python3.10.7运行结果基础页面图功能样例图查询样例图主要问题程序的主要问题有:不做任何交互也会导致程序退出交互时不清屏,造成查看结果困难录入酒店信息的数据验证出现问......
  • 第一周实验
    <1>来源:简易的C语言图书管理系统<2>运行环境:点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>structLIB{ charbId[10];//书号 charbName[20];//书名 charaName[20];//作者 charpName[20];//出版社 charsort[20];//分类 floatbPri......
  • 第一次实验
    l来源同学的大作业内容2运行环境与运行结果VS20233改善点没有修改联系人的选项无法清空联系人,只能一个一个删除无法对联系人排序4新代码voidallClean(Addressbooks*abs){cout<<"您确定是要执行本操作吗?"<<endl;cout<<"1---是"<<endl;cout<<"2---......
  • 第一次实验
    1.来源https://blog.csdn.net/m0_51269961/article/details/1181003422.运行环境VisualStudio2022C++运行截图代码3.主要问题管理系统没有设置使用人员的区别改进:设置了学生与管理员分别的登录密码,并对学生进入的界面进行改变4.改进的代码5.软件测试截图......
  • 第一周实验
    这个项目来自于网络下载。运行环境是devc++,之前的代码是:#includeusingnamespacestd;intmain(){charop;floatnum1,num2;cout<<"Enteroperator(+,-,*,/):";cin>>op;cout<<"Entertwonumbers:";cin>>num1>>nu......
  • 制取氧气实验
    实验目的:制取氧气。实验原理:双氧水会在二氧化锰的催化下快速反应成氧气。准备工作:准备好自制纸槽、胶头滴管、\(3\%\)浓度双氧水、二氧化锰、火柴。实验步骤:1.利用自制纸槽在试管中加入\(0.5\)g二氧化锰。2.利用胶头滴管加入\(1\sim2\)mL双氧水。3.观察到试管中有大......
  • ssh 端口转发实验
    为什么会使用端口转发端口转发的优点:安全性:通过隐藏实际服务(在这种情况下是监听在22端口的SSH服务)的真实端口号,增加了一层安全性。攻击者可能不知道真正的服务端口号,因此更难进行有针对性的攻击。灵活性:允许用户在不更改实际服务配置的情况下,通过不同的端口访问服务。例如,如果......
  • 软件开发与创新第一周实验——关于“打怪小游戏”的试玩体验与修改
    一.“打怪小游戏”代码来源http://blog.csdn.net/zjx120307/article/details/126221342?spm=1001.2014.3001.5506二.运行环境及运行结果1.运行环境:Windows11操作系统,C++运行环境2.运行截图:(1)功能6演示(2)功能1演示(3)功能2演示(4)功能3演示(5)功能4演示原代码:点击查看代......
  • 全网通实验
    实验一:两个网段连通配置目标:通过在路由器上配置静态路由,实现PC1能ping通PC2(即10.1.0.0/24和10.5.0.0/24网段能通)实验分析:要想实现10.1.0.0/24和10.5.0.0/24网段能通,就是中间涉及到的三层设备R1R2R3R4都有到这两个网段(10.1.0.0/24、10.5.0.0/24)的正确路由。配置步骤:连线配置PC的......
  • DHCP实验
    实验:PC通过DHCP动态获得IP地址配置目标:R1做DHCPserver,PC做DHCPclient,PC的IP地址、子网掩码、默认网关、dns服务器地址都通过DHCP动态分配。配置步骤:连线,配置R1的IP地址配置DHCP服务器R1:dhcpserverip-pool1//创建地址池gateway-list192.168.1.254//网关network192.168.1......