成绩管理系统在save模块后如果关闭重新开始无法通过read功能直接调用已保存的数据,只显示一个学号。
听说是因为二进制导致的,能不能帮我换成fprintf和fclose形式?
#include <iostream>
#include <string>
#include <cstdlib>//exit
#include <iomanip>/tw()
#include<stdio.h>
using namespace std;
//创建结构体
typedef struct{
public:
int num;//学号
string name;//姓名
double score;//成绩
}student;
typedef struct{
student *elem;//存储空间的基地址
int length;//表长度
}Sqlist;
//初始化
void init_stu(Sqlist &L){
L.elem=new student[1000];//最多存储1000名学生信息
if(L.elem==NULL) exit(0);
L.length=0;
}
//表格标签
void table(){
cout<<endl;
cout<<setiosflags(ios::left)<<setw(20)<<"学号";
cout<<setw(20)<<"姓名";
cout<<setw(20)<<"成绩"<<endl;
for(int a=0;a<20;a++){
cout<<"-----";
}
cout<<endl;
}
//添加功能
void add(Sqlist &L){
int i;
cout<<"请入要添加的学生个数:";
cin>>i;
for(int j=0;j<i;j++){
cout<<"请输入第"<<j+1<<"个学生的学号:";
cin>>L.elem[L.length].num;
cout<<"请输入第"<<j+1<<"个学生的姓名:";
cin>>L.elem[L.length].name;
cout<<"请输入第"<<j+1<<"个学生的成绩:";
cin>>L.elem[L.length].score;
L.length++;
}
}
//显示功能
void output(Sqlist &L){
table();
for(int i=0;i<L.length;i++){
cout<<setiosflags(ios::left)<<setw(20)<<L.elem[i].num;
cout<<setw(20)<<L.elem[i].name;
cout<<setw(20)<<L.elem[i].score<<endl;
}
for(int a=0;a<20;a++){
cout<<"-----";
}
cout<<endl;
}
//选择菜单
void menu(){
cout<<"****************************************************"<<endl;
cout<<" 欢迎加入成绩管理系统 "<<endl;
cout<<"******1.数据录入 2.数据显示***************"<<endl;
cout<<"******3.数据删除 4.数据排序***************"<<endl;
cout<<"******5.数据分析 6.数据保存***************"<<endl;
cout<<"******7.数据调入 8.成绩查询***************"<<endl;
cout<<"******9.成绩统计(总分,平均分)********************"<<endl;
cout<<"******10.退出系统***********************************"<<endl;
cout<<"请选择功能号(1,2,3,4,5,6,7,8,9,10)"<<endl;
}
//删除功能
void del(Sqlist &L){
string a;
int flag=0;
cout<<"请输入要删除的学生姓名:";
cin>>a;
for(int i=0;i<L.length;i++){
if(L.elem[i].name==a){
flag++;
// cout<<i<<endl;
for(i;i<L.length;i++){
L.elem[i]=L.elem[i+1];
L.length--;
cout<<"删除成功"<<endl;
}
}
}
if(flag==0){
cout<<"没有该找到学生信息,无法进行删除"<<endl;
}
}
//分类功能
void alter(Sqlist &L){
int num;
for(int i=0;i<L.length;i++)
{if (L.elem[i].score>=90 && L.elem[i].score<=100)
cout <<L.elem[i].name<<" "<<L.elem[i].score<< "优秀"<<endl;
else if (L.elem[i].score>=80 && L.elem[i].score<=89)
cout <<L.elem[i].name<<" "<<L.elem[i].score<< "良好"<<endl;
else if (L.elem[i].score>=70 && L.elem[i].score<=79)
cout<<L.elem[i].name<<" "<<L.elem[i].score << "中等"<<endl;
else if (L.elem[i].score>=60 && L.elem[i].score<=69)
cout <<L.elem[i].name<<" "<<L.elem[i].score<< "及格"<<endl;
else if (L.elem[i].score>=0 && L.elem[i].score<=59)
cout <<L.elem[i].name<<" "<<L.elem[i].score<< "不及格"<<endl;
else
cout << "成绩不合规";}
}
void lookup1(Sqlist &L,int a){
table();
for(int e=0;e<L.length;e++){
if(L.elem[e].num==a){
cout<<setiosflags(ios::left)<<setw(20)<<L.elem[e].num;
cout<<setw(20)<<L.elem[e].name;
cout<<setw(20)<<L.elem[e].score<<endl;
}
}
for(int a=0;a<20;a++){
cout<<"-----";
}
cout<<endl;
}
void lookup2(Sqlist &L,string a){
table();
for(int e=0;e<L.length;e++){
if(L.elem[e].name==a){
cout<<setiosflags(ios::left)<<setw(20)<<L.elem[e].num;
cout<<setw(20)<<L.elem[e].name;
cout<<setw(20)<<L.elem[e].score<<endl;
}
}
for(int a=0;a<20;a++){
cout<<"-----";
}
cout<<endl;
}
void save(Sqlist &L)
{
FILE *fp = fopen("t.txt", "wb");
fwrite(&L.length, 1, sizeof(L.length), fp);
fwrite(L.elem, L.length, sizeof(student), fp);
fclose(fp);
}
void read(Sqlist &L)
{
FILE *fp = fopen("t.txt", "rb");
fread(&L.length, 1, sizeof(L.length), fp);
L.elem = new student[L.length];
fread(L.elem, L.length, sizeof(student), fp);
fclose(fp);
}
void sort(Sqlist &L)
{ int num;
student temp;
for(int i=L.length;i>0;i--){
for(int j=0;j<L.length-1;j++){
if(L.elem[j].score>L.elem[j+1].score){
temp=L.elem[j];
L.elem[j]=L.elem[j+1];
L.elem[j+1]=temp;
}
}
}
//输出排序
cout<<"姓名 成绩"<<endl;
for(int i=0;i<L.length;i++){
cout<<L.elem[i].num<<" "<<L.elem[i].name<<" "<<L.elem[i].score<<endl;
}
system("pause");
}
//主函数
int main(){
int num=0,m,b;
string u,v;
int a=1;
Sqlist M;
init_stu(M);
while(a){
menu();//菜单选择页面
cout<<"请输入您的选择:";
cin>>num;
switch(num){
case 1:
add(M);//添加学生信息
break;
case 2:
output(M);//显示所有学生的信息
system("pause");
break;
case 3:
del(M);//按姓名进行删除指定学生信息
system("pause");
break;
case 4:
cout<<"排序结果为"<<endl;
sort(M);
break;
case 5:
cout<<"成绩分类"<<endl;
alter(M);//按照姓名重新修改指定学生信息
system("pause");
case 6:
cout<<"数据保存"<<endl;
save(M);
break;
case 7:
cout<<"数据调入"<<endl;
read(M);
break;
break;
case 10://退出当前使用的成绩管理系统
cout<<"成功退出成绩管理系统"<<endl;
a=0;
break;
case 8:cout<<"1.按学号查找 2.按姓名查找"<<endl;
cin>>b;
switch(b)
{case 1:cout<<"学号为"<<endl;
cin>>m;
lookup1(M,m);
system("pause");
break;
case 2: cout<<"姓名为"<<endl;
cin>>u;
lookup2(M,u);
system("pause");
break;
default:break;
}
default:break;
}
system("cls");
}
system("pause");
return 0;
}