学生成绩管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 1000

typedef struct student{
	char ID[10];
	char name[20];
	char sex;
	float score[5];
	float total;
	float avg;
}STU;

void display(void);						/*显示主菜单*/
void load(STU stu[], int *nPtr);    	/*把学生信息加载到内存*/
void save(STU stu[], int n);     		/*将数据保存到磁盘*/
void sort(STU stu[], int n);    		/*排序*/
void InputRecord(STU stu[],int i);     	/*输入一条记录*/
void find(STU stu[], int n);   			/*查找*/
void del(STU stu[], int *nPtr);			/*删除*/
void add(STU stu[], int *nPtr); 		/*添加一条记录*/
void edit(STU stu[],int n); 			/*修改一条记录*/
void output(STU stu[], int n);			/*输出所有信息*/


int main(){
	STU stu[N];
	int n, select;
	load(stu, &n);		 /*加载数据到stu数组*/
	while(1)
	{		
		display();    		 /*显示主菜单*/
		scanf("%d", &select);
		switch(select)
		{
			case 1: 		/*添加*/
			add(stu, &n);	break;
			case 2: 		/*修改*/
			edit(stu, n);	break;
			case 3:		/*排序*/
			sort(stu, n);	break;
			case 4:		/*查找*/
			find(stu, n);	break;
			case 5:		/*删除*/
			del(stu, &n);	break;
			case 6:		/*输出*/
			output(stu, n);	break;
			case 7:   		 /*退出*/ 
			return 0;	 
		}
	}
}

/*调用InputRecord函数添加若干学生信息,
并把新添加的学生信息依次保存到文件中*/
void add(STU stu[], int *nPtr)
{

	char sel = 'y';
	
	while(sel == 'y')
	{
		InputRecord(stu, (*nPtr)++ );    /*添加第n+1个学生信息*/
		save(stu, *nPtr);
		printf("是否继续添加(yes--y,no--n)\n");
		scanf(" %c", &sel);
	}
	
}
/*显示主菜单*/
void display(void)
{
	system("cls");
	printf("欢迎使用本学生成绩管理系统\n");
	printf("说明:在本系统中欲执行某功能请输入相应数字\n");
	printf("1 添加\n"); 	//可连续添加新记录
	printf("2 修改\n");         //按指定学号修改
	printf("3 排序\n");         //按学号升序、总分降序、总分升序排序
	printf("4 查找\n");      //按学号
	printf("5 删除\n");     //按学号
	printf("6 输出\n");    
	printf("7 退出\n");
	
}
int FindByNum(STU stu[], int n, char *str){
	int i;
	for(i = 0; i < n; i++){
		if(strcmp(stu[i].ID, str) == 0){
			return i;
		}
	}
	return -1;
}
/*输出指针sPtr所指记录的内容*/
void PrintRecord(STU *sPtr){
	int i;
	
	printf("%8s%8s%4c", sPtr->ID, sPtr->name, sPtr->sex);
	
	for(i = 0; i < 5; i++){
		printf("%8.2f", sPtr->score[i]);
	}
	printf("%8.2f%8.2f", sPtr->total, sPtr->avg);
	printf("\n");
}


void load(STU stu[], int *nPtr)
{
	FILE *fp;
	int i;
	
	if((fp = fopen("student.dat", "r")) == NULL) 
	{
		*nPtr = 0;
		return;
	}
	
	/*把文件中的信息全部读取到stu中*/
	for(i = 0; fread(&stu[i], sizeof(STU), 1, fp) != 0; i++)
	*nPtr  =  i;    	/* *nPtr记录文件中当前学生数量 */
	fclose(fp); 	/*关闭文件*/
}


void edit(STU stu[],int n){
	int i, index;
	char sel;
	char str[20];
	
	printf("请输入学号:\n");
	scanf("%s", str);
	
	index = FindByNum(stu,n,str);
	
	if(index < 0){
		printf("该学生不存在!\n");
		return; 
	}
	
	printf("修改前的信息:\n");
	PrintRecord(&stu[index]);
	
	//修改姓名
	printf("是否修改姓名?请输入y or n:\n");
	getchar();
	scanf("%c",&sel);
	if(sel == 'y'){
		printf("请输入姓名:\n");
		scanf("%s", stu[index].name);
	}
	//修改性别 
	printf("是否修改性别?请输入y or n:\n");
	getchar();
	scanf("%c", &sel);
	
	if(sel == 'y'){
		printf("请输入f or m:\n");
		getchar();
		scanf("%c", &stu[index].sex);
	}
	
	//修改成绩 
	printf("是否修改成绩?请输入y or n:\n");
	getchar();
	scanf("%c", &sel);
	
	if(sel == 'y'){
		stu[index].total = 0;
		
		printf("请输入5门课程成绩:\n");
		for(i = 0; i < 5; i++){
			scanf("%f", &stu[index].score[i]);
			stu[index].total = stu[index].total + stu[index].score[i];
		}
		stu[index].avg = stu[index].total / 5;
	}
	
	save(stu, n);
}

void InputRecord(STU stu[], int i){
	int j;
	printf("请输入第%d个学生的信息",i+2);
	
	printf("请输入学生的学号(学号小于9位数字)\n");
	scanf("%s", stu[i+1].ID);
	
	printf("请输入学生的姓名\n");
	scanf("%s", stu[i+1].name);
	
	printf("请输入学生的性别(f代表女,m代表男)\n");
	scanf(" %c", &stu[i+1].sex);
	
	printf("请输入五门课的成绩(0~100)\n");
	stu[i+1].total = 0;
	for(j = 0; j < 5; j++){
		scanf("%f",&stu[i+1].score[j]);
		stu[i+1].total += stu[i+1].score[j];
	}
	 
	stu[i+1].avg = stu[i+1].total / 5;
}


void save(STU stu[], int n)
{
	FILE *fp;
	if( (fp = fopen("student.dat","w")) == NULL)
	{
		printf("打开文件失败\n");
		exit(0);
	}
	
	fwrite(stu, (n+1)* sizeof(stu[0]), 1, fp);   //将n个记录写入文件
	fclose(fp);   
}

void output(STU stu[],int n){
	int i;
	
	/*打印表头*/
	printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX","SCORE1","SCORE2","SCORE3","SCORE4","SCORE5","total","avg");
	/*打印所有记录*/
	
	for(i = 0;i <=n;i++){
		PrintRecord(&stu[i]);
	}
	system("pause");
}


void sort(STU stu[], int n){
	int select, i, j;
	int (*cmp)(STU a, STU b);
	
	int ScoreAsc(STU a, STU b); 
	int ScoreDes(STU a, STU b); 
	int NameAsc(STU a, STU b);
	
	printf("1 按总分升序排列\n");
	printf("2 按总分降序排列\n");
	printf("3 按姓名升序排列\n");
	scanf("%d",&select) ;
	
	switch(select){
		case 1: cmp = ScoreAsc;break;
		case 2: cmp = ScoreDes;break;
		case 3: cmp = NameAsc;break;
		default:return;
	}
	for(i = 0; i < n; i++){
		for(j = 0; j < n-i; j++){
			if((*cmp)(stu[j],stu[j+1])){
				STU t;
				t = stu[j];
				stu[j] = stu[j+1];
				stu[j+1] = t;
			}
		}
	}
	output(stu, n);	
}

int ScoreAsc(STU a,STU b){
	return a.total <b.total ? 1 : -1;
}

int ScoreDes(STU a,STU b){
	return a.total >b.total ? 1 : -1;
}

int NameAsc(STU a,STU b){
	return strcmp(a.name, b.name)>0? 1:-1;
}



void find(STU stu[], int n){
	int index;
	char str[20];
	
	printf("请输入学号:\n");
	scanf("%s", str);
	index = FindByNum(stu, n+1, str);
	
	if(index >= 0){
printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX","SCORE1","SCORE2","SCORE3","SCORE4","SCORE5","total","avg");
		PrintRecord(&stu[index]);
	}
	else
		printf("该学生信息不存在!\n");
	
	system("pause");
}

void del(STU stu[], int *nPtr){
	int i, index;
	char str[20];
	
	printf("请输入学号:\n");
	scanf("%s", str);
	index = FindByNum(stu, *nPtr, str);
	
	if(index < 0){
		printf("\n 该学生信息不存在!\n");
		return ;
	}
	
	for(i = index; i < *nPtr - 1; i++){
		stu[i] = stu[i+1];
	}
	(*nPtr)--;
	
	printf("\n删除成功!\n");
	save(stu, *nPtr); 
}



  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值