📄 大作业4.cpp
字号:
#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 + -