⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 大作业4.cpp

📁 学生人事档案管理模拟
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<string.h>
#include<stdlib.h>
//建立学生人事文件
struct student
{
	char num[6];
	char name[10];
	char sex[1];
	int  age;
	char bp[20];
	char bj[6];
};
//输入学生资料
void creatuser()
{
	ofstream file1("xszl.dat",ios::binary);    //以二进制方式打开文件
    int N,i,count=0;             //count作为提示输出时的计数器
	cout<<"请输入要建立档案的学生人数:";
	cin>>N;
	struct student *stu=new struct student[N];  //根据N的大小建立student类型的数组
	//输入学生人事数据
	for(i=0;i<N;i++)
    { cout<<"请输入第("<<++count<<")个学生的资料:"<<endl;
	  cout<<"学号(6位以内的数字):";cin>>stu[i].num;
      cout<<"姓名(最多10个字母或5个汉字):";cin>>stu[i].name;
      cout<<"性别(m:男 f:女):";cin>>stu[i].sex;
	  cout<<"年龄(0-100之间):";
	  do
	  { cin>>stu[i].age;
        if(stu[i].age<0||stu[i].age>100)
        cout<<"年龄必须介于0和100之间!,请重新输入:";
	  } while(stu[i].age<0||stu[i].age>100);
      cout<<"籍贯:";cin>>stu[i].bp;
	  cout<<"班级:";cin>>stu[i].bj;
	}
    if(!file1)
	{ cout<<"无法打开学生人事文件!"<<endl;
	  exit(0);
	}
	for(i=0;i<N;i++)                          //将数据以二进制方式写入打开的文件中
    file1.write((char *)&stu[i],sizeof (stu[i]));
	file1.close();
}


//建立课程档案文件
struct lesson
{
	char lnum[6];                              //课号
	char lname[20];                            //课程名
	float fen;                                 //学分
	char tname[10];                            //授课教师姓名
	char firstl[6];                            //先修课课课号
};
void creatlesson()
{
	ofstream file2("kcda.dat",ios::binary);    //以二进制方式打开文件
	int M,i,count=0;                           //count作为提示输出时的计数器
	cout<<"请输入需要建立档案的课程数:";
	cin>>M;
	struct lesson *les=new struct lesson[M];   //根据M的大小建立lesson类型的数组
	//输入课程信息
	for(i=0;i<M;i++)
	{ cout<<"请输入第("<<++count<<")门课程的资料:"<<endl;
	  cout<<"请输入课程号(不超过6位):";cin>>les[i].lnum;
	  cout<<"请输入课程名:";cin>>les[i].lname;
	  cout<<"请输入该课程的学分:";cin>>les[i].fen;
	  cout<<"请输入该课授课教师的姓名:";cin>>les[i].tname;
	  cout<<"请输入先修课课号(无先修课用NO表示):";cin>>les[i].firstl;
	}
	if(!file2)
	{ 
		cout<<"无法打开课程档案文件!"<<endl;
		exit(0);
	}
	for(i=0;i<M;i++)                           //将数据以二进制方式写入打开的文件中
		file2.write((char *)&les[i],sizeof(les[i]));
	file2.close();
}


//建立选修关系文件
struct choose
{
	char snum[6];                         //学号 
	char lnum[6];                         //课号
	float mark;                           //成绩
	int   term;                           //选修学期
};
void creatselect()
{
	ofstream file3("xxgx.dat",ios::binary);   //以二进制方式打开文件
	int L,i,count=0;                          //count作为提示输出时的计数器
	cout<<"请输入要建立多少份选修关系记录";
	cin>>L;
	struct choose *cho=new struct choose[L];  //根据L的大小建立choose类型数组
	//输入信息
	for(i=0;i<L;i++)
	{ cout<<"请输入第("<<++count<<")项资料:"<<endl;
	  cout<<"请输入学生的学号(不超过6位):";cin>>cho[i].snum;
	  cout<<"请输入所选课的课程号(不超过6位):";cin>>cho[i].lnum;
	  cout<<"请输入该生该门课程的成绩:";cin>>cho[i].mark;
	  cout<<"请输入该门课程的选修学期:";cin>>cho[i].term;
	}
	if(!file3)
	{ 
		cout<<"无法打开选修关系文件!"<<endl;
		exit(0);
	}  
	for(i=0;i<L;i++)                          //将数据以二进制方式写入打开的文件中
		file3.write((char *)&cho[i],sizeof(cho[i]));
	file3.close();
}


//计算某个学生的平均成绩(加权平均)
float average(char *name)
{   //以二进制方式打开三个文件
	ifstream file1("xszl.dat",ios::binary),file2("kcda.dat",ios::binary),file3("xxgx.dat",ios::binary);
     if(!file1)
	{ cout<<"无法打开学生人事文件!"<<endl;
	  exit(0);
	}
     if(!file2)
	{ 
		cout<<"无法打开课程档案文件!"<<endl;
		exit(0);
	}
     if(!file3)
	{ 
		cout<<"无法打开选修关系文件!"<<endl;
		exit(0);
	}
	 struct student *stu=new struct student[50];
     struct lesson *les=new struct lesson[50];
	 struct choose *cho=new struct choose[50];
	 int i,j,k,count1=0,count2=0,count3=0,n;  //n用来记录总学分
	 float sum=0.0f,avr=0.0f;
	 //分别从各个文件中读入数据,写入相应的数组中,同时记录数组元素的个数
	 for(i=0;file1.read((char*)&stu[i],sizeof(stu[i]))!=0;i++)
	 { count1=count1+1;}
     for(i=0;file2.read((char *)&les[i],sizeof(les[i]))!=0;i++)
	 {count2=count2+1;}
	 for(i=0;file3.read((char *)&cho[i],sizeof(cho[i]))!=0;i++)
	 { count3=count3+1;}
	 //置标志值
	 int flag=1;
     for(i=0;i<count1&&flag;i++)
	 {   //实参为姓名或者学号,找到匹配者输出姓名和学号,跳出循环
		 if(strcmp(stu[i].name,name)==0||strcmp(stu[i].num,name)==0)
		 {cout<<"("<<stu[i].num<<")"<<stu[i].name<<":"<<endl;flag=0;}
	 }
	 if(flag) cout<<"在学生人事文件中找不到该生的资料!"<<endl;
	 //恢复标志值
	 flag=1;
	 for(j=0;j<count3&&flag;j++)
	 {  
		 if(strcmp(stu[i-1].num,cho[j].snum)==0)  //判断学号是否对应。
			                                      //在找到匹配的学生后,i值加1,故这里i要减1
		 { cout<<cho[j].lnum<<","<<cho[j].mark<<endl;//输出课号和相应的成绩
	       for(k=0;k<count2;k++)                     //寻找对应课程的学分
		   {if(strcmp(les[k].lnum,cho[j].lnum)==0) 
		   {sum=sum+(float)(les[k].fen)*(float)cho[j].mark;n=n+(float)les[k].fen;} //累计总分
		   }
		 }
	 }
	 avr=sum/n;                          //计算平均分         
	 return avr;               
}



//计算某个学生所在班级的平均成绩(加权平均)
float Average(char *name)
{ 
	ifstream file1("xszl.dat",ios::binary),file2("kcda.dat",ios::binary),file3("xxgx.dat",ios::binary);
     if(!file1)
	{ cout<<"无法打开学生人事文件!"<<endl;
	  exit(0);
	}
     if(!file2)
	{ 
		cout<<"无法打开课程档案文件!"<<endl;
		exit(0);
	}
     if(!file3)
	{ 
		cout<<"无法打开选修关系文件!"<<endl;
		exit(0);
	}
	 struct student *stu=new struct student[50];
     struct lesson *les=new struct lesson[50];
	 struct choose *cho=new struct choose[50];
	 int i,j,k,count1=0,count2=0,count3=0,m=0;   //m用来记录已经计算过平均分的学生人数
	 for(i=0;file1.read((char*)&stu[i],sizeof(stu[i]))!=0;i++)
	 { count1=count1+1;}
     for(i=0;file2.read((char *)&les[i],sizeof(les[i]))!=0;i++)
	 {count2=count2+1;}
	 for(i=0;file3.read((char *)&cho[i],sizeof(cho[i]))!=0;i++)
	 { count3=count3+1;}
	 float sum=0.0f,avr=0.0f,avr[count1],n=0.0f; //数组avr用来存放该班级每个学生的平均分
	 int flag=1;
	 char *bj=new char[7];                       //bj表示班级
     for(i=0;i<count1&&flag;i++)                 //寻找匹配的班级
	 { 
		 if(strcmp(stu[i].name,name)==0||strcmp(stu[i].num,name)==0)
		 { strcpy(bj,stu[i].bj);flag=0;}
	 }
	 if(flag) cout<<"在学生人事文件中找不到该生的资料!"<<endl;
	 flag=1;
	 for(i=0;i<count1&&flag;i++)                 //在所有学生中找出指定班级的学生,计算其平均分
	 { 
		 if(strcmp(bj,stu[i].bj)==0)            
		 {
	        for(j=0;j<count3&&flag;j++)
			{ 
				if(strcmp(stu[i].num,cho[j].snum)==0)
				{ 
					for(k=0;k<count2;k++)
					{if(strcmp(les[k].lnum,cho[j].lnum)==0) 
					{sum=sum+les[k].fen*cho[j].mark;n=n+les[k].fen;}
					}
				} 
			}
	    avr[m++]=sum/n;                 //存入一个学生的平均分
	    sum=0.0f;                       //将个人总分恢复至零
	    n=0.0f;                         //将个人总学分恢复至零
		 }
	 }
	 for(i=0;i<m;i++)
		 sum=sum+avr[i];                //累计全班平均分的总和
	 avr=sum/m;                         //计算班级的平均分
	 return avr;
}


//删除某个学生的记录
void Delete(char *name)
{   //打开有学生个人资料的文件
	ifstream file1("xszl.dat",ios::binary),file3("xxgx.dat",ios::binary);
     if(!file1)
	{ cout<<"无法打开学生人事文件!"<<endl;
	  exit(0);
	}
     if(!file3)
	{ 
		cout<<"无法打开选修关系文件!"<<endl;
		exit(0);
	}
	 struct student *stu=new struct student[50];
     struct choose *cho=new struct choose[50];
	 int i,j,count1=0,count3=0,flag=1;
	 //用两个字符串分别存放制定学生的学号和姓名 
	 char *str1=new char[11],*str2=new char[11];
     for(i=0;file1.read((char*)&stu[i],sizeof(stu[i]))!=0;i++)
	 { count1=count1+1;}
     for(i=0;file3.read((char *)&cho[i],sizeof(cho[i]))!=0;i++)
	 { count3=count3+1;}
	 file1.close();file3.close();
	 //删除学生人事文件中的相关数据
	 for(i=0;i<count1&&flag;i++)
	 { 
		 if(strcmp(stu[i].name,name)==0||strcmp(stu[i].num,name)==0) //学号匹配或姓名匹配
		 {   
			 strcpy(str1,stu[i].num);
	         strcpy(str2,stu[i].name);
			 //删除改名学生的数据,其后的学生依次前移一位
		     for(j=i;j<count1-i;j++)
			 { strcpy(stu[j].num,stu[j+1].num);
	           strcpy(stu[j].name,stu[j+1].name);
	           strcpy(stu[j].sex,stu[j+1].sex);
	           stu[j].age=stu[j+1].age;
               strcpy(stu[j].bp,stu[j+1].bp);
	           strcpy(stu[j].bj,stu[j+1].bj);
			 }
	    flag=0;    //已删除,推出循环
		 }
	 }
	 if(!flag) 
	 { cout<<"该生基本资料已删除!"<<endl;
	   count1=count1-1;           //student 类型数组元素数减1
	 }
	 else cout<<"在学生资料中找不到该生的记录!"<<endl;
	 //删除选修关系文件中的相关资料
	 flag=1;i=0;
	 if(!count3) { cout<<"选修关系文件目前为空!"<<endl;falg=0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -