📄 information.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//定义数据对象的类型
typedef struct student
{
char ID[16];
char name[16];
int score[2];
}ElemType;
typedef int STATUS;
typedef struct SqList
{
ElemType *elem;
int length;
int listsize;
}SqList;
STATUS InitList(SqList &L )
{
L.elem = (ElemType*)malloc(100 *sizeof(ElemType) );
if(!L.elem ) exit(OVERFLOW );
L.length=0;
L.listsize=100;
return OK;
}//构建一个线性表
STATUS ListDelete(SqList &L,int i, ElemType&e)
{
ElemType *p,*q;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length -1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length ;
return OK;
}//删除L的的i个数据元数,并用e返回其值,L的长度减1
STATUS DestroyList(SqList &L){
free(&L);
return OK;
}//销毁线性表 条件:线性表存在
STATUS ClearList(SqList &L){
int i;
ElemType e;
for(i=L.length;i>=1;i--){
ListDelete(L,i,e);
}
return OK;
}//将L重置为空表 条件:线性表存在
STATUS Listempty(SqList &L){
if (L.length>0) return FALSE;
else return TRUE;
return OK;
}//若表为空返回TRUE,否则返回FALSE 条件:线性表存在
int ListLength(SqList L )
{
return L.length;
}
STATUS GetElem(SqList&L,int i,ElemType &e){
strcpy(e.ID,L.elem[i].ID);
strcpy(e.name,L.elem[i].name);
e.score[0] = L.elem[i].score[0];
e.score[1] = L.elem[i].score[1];
return OK;
}//用e返回L中第i个元素
STATUS LocateElem(SqList&L, ElemType e, STATUS (*compare)(ElemType e1, ElemType e2) )
{
int i = 1;
ElemType *p ;
p=L.elem;
while(i<=L.length &&!(*compare)(*p++,e))++i;
if(i<=L.length )return i;
return 0; //元素e不在顺序表中,返回0
}//返回L中第1个与e满足关系compare()的数据元数的位序
STATUS ListInsert(SqList &L, int i, ElemType e )
{
ElemType *p, *q;
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length -1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length ;
return OK;
}//在L中第i个位置之前插入新的数据元数e,L的长度加1
STATUS ListModify(SqList&L, int i, ElemType e )
{
ElemType *p ;
p = &L.elem[i];
*p = e;
return OK;
}//修改L中第i个位置的数据,并用e返回该值
/* 用户操作界面启动时,在显示器上显示一些欢迎信息 */
void PrintWelcome( )
{
puts("按Enter键进入");
}
/* 在显示器上显示用户可以进行的操作,以及操作的方法 */
void PrintOption( )
{
getchar();
getchar();
system("cls");
puts(" ");
puts(" ********************************************************************" );
puts(" 欢迎使用学生成绩管理系统!" );
puts(" ********************************************************************" );
puts(" ");
puts(" 请您选择操作:输入<1~7>" );
puts(" 1:添加学生 2:删除学生 3:修改学生信息" );
puts(" 4:查询学生成绩 5:成绩统计 6:打印所有信息 " );
puts(" 7:退出系统 " );
puts(" ");
}
/* 程序退出时,在显示器上显示一些感谢语言,以给使用者一个好印象 */
void PrintHello( )
{
getchar();
puts("********************************************************************" );
puts(" 谢谢您使用学生成绩管理系统,再见!" );
puts("********************************************************************" );
puts(" ");
}
//比较两个学生信息的学号是否相等
//若相等则返回TRUE,否则返回FALSE
//当调用顺序表操作函数int LocateElem(LinkList L, ElemType e, STATUS (*compare)(ElemType e1, ElemType e2)
//的时候,将该函数名作为第三个参数传递给compare
STATUS IsEqual(ElemType e1, ElemType e2 )
{
if( strcmp(e1.ID, e2.ID)==0 )
return TRUE;
return FALSE;
}
//往顺序表中添加一个学生
void AddStu(SqList &L)
{
ElemType stu;
printf("请输入学生的学号:" );
getchar(); //吃掉前面的回车键,否则后面的字符串输入时会出错
gets(stu.ID );
printf("请输入学生的姓名:" );
gets(stu.name );
printf("请输入学生数学成绩:" );
scanf("%d", &stu.score[0] );
printf("请输入学生数据结构成绩:" );
scanf("%d", &stu.score[1] );
//判断顺序表中是否已经存在该学号的学生,如果已经存在,则放弃插入操作
if( LocateElem(L, stu, IsEqual) )
{
puts("操作失败,该学生已经存在" );
return;
}
if( ListInsert(L,L.length+1, stu ) )
puts("操作成功" );
else
puts("操作失败" );
}
//从顺序表中删除一个学生,根据学生的学号决定删除哪个学生
void DelStu(SqList &L)
{
ElemType stu;
int pos;
printf("请输入学生的学号:" );
getchar(); //吃掉前面的回车键,否则后面的字符串输入时会出错
gets(stu.ID );
pos = LocateElem(L, stu, IsEqual ); //如果存在该学号的学生,则返回其在顺序表中的位序,如果不存在返回0
if(pos)
{
if(ListDelete(L, pos, stu) )
{
puts("操作成功");
return;
}
}
puts("操作失败" );
}
//修改学生信息,根据学号决定修改信息
void ModifyStu(SqList&L)
{
int pos;
ElemType stu;
printf("请输入学生的学号:" );
getchar(); //吃掉前面的回车键,否则后面的字符串输入时会出错
gets(stu.ID);
printf("请输入学生的姓名:" );
gets(stu.name );
printf("请输入学生数学成绩:" );
scanf("%d", &stu.score[0] );
printf("请输入学生数据结构成绩:" );
scanf("%d", &stu.score[1] );
pos = LocateElem(L, stu, IsEqual );
if(pos > 0 )
{
ListModify(L, pos-1, stu );
puts("操作成功" );
}
else
{
puts("操作失败,不存在该学生" );
}
}
STATUS PrntOneStu(ElemType stu )
{
puts("学号 : 姓名 : 数学 : 数据结构 ");
printf("%s : %s : %d : %d\n", stu.ID, stu.name, stu.score[0], stu.score[1] );
return OK;
}
//打印所有学生信息
void PrntAll(SqList&L)
{
int i;
puts("学号 : 姓名 : 数学 : 数据结构 ");
for(i=0;i<=L.length-1;i++)
printf("%s : %s : %d : %d\n", L.elem[i].ID, L.elem[i].name, L.elem[i].score[0], L.elem[i].score[1] );
}
//根据学号查询某个学生的成绩
void chkStu(SqList&L)
{
int pos;
ElemType stu;
printf("请输入学生的学号:" );
getchar(); //吃掉前面的回车键,否则后面的字符串输入时会出错
gets(stu.ID );
if(pos = LocateElem(L, stu, IsEqual) )
{
GetElem(L, pos-1, stu );
PrntOneStu(stu );
}
else
{
puts("操作失败,不存在该学生" );
}
}
//成绩统计,统计全体学生的平均成绩
void StateScore(SqList &L)
{
float total[2] = {0.0, 0.0};
int num = 0;
while(num<=L.length-1)
{
total[0] += L.elem[num].score[0];
total[1] += L.elem[num].score[1];
num++;
}
if(num > 0 )
{
printf("统计全体学生的平均成绩:\n");
printf("数学:%.2f, 数据结构:%.2f\n", total[0]/num, total[1]/num );
}
else
{
puts("没有数据信息" );
}
}
//该函数根据用户的选择,完成指定的操作
void UserOperate(SqList &L)
{
int option = 0;
PrintWelcome( ); //显示欢迎信息
while(option != 7)
{
//提示用户操作选择
PrintOption( );
scanf("%d", &option );
//根据用户选择调用相关函数完成指定的操作
switch(option )
{
//添加一个学生
case 1:
AddStu(L);
printf("请按Enter键返回");
break;
//删除学生
case 2:
DelStu(L);
printf("请按Enter键返回");
break;
//修改学生成绩
case 3:
ModifyStu(L);
printf("请按Enter键返回");
break;
//查询某个学生的成绩
case 4:
chkStu(L);
printf("请按Enter键返回");
break;
//成绩统计
case 5:
StateScore(L);
printf("请按Enter键返回");
break;
//打印所有学生信息
case 6:
PrntAll(L);
printf("请按Enter键返回");
break;
default: break;
}
}
PrintHello();//程序退出时,显示
}
void LoadData(SqList&L)
{
FILE *pfile; //文件指针
long lstunum= 0; //学生数
long i;
//打开保存学生信息的数据文件
//文件名为:stuscore.dat
pfile = fopen("stuscore.dat", "rb" );
if(pfile == NULL)
{
printf("文件打开失败!\n" );
exit(0 );
}
//从文件中读入学生数,即文件中前四个字节所表示的整数
//如果文件中内容少于四个字节,默认为有0个学生
//如果读入的学生个数是负数,说明数据文件被破坏
if( fread(&lstunum, sizeof(lstunum), 1, pfile) != 0 )
{
if(lstunum < 0 )
{
printf("数据文件被破坏!\n" );
exit(0 );
}
L.length = lstunum;
//顺序读入每个学生信息,放到线性表中
for(i=0; i<lstunum; i++ )
{
fread(&L.elem[i], sizeof(ElemType), 1, pfile);
}
fclose(pfile );
}
}
void SaveData(SqList &L)
{
int i;
FILE *pfile;
//打开保存学生信息的数据文件
//文件名为:stuscore.dat
pfile = fopen("stuscore.dat", "wb" );
if(pfile == NULL )
{
printf("文件打开失败!\n" );
exit(0 );
}
fwrite(&L.length,sizeof(int),1,pfile);
for(i=0;i<=L.length -1;i++)
fwrite(&L.elem[i],sizeof(ElemType),1,pfile);
fclose(pfile );
pfile = NULL;
}
void main()
{
SqList L;//定义线性表
InitList(L );//初始化顺序表
LoadData(L);//读取文件中的数据
UserOperate(L);//调用用户界面,接受用户的操作选择
SaveData(L);//将数据保存到数据中
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -