试编写一管理 系统,要求如下:
1)实现对两个文件数据进行合并, 生成新文件3. txt .
3)对 合并后的文件3. txt中的数据按总分降序排序
4)输入一个学生姓 名后,能查找到此学生的信息并输出结果
5)要求使用结构体, 链或数组等实现上述要求.
#include<stdio.h>
#include<string.h> //比较字符串头文件//
#include<stdlib.h> //实时检测总数头文件//
#define N 1000 //控制最大输入//
int n=0; //实时检测的总数n//
/*定义结构体students*/
struct students
{
int num; //学号-整型//
char name[8]; //姓名-字符型//
char chinese; //大学语文-字符型//
char math; //大学数学-字符型//
char computer; //计算机-字符型//
char sum; //总成绩-字符型//
char ave; //平均分-字符型//
}student[N],student1; //student[N]是结构体数组student1是结构体的初始化//
/*实时检测总数n*/
void count()
{
FILE *fp; //定义一个文件指针fp//
fp=fopen("students.txt","at+"); //以“追加”方式打开students文本文件//
if(fp==NULL) //判断文件是否为空//
printf("Cannot open file!");
struct students stu1;
n=0; //初始化//
while(1)
{
if(feof(fp)) //检测文件是否结束//
break;
fread(&stu1,sizeof(struct students),1,fp); //读取文件//
n++; //读取文件数//
}
n--; //关闭文件数//
fclose(fp); //关闭文件//
}
/*菜单*/
void main()
{
int i; //获取用户在菜单中的选择//
while(i!=0)
{
system("cls"); //清屏//
printf("\t\t欢迎进入学生信息管理系统\n");
printf("\t\t==============================\n");
printf("\t\t*请择操作 *\n");
printf("\t\t*1输入学生信息 *\n");
printf("\t\t*2输出学生信息 *\n");
printf("\t\t*3修改学生信息 *\n");
printf("\t\t*4查询学生信息 *\n");
printf("\t\t*5排序学生信息 *\n");
printf("\t\t*6退出 *\n");
printf("\t\t==============================\n");
scanf("%d",&i);
system("cls"); //清屏//
count(); //实时检测总数n//
switch(i)
{
case 1:input();break; //输入学生信息//
case 2:output();break; //输出学生信息//
case 3:xiugai();output();break; //修改学生信息//
case 4:query();break; //查询学生信息*/
case 5:paixu();output();break; //成绩排序//
default:
printf("输入有错\n"); //错误纠正//
}
}
if(i==0)
tuichu(); //退出系统//
}
/*成绩输入*/
void input()
{
int i=0; //学生人数初始化//
char c;
FILE *fp; //定义一个文件指针fp//
count(); //实时检测总数n//
fp=fopen("students.txt","at+"); //以“追加”方式打开students文本文件//
do
{
printf("请输入学生的个人信息:\n");
printf("\n请输入第%d学生的信息:\n",n+1);
printf("请输入学生的学号:");
scanf("%d",&student[i].num);
printf("请输入学生的姓名:");
scanf("%s",student[i].name);getchar();
printf("请输入学生的大学语文成绩");
scanf("%s",student[i].chinese);
printf("请输入学生的大学数学成绩:");
scanf("%d",&student[i].math);
printf("请输入学生的计算机成绩:");
scanf("%s",student[i].computer);
getchar();
student[i].sum=student[i].chinese+student[i].math+student[i].computer;
student[i].ave=student[i].sum/3;
fwrite(&student[i],sizeof(struct students),1,fp); //以方式将其写入students文本文件//
i++;
n++;
printf("\n\n\t\t\t\t是否继续输入(Y/N):");getchar(); //提示是否继续,从键盘
获得一个字符//
scanf("%c",&c);
}
while(c=='y'||c=='Y');
fclose(fp);
}
/*成绩输出*/
void output()
{
int i;
char c;
FILE *fp; //定义一个文件指针fp//
fp=fopen("students.txt","rt"); //以“读取的” 方式打开students文本文件//
system("cls"); //清屏//
getchar();
printf("||------||-----||-----||-----||------||-------||-------||------||");
printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩
-----平均分---#|\n");
do{
for(i=0;i<n;i++)
{
fread(&student[i],sizeof(struct students),1,fp);
printf("%d",student[i].num);
printf(" %d",student[i].name);
printf("%d",student[i].chinese);
printf(" %d ",student[i].math);
printf("%d ",student[i].computer);
printf("%d",student[i].sum);
printf(" %d ",student[i].ave);
}
printf("|------||-----||------||-----||-----||-----||-----||------ |");
printf("\n\n\t\t\t\t是否继续其它操作(Y/N):"); //提示是否继续//
scanf("%c",&c);
c=getchar();
}while(c=='y'||c=='Y');
fclose(fp); //关闭文件//
}
/*成绩修改*/
void xiugai() {
int i,tp,num1;
char c;
FILE *fp; //定义一个文件指针fp//
lb:
printf("\n按学号修改\n\n");
printf("请输入要修改的学生学号\n");
scanf("%d",&num1);
for(i=0;i<n;i++)
{
if(num1==student[i].num)
{
printf("要修改的学生信息为:\n");
printf("学号\t姓名\t大学语文成绩\t大学数学成绩\t计算机成绩\t总成绩\t
平均分\n");
printf(" %d ",student[i].num);
printf(" %d ",student[i].name);
printf(" %d ",student[i].chinese);
printf(" %d ",student[i].math);
printf(" %d ",student[i].computer);
printf(" %d ",student[i].sum);
printf(" %d ",student[i].ave);
do {
printf("请选择要修改项:\n");
printf("1学号\n2姓名\n3大学语文成绩\n4大学数学成绩\n5总成绩\n6平
均分\n");
scanf("%d",&tp);
switch(tp)
{
case 1:
{ printf("请输入学号:\n");
scanf("%d",&student[i].num);
goto la;
}
case 2:
{ printf("请输入姓名:\n");
scanf("%s",student[i].name);
goto la;
}
case 3:
{ printf("请输入大学语文成绩:\n");
getchar();
scanf("%c",&student[i].chinese);
goto la;
}
case 4:
{ printf("请输入大学数学成绩:\n");
scanf("%d",&student[i].math);
goto la;
}
case 5:
{printf("请输入计算机成绩:\n");
scanf("%s",student[i].computer);
goto la;
}
case 6:
{ printf("请输入总成绩:\n");
scanf("%s",student[i].sum);
goto la;
}
case 7:
{ printf("请输入平均分:\n");
scanf("%s",student[i].ave);
goto la;
}
}
}while (tp<8);
la: printf("是否继续修改(y/n)\n"); //提示是否继续//
getchar();
scanf("%c",&c);
if(c=='y'||c=='Y') goto lb;
}
}
fp=fopen("students.txt","w+"); //以“读写” 方式打开students文本文件//
for(i=0; i<n;i++)
fwrite(&student[i],sizeof(struct students),1,fp); //以 方式将其写入students
文本文件//
fclose(fp); //关闭文件//
}
/*成绩查询*/
void query()
{ int querymode; //子菜单选择//
int i,j=0,findnum;
char findname[20];
int findok,t=0; //定义一个判断标志的整型变量findok//
char findct; //定义一个用于判断是否继续查找的字符变量findct//
FILE *fp; //定义一个文件指针fp//
count(); //实时检测总数n//
fp=fopen("students.txt","r"); //以“只读” 方式打开students文本文件//
system("cls"); //清屏//
/*查询菜单*/
printf("\t\t信息查询");
printf("\n\t1按姓名查询");
printf("\n\t2按学号查询");
printf("\n\t0返回上级菜单");
printf("\n请输入您的操作:");
scanf("%d",&querymode);
/*查询操作*/
switch(querymode)
{case 1:
{ printf("请输入要查询学生的姓名:\n");
getchar();
scanf("%s",findname);
for(i=0;i<N;i++)
{
fread(&student[i],sizeof(struct students),1,fp); //以方式将其读入students
文本文件//
if(strcmp(student[i].name,findname)==0) //比较字符串//
{
j++;
printf("\n查寻到的学生为:\n");
if(j==1)
、
printf("|------||-----||------||------||------||-------||------||-----|");
//仅在第一次显示//
printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩-
----平均分---#|\n");
printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
student[i].chinese,student[i].math,student[i].sum,student[i].ave);
}
}
if(j==0)
printf("\n>>>查无此人!");
//提示是否继续//
printf ("\n是否继续查找(Y/N)?");
getchar();
getchar();}break;
case 2:{ printf("请输入要查询学生的学号:");
scanf("%d",&findnum);
for(i=0;i<n;i++)
{
fread(&student[i],sizeof(struct students),1,fp);
//以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个
学生的信息//
if(student[i].num==findnum) //整型数字的比较//
{findok=1;break;}
else findok=0;
}
if(!findok)
printf("\n>>>查无此人!");
else
{ printf("\n查寻到的学生为:\n") ;
if(j==1)
printf("|-------||------||------||-------||-------||-------||-------||------|");
//仅在第一次显示//
printf("|学号-----姓名------大学语文------大学数学------计算机------总成绩-----平均分---|\n");
printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
student[i].chinese,student[i].math,student[i].sum,student[i].ave);
}
//提示是否继续//
printf ("\n是否继续查找(Y/N)?");
getchar();
findct=getchar(); //从键盘输入一个判断字符,并将它赋值给字符变量
findct,用于以下的if语句的判断 //
if(findct=='Y' || findct=='y')
query();
}
}
fclose(fp); //关闭文件//
}
/*成绩排序*/
void paixu()
{
int i, j;
FILE *fp; //定义一个文件指针fp//
system("cls"); //清屏//
count(); //实时检测总数n//
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++) //按学号对学生信息进行排序//
{
if(student[j].num>student[j+1].num) //整型数字的比较//
{
student1=student[j];
student[j]=student[j+1];
student[j+1]=student1;
}
}
fp=fopen("students.txt","w+"); //以 “读写”方式打开students文本文件//
for(i=0;i<n;i++)
fwrite(&student[i],sizeof(struct students),1,fp); //以结构体students的方式从
文件fp中读取,将其写入students文本文件,每次写入一个学生的信息//
fclose(fp); //关闭文件//
}
/*退出系统*/
void tuichu()
{
char c;
system("cls"); //清屏//
printf("\n\n\t\t谢谢使用\n\n\n");
printf("\n\n\t\t制作人:李姣 渠莉 宝珠 朱佳 刘妍\n");
getchar();
c=getchar(); //取用户输入,回显//
}
C++ 实现学生成绩管理系统
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
struct score //定义存放学生成绩信息的结点
{
int num; //学号
string name; //姓名
float math; //数学成绩
float english; //英语成绩
float computer; //计算机基础成绩
float scoresum; //三门成绩总和
struct score * next; //next为指向下一结点的指针
};
struct score * head; //指向链表头结点的指针
int studentSum = 0; //学生总人数
class record
{
public:
struct score * InsertRecord(struct score *h);//插入学生成绩信息
struct score * DeleteRecord(struct score *h);//删除学生成绩信息
struct score * UpdateRecord(struct score *h);//修改学生成绩信息
void FindRecord(struct score *h, int x, float s1, float s2);//根据某门课程的分数段查询学生成绩信息
void FindRecord(struct score *h, string x); //根据学生姓名查询学生成绩信息
void FindRecord(struct score *h, int x); //根据学生学号查询学生成绩信息
void StatisticRecord(struct score *h, int x); //统计某门课程的及格学生人数、及格率,并显示不及格学生信息
void StacRecordFind(struct score *h); //统计三门课程成绩全部优秀的学生人数,并显示全部优秀的学生信息
void StacRecordDisq(struct score *h); //统计三门课程成绩全部不及格的学生人数,并显示全部不及格的学生信息
void PrintRecord(struct score *h); //输出所有 学生成绩
void SaveRecordFile(struct score *h); //保存学生成绩信息到文件
struct score *LoadRecordFile(struct score *h); //从文件中加载学生成绩信息
};
struct score *record:: InsertRecord(struct score *h)
{
struct score *p1, *p2, *p3;
p3 = new score; //创建新的学生成绩结点
cout << "\n请输入学生学号:";
cin >> p3->num;
cout << "\n请输入学生姓名:";
cin >> p3->name;
cout << "\n请输入学生的数学成绩:";
cin >> p3->math;
cout << "\n请输入学生的英语成绩:";
cin >> p3->english;
cout << "\n请输入学生的计算机基础成绩:";
cin >> p3->computer;
p3->scoresum = p3->math + p3->english + p3->computer; //计算结点的总成绩
p3->next = NULL; //将要插入结点的指针域置为空
if (h == NULL)
{
h = p3;
return h;
}
p1 = p2 = h;
while (p1 != NULL && p3->num > p1->num) //查找结点的学号大于要插入结点的学号的第一个结点
{ //指针p1表示符合条件的结点的指针,指针p2是指针p1的前一个结点的指针
p2 = p1;
p1 = p1->next;
}
if (p1 == h) //插入位置为链表头结点前
{
p3->next = h;
h = p3;
return h;
}
else //插入位置为链表的中间的链表的尾部
{
p2->next = p3;
p3->next = p1;
}
studentSum += 1; //学生人数加1
return h; //返回链表的头结点
}
void record::PrintRecord(score *h)
{
if (h == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
while (h) //输出链表中每个结点的学生成绩信息
{
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
h = h->next;
}
}
struct score *record::DeleteRecord(struct score *h)
{
struct score *p1, *p2;
int num;
if (h == NULL) //链表为空
{
cout << "\n抱歉,没有任何记录!";
return h;
}
p1 = p2 = h;//将链表的头指针赋给指针p1和p2
cout << "\n请输入要删除记录的学生学号";
cin >> num;
while (p1 != NULL && p1->num != num)//查找结点的学号等于要删除学生学号的第一个结点
{ //指针p1表示符合条件的结点的指针,指针p2是指针p1的前一个结点指针
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)
{
cout << "\n抱歉啊,表中没有该记录哦!";
return h;
}
if (p1->num == num)
{
studentSum -= 1;//学生人数减1
if (p1 == h) //删除的是头结点
h = h->next;
else //删除的是非头结点
p2->next = p1->next;
delete p1; //释放p1所指向的存储单元
}
return h;
}
struct score *record::UpdateRecord(struct score *h)
{
struct score *p1;
int num;
if (h == NULL)
{
cout << "\n抱歉,没有任何记录!";
return h;
}
p1 = h;
cout << "\n请输入要修改记录的学生学号:";
cin >> num;
while (p1 != NULL && p1->num != num) //查找结点的学号等于要修改学生学号的结点指针
{
p1 = p1->next; //将p1指针移到下一个结点
}
if (p1 == NULL) //没有找到符合要求的结点
{
cout << "\n抱歉,表中没有该记录!";
return h;
}
if (p1->num == num) //找到符合要求的结点,并修改学生的相关成绩
{
cout << "\n请重新输入学生的数学成绩:";
cin >> p1->math;
cout << "\n请重新输入学生的英语成绩:";
cin >> p1->english;
cout << "\n请重新输入学生的计算机基础成绩:";
cin >> p1->computer;
p1->scoresum = p1->math + p1->english + p1->computer;
}
return h;
}
void record::FindRecord(struct score *h, int x, float s1, float s2)
{
if (h == NULL) //链表为空
{
cout << "\n,抱歉,没有任何记录!";
return;
}
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
while (h)
{
if (x == 1) //查找数学成绩在某分数段的学生成绩信息
{
if (h->math >= s1 && h->math <= s2)
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
}
if (x == 2)
{
if (h->english >= s1 && h->english <= s2)
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
}
if (x == 3)
{
if (h->computer >= s1 && h->computer <= s2)
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
}
h = h->next;
}
}
void record::FindRecord(struct score *h, int num) //根据学生学号查找学生成绩信息
{
struct score *p1;
if (h == NULL)
{
cout << "\n抱歉,没有任何记录";
return;
}
p1 = h; //将链表的头结点指针h赋给指针p1
while (p1 != NULL && p1->num != num) //查找结点的学号等于要查找学生学号的结点指针
{
p1 = p1->next;
}
if (p1 == NULL) //没有找到
{
cout << "抱歉啊,表中没有该记录的哦!";
return;
}
if (p1->num == num) //找到并显示信息
{
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
cout << p1->num << "\t" << p1->name << "\t" << p1->math << "\t" << p1->math << "\t" << p1->english << "\t" << p1->computer << "\t" << p1->scoresum << endl;
}
}
void record::FindRecord(struct score *h, string name) //根据学生姓名查找学生成绩信息
{
struct score *p1;
if (h == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
p1 = h;
while (p1 != NULL && p1->name != name) //查找结点的姓名等于要查找学生姓名的结点指针
{
p1 = p1->next;
}
if (p1 == NULL)
{
cout << "\n抱歉,表中没有该记录!";
return;
}
if (p1->name == name)
{
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
cout << p1->num << "\t" << p1->name << "\t" << p1->math << "\t" << p1->math << "\t" << p1->english << "\t" << p1->computer << "\t" << p1->scoresum << endl;
}
}
void record::StatisticRecord(struct score* h, int x)
{
struct score *p = h; //将链表的头结点指针赋给指针p
int count = 0;//定义统计人数count变量并赋初值为0
if (p == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
while (p)
{
if (x == 1)
if (p->math >= 60)
count += 1;
if (x == 2)
if (p->english >= 60)
count += 1;
if (x == 3)
if (p->computer >= 60)
count += 1;
p = p->next;
}
if (x == 1)
{
cout << "数学成绩及格人数为:";
cout << count;
cout << ",及格率为:";
cout << count / (float)studentSum << endl;
if (count < studentSum)
cout << "\n学号\t姓名\t数学" << endl;
else
cout << "没有数学成绩不及格学生" << endl;
}
else
{
if (x == 2)
{
cout << "英语成绩及格人数为:";
cout << count;
cout << ",及格率为:";
cout << count / (float)studentSum << endl;
if (count < studentSum)
cout << "\n学号\t姓名\t英语" << endl;
else
cout << "没有英语成绩不及格学生" << endl;
}
else
{
if (x == 3)
{
cout << "计算机成绩及格人数为:";
cout << count;
cout << ",及格率为:";
cout << count / (float)studentSum << endl;
if (count < studentSum)
cout << "\n学号\t姓名\t计算机" << endl;
else
cout << "没有计算机成绩不及格学生" << endl;
}
}
}
p = h;
while (p)
{
if (x == 1)
if (p->math < 60)
cout << p->num << "\t" << p->name << "\t" << p->math << endl;
if (x == 2)
if (p->english < 60)
cout << p->num << "\t" << p->name << "\t" << p->english << endl;
if (x == 13)
if (p->computer < 60)
cout << p->num << "\t" << p->name << "\t" << p->computer << endl;
p = p->next;
}
}
void record::StacRecordFind(struct score *h)
{
struct score *p = h;
int count = 0;
if (p == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
while (p)
{
if (p->math >= 90 && p->english >= 90 && p->computer >= 90)
{
count += 1;
}
p = p->next;
}
cout << "三门成绩全为优秀的学生人数为:";
cout << count << endl;
cout << "全为优秀的学生信息为:" << endl;
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
p = h;
while (p)
{
if (p->math >= 90 && p->english >= 90 && p->computer >= 90)
cout << p->num << "\t" << p->name << "\t" <<p->math<<"\t"<<p->english<<"\t"<< p->computer <<"\t"<<p->scoresum<< endl;
p = p->next;
}
}
void record::StacRecordDisq(struct score *h)
{
struct score *p = h;
int count = 0;
if (p == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
while (p)
{
if (p->math < 60 && p->english < 60 && p->computer < 60)
count += 1;
p = p->next;
}
cout << "三门成绩全不及格的学生人数为:";
cout << count << endl;
cout << "全为不及格的学生信息为:" << endl;
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
p = h;
while (p)
{
if (p->math <60 && p->english <60 && p->computer <60)
cout << p->num << "\t" << p->name << "\t" << p->math << "\t" << p->english << "\t" << p->computer << "\t" << p->scoresum << endl;
p = p->next;
}
}
void record::SaveRecordFile(struct score *h) //将链表中的数据写入文件
{
struct score *p;
ofstream ofile; //定义输出文件对象
ofile.open("score.dat", ios::out); //以定的方式打开文件score.dat,若该文件不存在,则创建score.dat文件
if (!ofile)
{
cout << "\n数据文件打开错误没有将数据写入文件!\n";
return;
}
ofile << "\n学号\t姓名\t数学\t英语\t计算机\t总分";
while (h)
{
ofile<<endl<< h->num << "\t" << h->name << "\t" << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum;
p = h; //将当前结点的数据信息写入到文件中
h = h->next;
delete p;
}
ofile.close();
}
struct score* record::LoadRecordFile(struct score *h)
{
ifstream ifile; //定义输入文件对象
ifile.open("score.dat", ios::in);//以读写方式打开文件score.dat
struct score *p, *q;
if (!ifile)
{
cout << "\n数据文件不存在,加载不成功!\n";
return NULL;
}
char s[50];
ifile.getline(s, 50); //读取文件指针当前行数据
while (!ifile.eof())
{
studentSum = studentSum + 1;
p = new score;
ifile >> p->num >> p->name >> p->math >> p->english >> p->computer >> p->scoresum; //
p->next = NULL;
if (h == NULL)
{
q = h = p;
}
else
{
q->next = p;
q = p;
}
}
ifile.close();
return h;
}
void SystemMenu(record r)
{
int choice;
while (1)
{
cout << "\n\t\t欢迎进入学生成绩管理系统!";
cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
cout << "\n\t1、添加学生成绩信息";
cout << "\n\t2、删除学生成绩信息";
cout << "\n\t3、修改学生成绩信息";
cout << "\n\t4、查询学生成绩信息";
cout << "\n\t5、显示所有学生成绩信息";
cout << "\n\t6、统计学生成绩信息";
cout << "\n\t0、退出系统";
cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
cout << "\n请根据提示选择操作:";
cin >> choice;
switch (choice)
{
case 1: //增加学生成绩信息
head = r.InsertRecord(head);
break;
case 2: //删除学生成绩信息
head = r.DeleteRecord(head);
break;
case 3: //修改学生成绩信息
head = r.UpdateRecord(head);
break;
case 4: //查询活到成绩信息
while (1)
{
int c;
cout << "\n*************************************";
cout << "\n\t1、根据学号查询学生成绩信息";
cout << "\n\t2、根据姓名查询学生成绩信息";
cout << "\n\t3、根据数学分数查询学生成绩信息";
cout << "\n\t4、根据英语分数查询学生成绩信息";
cout << "\n\t5、根据计算机基础成绩查询学生成绩信息";
cout << "\n\t6、返回上级目录";
cout << "\n*************************************";
cout << "\n请根据提示选择操作:"; //显示查询子菜单
cin >> c;
if (c == 1) //根据学生学号查询学生成绩信息
{
int x;
cout << "\n请输入需要查询的学生学号:";
cin >> x;
r.FindRecord(head, x);
}
if (c == 2) //根据学生姓名查询学生成绩信息
{
string name;
cout << "\n请输入需要查询的学生姓名:";
cin >> name;
r.FindRecord(head, name);
}
if (c == 3) //根据数学分数段查询学生成绩信息
{
float s1, s2;
cout << "\n请输入查询的数学最低分的最高分:";
cin >> s1 >> s2;
r.FindRecord(head, 1, s1, s2);
}
if (c == 4) //根据英语分数段查询学生成绩信息
{
float s1, s2;
cout << "\n请输入查询的英语最低分的最高分:";
cin >> s1 >> s2;
r.FindRecord(head, 2, s1, s2);
}
if (c == 5) //根据计算机分数段查询学生成绩信息
{
float s1, s2;
cout << "\n请输入查询的计算机基础最低分的最高分:";
cin >> s1 >> s2;
r.FindRecord(head, 3, s1, s2);
}
if (c == 6) //退出查询子菜单
break;
}
break;
case 5: //输出所有学生成绩信息
r.PrintRecord(head);
break;
case 6: //统计学生成绩信息
while (1)
{
int c;
cout << "\n***********************************************************";
cout << "\n\t1、统计数学成绩及格学生人数,并显示不及格学生信息";
cout << "\n\t2、统计英语成绩及格学生人数,并显示不及格学生信息";
cout << "\n\t3、统计计算机成绩及格学生人数,并显示不及格学生信息";
cout << "\n\t4、统计三门功课都不及格的学生人数,并显示学生信息(〉=90)";
cout << "\n\t5、统计三门功课都优秀的学生人数,并显示学生信息";
cout << "\n\t6、返回上级目录";
cout << "\n***********************************************************";
cout << "\n请根据提示选择操作:"; //显示统计子菜单
cin >> c;
if (c == 1)
{
r.StatisticRecord(head, 1);//统计数学成绩及格人数,并显示不及格学生信息
}
if (c == 2)
{
r.StatisticRecord(head, 2);//统计英语成绩及格人数,并显示不及格学生信息
}
if (c == 3)
{
r.StatisticRecord(head, 3);//统计计算机成绩及格人数,并显示不及格学生信息
}
if (c == 4)
{
r.StacRecordFind(head);//统计三门功课都不及格学生人数,并显示学生信息
}
if (c == 5)
{
r.StacRecordDisq(head);//统计三门功课都优秀学生人数,并显示学生信息
}
if (c == 6) //退出统计子菜单
break;
}
break;
}
if (choice == 0)//退出系统
break;
}
}
int main()
{
head = NULL;
record r; //定义record类的对象r
head = r.LoadRecordFile(head); //将文件中的数据读取到链表中
SystemMenu(r); //显示系统菜单,并处理用户选择
r.SaveRecordFile(head); //将链表中的数据写到文件中
return 0;
}
c++学生信息管理系统,主要就是考察对文件读写,循环、条件、输入输出、结构体等等基本知识的使用,比较综合的一个程序。资料还挺多的,开源的代码也有,你参考下,结合自己I的需求改下即可:
(c++)简易学生成绩管理系统:https://blog.csdn.net/weixin_56187542/article/details/126678718
C++学生成绩管理系统示例
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
const int MAX_SIZE = 1000; // 最大学生数
const string FILE1_NAME = "file1.txt";
const string FILE2_NAME = "file2.txt";
const string FILE3_NAME = "file3.txt";
const string FILE4_NAME = "file4.txt";
// 学生成绩结构体
struct Student {
string name; // 姓名
int score1; // 成绩1
int score2; // 成绩2
int score3; // 成绩3
int totalScore; // 总分
friend bool operator < (const Student& a, const Student& b) {
return a.totalScore > b.totalScore;
}
};
// 读取学生数据,返回学生数
int readStudents(const string& fileName, vector<Student>& students) {
ifstream fin(fileName);
if (!fin) {
cout << "Error: failed to open file " << fileName << endl;
return 0;
}
int count = 0;
while (!fin.eof()) {
Student s;
fin >> s.name >> s.score1 >> s.score2 >> s.score3;
s.totalScore = s.score1 + s.score2 + s.score3;
students.push_back(s);
count++;
}
fin.close();
return count - 1; // 减去文件最后一行的空行
}
// 写学生数据到文件
void writeStudents(const string& fileName, const vector<Student>& students) {
ofstream fout(fileName);
if (!fout) {
cout << "Error: failed to open file " << fileName << endl;
return;
}
for (const auto& s : students) {
fout << s.name << " " << s.score1 << " " << s.score2 << " " << s.score3 << endl;
}
fout.close();
}
// 将有补考的学生成绩保存到文件4
void saveMakeupStudents(const string& fileName, const vector<Student>& students) {
ofstream fout(fileName);
if (!fout) {
cout << "Error: failed to open file " << fileName << endl;
return;
}
for (const auto& s : students) {
if (s.score1 < 60 || s.score2 < 60 || s.score3 < 60) {
fout << s.name << " " << s.score1 << " " << s.score2 << " " << s.score3 << endl;
}
}
fout.close();
}
// 按总分降序排序学生数据
void sortByTotalScore(vector<Student>& students) {
sort(students.begin(), students.end());
}
// 查找学生数据
bool findStudent(const string& name, const vector<Student>& students, Student& result) {
for (const auto& s : students) {
if (name == s.name) {
result = s;
return true;
}
}
return false;
}
int main() {
vector<Student> students1, students2, students3, students;
int count1 = readStudents(FILE1_NAME, students1);
int count2 = readStudents(FILE2_NAME, students2);
// 合并学生数据到vector students3
students3 = students1;
students3.insert(students3.end(), students2.begin(), students2.end());
// 写入合并后的学生数据到文件3
writeStudents(FILE3_NAME, students3);
// 保存有补考的学生成绩到文件4
saveMakeupStudents(FILE4_NAME, students3);
// 按总分降序排序学生数据
sortByTotalScore(students3);
// 查找学生数据
string name;
cout << "Please input student's name: ";
cin >> name;
Student result;
if (findStudent(name, students3, result)) {
cout << "Name: " << result.name << endl;
cout << "Score1: " << result.score1 << endl;
cout << "Score2: " << result.score2 << endl;
cout << "Score3: " << result.score3 << endl;
cout << "Total Score: " << result.totalScore << endl;
} else {
cout << "Error: cannot find student " << name << endl;
}
return 0;
}