程序设计基础实训 成绩记录簿

程序设计基础实训 成绩记录簿

题目要求:


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;
}

有很大缺陷,最直观的是学号是用的整型数字。
仅作留档。

发布了30 篇原创文章 · 获赞 12 · 访问量 892

猜你喜欢

转载自blog.csdn.net/weixin_43893854/article/details/100709343