⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 information.cpp

📁 学生管理系统
💻 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 + -