程序设计基础实训 成绩记录簿
题目要求:
C++代码如下:
//2018-2019学年第二学期 程序设计基础实训(C++)
//课程设计:成绩记录簿
/*预设student.dat:
【学号[10000001] 姓名[张三]】
课程编号[10001] 科目[语文] 成绩[88] 学分[4]
课程编号[10002] 科目[数学] 成绩[69] 学分[2]
课程编号[10003] 科目[英语] 成绩[50] 学分[1]
【学号[10000002] 姓名[李四]】
课程编号[10001] 科目[语文] 成绩[100] 学分[5]
课程编号[10002] 科目[数学] 成绩[40] 学分[1]
课程编号[10003] 科目[英语] 成绩[76] 学分[3]
【学号[10000003] 姓名[王五]】
课程编号[10001] 科目[语文] 成绩[77] 学分[3]
课程编号[10002] 科目[数学] 成绩[100] 学分[5]
课程编号[10003] 科目[英语] 成绩[94] 学分[4]
*/
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
using namespace std;
struct student
{
long number;
char name[20];
};
struct course
{
int course_number;
char course_name[20];
int score;
float credit;
};
struct data
{
student students;
int total_course;
course courses[10];
};
data s[100],s2[100];
int total_student=0;
void add(int &total_student)//添加成绩
{
int a,b,i,j,k,k2=1,m,v,p=0,choose=0,u=0,w,q,r;
cout<<"请输入即将输入的学生人数:";
do//判定人数是否超出数组可承受范围
{
cin>>a;
if(a>(100-total_student)) cout<<"超出最大限额!请重新输入:";
else k2=0;
}while(k2==1);
for(i=0;i<a;i++)
{
cout<<"请输入学号(8位数字):";
do//判定学号是否为8位数字
{
cin>>s[i+total_student].students.number;
if((s[i+total_student].students.number<100000000)&&(s[i+total_student].students.number>9999999)) k=1;
else
{
k=0;
cout<<"格式有误!请重新输入:";
}
}while(k==0);
p=i+total_student;
for(v=0;v<total_student;v++)//判定该学生是否已记录在册
{
if(s[i+total_student].students.number==s[v].students.number)
{
p=v;
total_student--;
cout<<"当前学生:"<<s[p].students.name<<endl;
goto leap1;
break;
}
}
cout<<"请输入学生的姓名:";
cin>>s[p].students.name;
leap1:
cout<<"请输入即将输入的学科个数:";
do//判定科目数量是否超出数组可承受范围
{
cin>>b;
k=0;
if(b>(10-s[p].total_course)) cout<<"科目数量超出最大限额!请重新输入:";
else k=1;
}while(k==0);
for(m=0;m<b;m++)
{
leap3:
cout<<"请输入课程编号(5位数字):";
do//判定课程编号是否为5位数字
{
cin>>s[p].courses[m+s[p].total_course].course_number;
if(s[p].courses[m+s[p].total_course].course_number>100000||s[p].courses[m+s[p].total_course].course_number<9999)
{
k=1;
cout<<"格式有误!请重新输入:";
}
else k=0;
}while(k==1);
u=m+s[p].total_course;
for(q=0;q<m+s[p].total_course;q++)//判定该学生此课程编号是否已存在
{
if(s[p].courses[m+s[p].total_course].course_number==s[p].courses[q].course_number)
{
cout<<"该学生已有该科成绩,是否覆盖?"<<endl<<"1.覆盖成绩。"<<endl<<"2.重新输入课程编号。" <<endl;
leap4:
cin>>choose;
if(choose==1)
{
u=q;
s[p].total_course--;
goto leap2;
}
else if(choose==2) goto leap3;
else
{
cout<<"请输入1或2进行选择:";
goto leap4;
}
}
}
for(w=0;w<i+total_student;w++)//判定所有数据中此课程编号是否已存在
{
for(r=0;r<s[w].total_course;r++)
{
if(s[p].courses[m+s[p].total_course].course_number==s[w].courses[r].course_number)
{
strcpy(s[p].courses[m+s[p].total_course].course_name,s[w].courses[r].course_name);
cout<<"当前课程:"<<s[w].courses[r].course_name<<endl;
goto leap2;
}
}
}
cout<<"请输入课程名称:";
cin>>s[p].courses[u].course_name;
leap2:
cout<<"请输入成绩:";
do//判定成绩是否为0-100的整数
{
cin>>s[p].courses[u].score;
if(s[p].courses[u].score>100||s[p].courses[u].score<0)
{
k=0;
cout<<"请输入0-100的整数:";
}
else k=1;
}while(k==0);
cout<<"请输入学分:";
k=0;
do//判定学分是否为1-5的实型数
{
cin>>s[p].courses[u].credit;
if(s[p].courses[u].credit>5||s[p].courses[u].credit<1)
{
k=0;
cout<<"请输入1-5的实型数:";
}
else k=1;
}while(k==0);
}
s[p].total_course=s[p].total_course+b;
}
total_student=total_student+a;
}
void del()//删除成绩
{
int a,b,i,j,k,m,l,stu_number;
cout<<"请输入即将删除成绩的学生人数:";
do
{
cin>>a;
if(a>0&&a<=total_student) k=1;
else
{
k=0;
cout<<"超出目前学生人数!请重新输入:";
}
}while(k==0);
for(i=0;i<a;i++)
{
do
{
cout<<"请输入学号(8位数字):";
cin>>s2[i].students.number;
for(j=0;j<100;j++)
{
if(s2[i].students.number==s[j].students.number)
{
stu_number=j;
k=1;
break;
}
else k=0;
}
if(k==0) cout<<"无此学生信息!请重新输入。"<<endl;
}while(k==0);
cout<<"请输入即将删除的学科个数:";
do
{
cin>>b;
if(b>0&&b<s[stu_number].total_course) k=1;
else
{
k=0;
cout<<"超出该学生目前已添加学科数目!请重新输入:";
}
}while(k==0);
for(m=0;m<b;m++)
{
do
{
cout<<"请输入课程编号(5位数字):";
cin>>s2[stu_number].courses[m].course_number;
for(j=0;j<100;j++)
{
if(s2[stu_number].courses[m].course_number==s[stu_number].courses[j].course_number)
{
for(l=j;l<s[stu_number].total_course;l++)
s[stu_number].courses[l]=s[stu_number].courses[l+1];
k=1;
cout<<"删除成功!"<<endl;
break;
}
else k=0;
}
if(k==0) cout<<"无此成绩信息!请重新输入。"<<endl;
}while(k==0);
s[stu_number].total_course--;
}
}
}
void check_student()//查询学生成绩
{
int check_way,check_number,total_credit=0,i,j,k=0;
char check_name[20];
cout<<"1.学号查询"<<endl;
cout<<"2.姓名查询"<<endl;
leap7:
cin>>check_way;
if(check_way==1)
{
do
{
cout<<"请输入想要查询的学号:";
cin>>check_number;
for(i=0;i<total_student;i++)
{
if(check_number==s[i].students.number)
{
cout<<endl;
cout<<"学号:"<<s[i].students.number<<endl;
cout<<"姓名:"<<s[i].students.name<<endl;
cout<<"课程编号"<<setw(10)<<"课程名称"<<setw(8)<<"成绩"<<endl;
for(j=0;j<s[i].total_course;j++)
{
cout<<s[i].courses[j].course_number<<setw(10)<<s[i].courses[j].course_name<<setw(10)<<s[i].courses[j].score<<endl;
total_credit=total_credit+s[i].courses[j].credit;
}
cout<<"总学分:"<<total_credit<<endl<<endl;
k=1;
break;
}
}
if(k==0) cout<<"无此学生信息!请重新输入。"<<endl;
}while(k==0);
}
else if(check_way==2)
{
do
{
cout<<"请输入想要查询的姓名:";
cin>>check_name;
for(i=0;i<100;i++)
{
if(strcmp(check_name,s[i].students.name)==0)
{
cout<<endl;
cout<<"学号:"<<s[i].students.number<<endl;
cout<<"姓名:"<<s[i].students.name<<endl;
cout<<"课程编号"<<setw(10)<<"课程名称"<<setw(8)<<"成绩"<<endl;
for(j=0;j<s[i].total_course;j++)
{
cout<<s[i].courses[j].course_number<<setw(10)<<s[i].courses[j].course_name<<setw(10)<<s[i].courses[j].score<<endl;
total_credit=total_credit+s[i].courses[j].credit;
}
cout<<"总学分:"<<total_credit<<endl<<endl;
k=1;
break;
}
}
if(k==0) cout<<"无此学生信息!请重新输入。"<<endl;
}while(k==0);
}
else
{
cout<<"请输入1或2进行选择:";
goto leap7;
}
}
void check_class()//查询课程成绩
{
int check_coursenumber,i,j,l=0;
float sum=0,total_student=0,amount10090=0,amount8980=0,amount7970=0,amount6960=0,amount59=0;
float avg,avg_pass,avg90,avg80,avg70,avg60,avg59;
cout<<"请输入课程编号:";
leap6:
cin>>check_coursenumber;
for(i=0;i<100;i++)
{
for(j=0;j<s[i].total_course;j++)
{
if(check_coursenumber==s[i].courses[j].course_number)
{
l=1;
cout<<endl<<"课程名称:"<<s[i].courses[j].course_name<<endl<<endl;
goto leap5;
}
}
}
if(l==0)
{
cout<<"无此课程信息!请重新输入:";
goto leap6;
}
leap5:
cout<<"学号"<<setw(14)<<"姓名"<<setw(10)<<"成绩"<<endl;
for(i=0;i<100;i++)
{
for(j=0;j<s[i].total_course;j++)
{
if(check_coursenumber==s[i].courses[j].course_number)
{
cout<<s[i].students.number<<setw(10)<<s[i].students.name<<setw(10)<<s[i].courses[j].score<<endl;
sum=sum+s[i].courses[j].score;
total_student++;
if(s[i].courses[j].score>=90) amount10090+=1;
else if(s[i].courses[j].score>=80&&s[i].courses[j].score<90) amount8980+=1;
else if(s[i].courses[j].score>=70&&s[i].courses[j].score<80) amount7970+=1;
else if(s[i].courses[j].score>=60&&s[i].courses[j].score<70) amount6960+=1;
else amount59+=1;
break;
}
}
}
avg=sum/total_student;
avg_pass=(amount10090+amount8980+amount7970+amount6960)*100/total_student;
avg90=amount10090*100/total_student;
avg80=amount8980*100/total_student;
avg70=amount7970*100/total_student;
avg60=amount6960*100/total_student;
avg59=amount59*100/total_student;
cout<<endl<<setiosflags(ios::fixed)<<setprecision(1)<<"平均分:"<<avg<<endl;
cout<<"及格率:"<<avg_pass<<"%"<<endl;
cout<<"分数100-90有"<<amount10090<<"人,占比"<<avg90<<"%"<<endl;
cout<<"分数89-80有"<<amount8980<<"人,占比"<<avg80<<"%"<<endl;
cout<<"分数79-70有"<<amount7970<<"人,占比"<<avg70<<"%"<<endl;
cout<<"分数69-60有"<<amount6960<<"人,占比"<<avg60<<"%"<<endl;
cout<<"分数小于60有"<<amount59<<"人,占比"<<avg59<<"%"<<endl<<endl;
}
void write_in(int &total_student)//写入文件
{
ofstream outfile("student.dat",ios::binary);
if(!outfile) cerr<<"文件写入错误,请重试!"<<endl;
else
{
outfile.write(reinterpret_cast<char *>(&total_student),sizeof(total_student));
for(int i=0;i<100;i++)
outfile.write((char*)&s[i],sizeof(s[i]));
outfile.close();
cout<<"文件写入成功!当前有"<<total_student<<"位学生的成绩数据。"<<endl<<endl;
}
}
void write_out(int &total_student)//读取文件
{
ifstream infile("student.dat",ios::binary);
if(!infile) cerr<<"文件读取错误,请重试!"<<endl;
else
{
infile.read(reinterpret_cast<char *>(&total_student),sizeof(total_student));
for(int i=0;i<100;i++)
infile.read((char*)&s[i],sizeof(s[i]));
infile.close();
cout<<"文件读取成功!当前有"<<total_student<<"位学生的成绩数据。"<<endl<<endl;
}
}
int main()
{
int choose;
for(int i=0;i<100;i++)
{
s[i].total_course=0;
s2[i].total_course=0;
}
cout<<"自动读取文件……"<<endl;
write_out(total_student);
while(1)
{
cout<<" 成绩记录簿"<<endl<<endl;
cout<<" 1.添加"<<endl;
cout<<" 2.删除"<<endl;
cout<<" 3.查学生成绩"<<endl;
cout<<" 4.查班成绩表"<<endl;
cout<<" 5.写入文件"<<endl;
cout<<" 6.读取文件"<<endl;
cout<<" 0.退出"<<endl<<endl;
cout<<"请输入数字选择:";
cin>>choose;
switch(choose)
{
case 1:add(total_student);break;
case 2:del();break;
case 3:check_student();break;
case 4:check_class();break;
case 5:write_in(total_student);break;
case 6:write_out(total_student);break;
case 0:exit(0);
default:;
}
}
return 0;
}
有很大缺陷,最直观的是学号是用的整型数字。
仅作留档。