大家好,我是19级的地大学生符同学。这是我的代码,分享出来希望能帮助到那些家里条件不支持能够安心坐在电脑前敲代码,以及对这门课不感冒的同学,但希望你还是拿出点时间学习,敲代码还是挺有趣的,当然最最最重要的是相互交流学习。(虽然这个大作业算不上太难)
以后还会继续发表一些关于地大C++程序设计实习指导书上的代码。能点赞的点赞鸭。ps.可能会有一些瑕疵,但目前为止调试中还没遇到,如果发现bug可以反馈给我。
2020.6.6.23:42二次编辑,考虑不周,修改了下,能看到消息的就重新复制新的代码,没看到的,问题也不大,反正都是90多。
ps.我会在暑假把程序再完善下,有些代码不是按照实习书上写的(代码不一样,但功能是一样的,有些人看不懂,说没写完……),有些地方用的C语言。实习指导书上的题目源代码我也会用老师教的语法来写,拓展题我也会写在博客上。
#include
#include
#include
#include
#include //函数头里有些是多余的...看到网上的学生成绩管理系统有,我也复制了上去,怕差了点什么运行不了
using namespace std;
const int MAX_STUDENT_NUM=5;
class Student//类类类类类类,Giao~
{
public:
void inputId();
void inputName();
void inputRegularGrade();
void inputFinalExam();
int getId();
float get1();
float get2();
static void heading();//输出成绩标题
void output(); //输出成绩信息
float CalTotalMark(); //计算总评成绩=平时*50%+期末*50%
private:
int id; //学号
char name[20]; //姓名
float regularGrade; //平时成绩
float finalExam; //期末考试成绩
};
//类的函数,阿西吧
void Student::inputId()
{ cin>>id; }
void Student::inputName()
{ cin>>name; }
void Student::inputRegularGrade()
{ cin>>regularGrade; }
int Student::getId()
{ return id; }
void Student::inputFinalExam()
{ cin>>finalExam; }
float Student::get1()
{ return regularGrade;}
float Student::get2()
{ return finalExam; }
void Student::heading()//常态?在声明时无需再添加 static
{
cout<<setw(12)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"平时"<<setw(12)<<"期末"<<endl;
}
void Student::output()
{
double a=regularGrade,b=finalExam;
cout<<setw(12)<<id<<setw(12)<<name;printf("%12.1lf%12.1lf\n",a,b);//这里弄了半天,还好学了C语言, setprecision不好用 ,一直失败,没能保存一位小数
}
float Student::CalTotalMark()
{
return regularGrade*0.5+finalExam*0.5;
}
void Input(Student stu[],int &num);//自定义输入函数
void Output(Student stu[],int num);//自定义输出函数
void Statis(Student stu[],int num);//自定义统计函数
void Order(Student stu[],int num);//自定义排序函数
void Search(Student stu[],int num);//自定义查找函数
void Delete(Student stu[],int &num);//自定义删除函数
void c();//引入一个显示系统界面的函数
int Open_File(Student*stu);
void Save_File(Student* stu,int n);
//眼花缭乱
int main()
{
int currentN;
int &num=currentN;
Student *stu;
stu=new Student[MAX_STUDENT_NUM];
num=Open_File(stu);//读取文件
c();//按照要求显示第一次的系统界面
for(int i=1;i!=0;i++)//引入主程序
{
cout<<"请选择:";
int a;
cin>>a;
if(a==0)break;//如果选择0,退出了系统,后面的switch语句不再运行 ,也不再显示界面
switch(a){
case 1:Input(stu,num);break;//实际上插入和录入啥区别。。。。
case 2:Output(stu,currentN);break;//输出学号,名字,成绩
case 3:Order(stu,currentN);break;//排序总评
case 4:Search(stu,currentN);break;//查找
case 5:Input(stu,num);break;//插入
case 6:Delete(stu,num);break;//删除学生信息
case 7:Statis(stu,currentN);break;//统计
default:printf("输入非法,请重新输入!\n");break;
}
c();//因为每次结束选择后,要显示界面,所以将函数放在这里
}
Save_File(stu,num);//保存数据
delete[] stu;//堆数据删除
return 0;
}
void Input(Student stu[],int &num)//自定义输入函数 ,比较麻烦的地方就是这了,其他的自定义函数改动下就可以了,这里花了很多时间
{
int i=num;char ch;int panduanchongfu;
for(i;i<MAX_STUDENT_NUM;i++)
{
printf("请输入学号(1-40之间): ");
stu[i].inputId();
for(int sq=1;;sq++)//判断学号是否超出范围 且是否重复
{
panduanchongfu=1; //这里个人觉得比较好的地方,当然也可以另外写一个函数,判断是否重复
if(stu[i].getId()>40||stu[i].getId()<0)
{
cout<<"输入错误,学号应该在0到40之间!\n";
cout<<"请输入学号(1-40之间): ";
stu[i].inputId();
}
for(int sw=0;sw<num;sw++)//判断学号是否重复
{
if(stu[i].getId()==stu[sw].getId())
{
panduanchongfu=0;
}
}
if(panduanchongfu==0)
{
cout<<"学号不允许重复,该学号已经存在!\n";
cout<<"请输入学号(1-40之间): ";
stu[i].inputId();
}
if(stu[i].getId()>=1&&stu[i].getId()<=40&&panduanchongfu) break;
}
cout<<"请输入姓名:";
stu[i].inputName();
cout<<"请输入平时成绩:";
stu[i].inputRegularGrade();
for(int cjg=1;;cjg++)
{
if(stu[i].get1()>100||stu[i].get1()<0)
{
cout<<"输入错误,成绩应该在0到100之间!\n";
cout<<"请输入成绩(0~100): ";
stu[i].inputRegularGrade();
}
if(stu[i].get1()>=0&&stu[i].get1()<=100) break;
}
cout<<"请输入期末考试成绩:";
stu[i].inputFinalExam();
for(int fyzd=1;;fyzd++)
{
if(stu[i].get2()>100||stu[i].get2()<0)
{
cout<<"输入错误,成绩应该在0到100之间!\n";
cout<<"请输入成绩(0~100): ";
stu[i].inputFinalExam();
}
if(stu[i].get2()>=0&&stu[i].get2()<=100) break;
}
num++;
cout<<"继续输入学生成绩请按y或Y: ";
cin>>ch;
if(ch!='y'&&ch!='Y') break; //刚开始写成了if(ch!='y'||ch!='Y') break;,不能正确判断……
}
if(num==MAX_STUDENT_NUM)cout<<"人数已达到5人上限,无法再输入!\n";
}
void Output(Student stu[],int num)//自定义输出函数
{
int i;
stu[0].heading();
for(i=0;i<num;i++)
{
stu[i].output();
}
}
void Statis(Student stu[],int num)//自定义统计函数 ,没什么好解释的了,很简单~
{
int a,b,c,d,e;int i;
a=b=c=d=e=0;
for(i=0;i<num;i++) {
if(stu[i].CalTotalMark()>=90&&stu[i].CalTotalMark()<=100) a++;
else if(stu[i].CalTotalMark()>=80&&stu[i].CalTotalMark()<90) b++;
else if(stu[i].CalTotalMark()>=70&&stu[i].CalTotalMark()<80) c++;
else if(stu[i].CalTotalMark()>=60&&stu[i].CalTotalMark()<70) d++;
else if(stu[i].CalTotalMark()>=0&&stu[i].CalTotalMark()<60) e++;
}
printf("100~90 89~80 79~70 69~60 <60\n");
printf(" %d %d %d %d %d\n",a,b,c,d,e);
}
void Order(Student stu[],int num)//自定义排序函数 ,排序在前面的基础上改动的地方也很少,我选择的是选择排序法
{
int f,y,love;
for(f=0;f<num-1;f++)
{
love=f;
for(y=f;y<num;y++)
{
if(stu[love].CalTotalMark()<stu[y].CalTotalMark()) love=y;
}
if(love!=f){ Student hezi=stu[f]; stu[f]=stu[love]; stu[love]=hezi; }
}
stu[0].heading();
for(int fy=0;fy<num;fy++)
{
stu[fy].output();
}
}
void Search(Student stu[],int num)//自定义查找函数
{
int i;char ch;int count;int h;
float chazhaoshu;
for(i=1;;i++)
{
count=0;
printf("请输入您要查找的学号: ");
cin>>chazhaoshu;
for(h=0;h<num;h++)
{
if(stu[h].getId()==chazhaoshu){
stu[h].heading();stu[h].output();
count++;
}
}
if(count==0) cout<<"没有该学生信息!\n";
cout<<"继续查找请按y或Y,停止查找请按其他字符: ";
cin>>ch;
if(ch=='y'||ch=='Y') continue;
else break;
}
}
void Delete(Student stu[],int &num)//自定义删除函数 ,这里也有点意思,覆盖了被删除的,虽然最后面的对象没删除,但num=num-count解决这个问题
{
int f,y,count;float fy; char ch;
for(int i=1;;i++)
{
count=0;
cout<<"请输入要删除学生的学号:";
cin>>fy;
for(f=0;f<num;f++) //删除的主步骤
{
if(stu[f].getId()==fy)
{
for(y=f;y<num-1;y++)
{
stu[y]=stu[y+1];
}
count++;
num--;
}
}
if(count!=0) cout<<fy<<"号学生信息删除成功!\n";
else cout<<"没有该学生!\n";
cout<<"继续删除其他学生请按y或Y,停止删除其他学生请按其他字符: ";
cin>>ch;
if(ch=='y'||ch=='Y') continue; //看到这里知道了前面录入的时候跳出为什么失败了,忘记加 else break了
else break;
}
}
void c()//函数定义,主界面的函数
{
cout<<" ==========================================\n";
cout<<" = 欢迎使用成绩管理系统 =\n";
cout<<" = 1=录入学生 2=显示信息 =\n";
cout<<" = 3=排序总评 4=查找学生 =\n";
cout<<" = 5=插入学生 6=删除学生 =\n";
cout<<" = 7=统计人数 0=退出系统 =\n";
cout<<" ==========================================\n";
}
//文件部分
/*保存文件*/
void Save_File(Student* stu,int n)//读写文件……
{
ofstream fileout("students.dat",ios::binary);
if(!fileout)//文件打开失败 则直接返回
{
cout<<"文件不能被打开!"<<endl;
return ;
}
for(int i=0;i<n;i++)
{
fileout.write((char*)&stu[i],sizeof(Student));
}//打开成功则 循环写入数组信息
fileout.close();
}
/*打开文件*/
int Open_File(Student *stu)
{
int i=0;
ifstream filein("students.dat",ios::binary);
while(filein)//如果文件没有到结尾 循环读取到数组
{
filein.read((char*)&stu[i],sizeof(Student));
i++;
}
if(i>=1)
{
return i-1;//文件结尾会读取到一行乱码 减去这一行
}
return 0;
}