📄 大作业4.cpp
字号:
while(i<count3&&flag)
{ //可能出现在学生人事文件中无记录而在选修关系文件中有记录的情况
if(strcmp(name,cho[i].snum)==0||strcmp(str1,cho[i].snum))
{
for(j=i;j<count3-i;j++)
{ strcpy(cho[j].snum,cho[j+1].snum);
strcpy(cho[j].lnum,cho[j+1].lnum);
cho[j].mark=cho[j+1].mark;
cho[j].term=cho[j+1].term;
}
count3=count3-1;
if(count3<1) flag=0; //若文件空,推出循环
}
else i=i+1;
}
if(i==count3&&flag) cout<<"在选修关系文件中未找到该生的相关记录!"<<endl;
else cout<<"选修关系文件中该生的相关记录已删除!"<<endl;
//将删除后的结果再存入原文件
ofstream file4("xszl.dat",ios::binary),file5("xxgx.dat",ios::binary);
if(!file4)
{ cout<<"无法打开学生人事文件!"<<endl;
exit(0);
}
if(!file5)
{
cout<<"无法打开选修关系文件!"<<endl;
exit(0);
}
for(i=0;i<count1;i++)
file4.write((char *)&stu[i],sizeof(stu[i]));
for(i=0;i<count3;i++)
file5.write((char *)&cho[i],sizeof(cho[i]));
file4.close();
file5.close();
}
//打印每门课的平均成绩和超过平均分的学生的学号、姓名、班级、成绩
void Print()
{
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=0,count1=0,count2=0,count3=0;
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=new float[count2], *avr=new float[count2];
for(i=0;i<count2;i++) sum[i]=0.0f;
for(i=0;i<count2;i++) avr[i]=0.0f;
for(i=0;i<count2;i++)
{
for(j=0;j<count3;j++) //找出对应课程的成绩
{
if(strcmp(cho[j].lnum,les[i].lnum)==0) //判断匹配的课程
{ sum[i]=sum[i]+cho[j].mark;k=k+1;} //k记录选择该课程的人数
}
if(k) //至少有一个成绩
{ avr[i]=sum[i]/k; //计算本课程的平均分
cout<<"课程:"<<les[i].lname<<"的平均成绩为:"<<avr[i]<<endl;
}
else cout<<"在选修关系文件中找不到课程"<<les[i].lname<<"的相关记录!"<<endl;
k=0; //记录清零
}
//找出超过平均分的学生
char *str=new char[7];
int flag=1;
for(i=0;i<count2&&avr[i]!=0;i++)
{ cout<<"课程"<<les[i].lname<<"的成绩超过平均分的有:"<<endl;
for(j=0;j<count3;j++)
{ //课号匹配且分数高于平均分
if(strcmp(cho[j].lnum,les[i].lnum)==0&&(cho[j].mark>avr[i]))
{ strcpy(str,cho[j].snum); //用str记录学号
for(k=0;k<count1&&flag;k++) //在学生人事文件中找符合条件的学生
{
if(strcmp(str,stu[k].num)==0) //若找到输出相关信息
{ cout<<stu[k].num<<","<<stu[k].name<<","<<stu[k].bj<<","<<cho[j].mark<<endl;
flag=0; //结束本循环
}
}
if(flag) cout<<"在学生资料中找不到该生的记录!"<<endl;
}
}
}
file1.close();
file2.close();
file3.close();
}
//根据课名输出选修了该课程的学生学号、姓名、班级、成绩
void search(char *lessonname)
{
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;
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;}
char *str1=new char[7],*str2=new char[7];
int flag1=1,flag2=1,n=0; //n记录选该课的人数
for(i=0;i<count2&&flag1;i++)
{
if(strcmp(les[i].lname,lessonname)==0)
{
cout<<"选修课程"<<lessonname<<"的人有:"<<endl;
strcpy(str1,les[i].lnum); //用str1表示对应的课号
//寻找匹配的学号
for(j=0;j<count3;j++)
{
if(strcmp(str1,cho[j].lnum)==0)
{ n=n+1;
strcpy(str2,cho[j].snum); //用str2 表示对应的学号
//在学生人事文件中找符合条件的学生
for(k=0;k<count1&&flag2;k++)
{
if(strcmp(stu[k].num,str2)==0)
{ cout<<stu[k].num<<","<<stu[k].name<<","<<stu[k].bj<<","<<cho[j].mark<<endl;
flag2=0;
}
}
if(flag2) cout<<"在学生人事文件中找不到相应的资料!"<<endl;
}
}
if(!n) cout<<"在选修关系文件中未找到相应的内容!"<<endl;
flag1=0; //找到对应的课号则可推出循环
} //最外层if语句结束
}
if(flag1) cout<<"在课程档案文件中找不到相应的课程!"<<endl;
file1.close();
file2.close();
file3.close();
}
//根据指定的教师输出相关信息
void find(char *teacher)
{
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;
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;}
char (*str)[7];
str=new char[10][7]; //记录该教师所授的全部课程的课程号
int n=0; //记录该教师所授课程的门数
for(i=0;i<count2;i++)
{
if(strcmp(les[i].tname,teacher)==0) //找到匹配的课程
strcpy(str[n++],les[i].lnum); //将课程号存入数组
}
if(n==0) cout<<"未找到该教师教授的课程!"<<endl;
else
{ char *str1=new char[12];
//查看每个学生的选课情况
for(i=0;i<count1;i++)
{ strcpy(str1,stu[i].num); //用str1表示当前学生的学号
int js=0; //记录选择指定教师课程的门数
//寻找学号匹配的选课信息
for(j=0;j<count3;j++)
{
if(strcmp(cho[j].snum,str1)==0)
{ //查看该生是否选择了指定教师的课程
for(k=0;k<n;k++)
{
if(strcmp(cho[j].lnum,str[k])==0) js=js+1;
}
}
}
//该生选择了指定教师的全部课程
if(js==n)
{ //输出相关信息
cout<<stu[i].num<<","<<stu[i].name<<","<<stu[i].bj<<endl;
cout<<"他/她所选的全部课程为:";
for(int g=0;g<count3;g++)
{
if(strcmp(cho[g].snum,str1)==0) //学号匹配
{
for(int l=0;l<count2;l++) //找出对应的课程名
{
if(strcmp(les[l].lname,cho[g].lnum)==0)
cout<<les[l].lname<<","
}
}
}
cout<<endl;
}
} //对应于i的循环
} //else语句结束
delete []str1;
delete []str;
file1.close();
file2.close();
file3.close();
}
void main()
{
creatuser();
creatlesson();
creatselect();
char *name1=new char[11];
cout<<"请输入需要计算成绩的学生的姓名或学号:";cin>>name1;
cout<<"该生的平均分是:"<<average(name1);
cout<<"该生所在班级的平均分是:"<<Average(name1)<<endl;
char *name2=new char[11];
cout<<"请输入要删除记录的学生的姓名或学号:";cin>>name2;
Delete(name2);
Print();
char *name3=new char[21];
cout<<"请输入一个课程名:";cin>>name3;
search(name3);
char *name4=new char[11];
cout<<"请输入一位教师的名字:";cin>>name4;
find(name4);
delete []name1;
delete []name2;
delete []name3;
delete []name4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -