大一时的管理系统

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

#define LEN 9
#define N 48

//由于本代码使用了部分VS已不再支持的内置函数,所以请用Dev-c++打开

//创建结构体
typedef struct student {
	char id[LEN];
	char name[10];
	char sex[2];
	int score;
	struct student *pnext;
} St;

St *head;

int i = 0;                                           //i是总学生人数。
char filename[20];

void meau();		//菜单
void seek();		//寻找
void insert();		//添加
void modify();		//修改
void printByScore();//成绩排名
void del();			//删除
void refresh();		//刷新
void save();		//保存
void display();		//输出全部学生信息
void openfile();	//打开或创建文件
void COLOR_PRINT(const char *s, int color);		//实现部分字体换色

int main() {
	system("cls");
	system("color 02");
	openfile();
	return 0;
}

void openfile() {
	char b;
	head = (St *)malloc(sizeof(St));
	FILE *fp;
	head->pnext = (St *)malloc(sizeof(St));
	St *ptemp = NULL;
	St *pnew = NULL;
start:
	system("date/t");
	system("time/t");
	printf("*---------------------------*\n");
	printf("*  说明:文件格式为文本文件  *\n");
	printf("*  例:学生信息管理系统.txt  *\n");
	printf("*---------------------------*\n");
	printf("\n请输入您想进行管理学生信息的文件名或想要创建的文件名");
	COLOR_PRINT("(记得加后缀哦!):", 1);
	scanf("%s", filename);
	if ((fp = fopen(filename, "r")) == NULL) {
		printf("\n该文件不存在,您想创建一个以<%s>命名新文件吗?(Y/N)\n", filename);
		fflush(stdin);
		scanf("%c", &b);
		if ('y' == b || 'Y' == b) {
			if ((fp = fopen(filename, "a+")) == NULL)
				printf("\n文件创建失败!!!");
			else {
				COLOR_PRINT("\n文件创建成功,第一次创建文件请先添加学生信息。\n", 1);
				COLOR_PRINT("\n请按任意键进入系统菜单选项。\n\n", 1);
				system("pause");
				i = 0;
				meau();
			}
		} else {
			system("cls");
			goto start;
		}
	} else {
		while (1) {
			pnew = (St *)malloc(sizeof(St));
			if ((fscanf(fp, "%s%s%s%d", pnew->id, pnew->name, pnew->sex, &pnew->score)) == EOF) {
				free(pnew);
				break;
			} else if (i == 0) {
				head->pnext = pnew;
				pnew->pnext = NULL;
				ptemp = head->pnext;
			} else {
				pnew->pnext = NULL;
				ptemp->pnext = pnew;
				ptemp = ptemp->pnext;
			}
			i++;
		}
		fclose(fp);
		COLOR_PRINT("\n文件打开成功,若文件为空,请在系统菜单选项中先添加学生信息。\n", 1);
		COLOR_PRINT("\n请按任意键进入系统菜单选项...\n\n", 1);
		fflush(stdin);
		getchar();
		meau();
	}
}

void meau() {	//菜单栏
	while (1) {
		system("cls");
		system("date/t");
		system("time/t");
		system("color 02");
		int num;
		printf("**********************************************************\n");
		printf("*                  欢迎使用学生信息管理系统              *\n");
		printf("*                    请选择您想进行的操作                *\n");
		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");
		printf("*                     8.按成绩排名输出当前学生信息       *\n");
		printf("*                     0.退出学生信息管理系统             *\n");
		printf("**********************************************************\n");
		printf("\n\n\n\n\n\n");
		printf("请输入您要进行的操作:");
start:
		scanf("%d", &num);
		switch (num) {
			case 1:
				seek();
				break;
			case 2:
				insert();
				break;
			case 3:
				modify();
				break;
			case 4:
				del();
				break;
			case 5:
				refresh();
				break;
			case 6:
				save();
				break;
			case 7:
				display();
				break;
			case 8:
				printByScore();
				break;
			case 0: {
				system("cls");
				printf("\n即将退出菜单,谢谢您的使用!!!\n");
				printf("\n若您想完全退出系统,可直接点击右上角的x进行关闭\n");
				system("pause");
				i = 0;
				openfile();
				break;
			}
			default:
				printf("请输入0-7之间的数字,请重新输入:");
				goto start;
		}
	}
}

void seek() {
	system("cls");
	int num, n, f = 0;
	St *ptemp = NULL;
	char a[10];
	printf("\n********************************\n");
	printf("*        1.按学号查询          *\n");
	printf("*        2.按姓名查询          *\n");
	printf("********************************\n");
	printf("\n\n\n\n请输入您要查询的方式:");
	scanf("%d", &num);
	switch (num) {
		case 1: {
			printf("请输入您要查询的学号:");
Id:
			scanf("%s", a);
			for (ptemp = head; ptemp; ptemp = ptemp->pnext) {
				if (0 == strcmp(a, ptemp->id)) {
					f = 1;
					printf("\n学生学号:%s", ptemp->id);
					printf("\n学生姓名:%s", ptemp->name);
					printf("\n学生性别:%s", ptemp->sex);
					printf("\n学生成绩:%d分\n", ptemp->score);
				}
			}
			if (0 == f) {
				printf("找学号不存在,若您想回到菜单,可输入<quit>,其他任意键将进行重新输入");
				printf("\n请输入您想执行的操作:");
				char qq[10];
				scanf("%s", qq);
				if (strcmp(qq, "quit") == 0) {
					return;
				} else {
					printf("\n请重新输入学号:");
					goto Id;
				}
			}
		}
		break;
		case 2:	{
			printf("请输入您要查询的姓名:");
Name:
			scanf("%s", a);
			for (ptemp = head; ptemp; ptemp = ptemp->pnext) {
				if (0 == strcmp(a, ptemp->name)) {
					f = 1;
					printf("\n学生学号:%s", ptemp->id);
					printf("\n学生姓名:%s", ptemp->name);
					printf("\n学生性别:%s", ptemp->sex);
					printf("\n学生成绩:%d分\n", ptemp->score);
				}
			}
			if (0 == f) {
				printf("找学号不存在,若您想回到菜单,可输入<quit>,其他任意键将进行重新输入");
				printf("\n请输入您想执行的操作:");
				char qq[10];
				scanf("%s", qq);
				if (strcmp(qq, "quit") == 0) {
					return;
				} else {
					printf("\n请重新输入学号:");
					goto Name;
				}
			}
			break;
		}
	}
	system("pause");
	meau();
}

void insert() {
	int n, num;
	FILE *p;
	St *pnew = NULL;
	St *ptemp = NULL;
	if (i == 0) {
		head->pnext = NULL;
	}
	system("cls");
	printf("您要添加的学员信息人数:");
	scanf("%d", &num);
//	if(i!=0)
	for (n = 0; n < num; n++) {
		pnew = (St *)malloc(sizeof(St));
		printf("\n*---------------请输入需要添加的学生信息----------------*");
start:
		printf("\n正在添加第%d名学生信息", n + 1);
		printf("\n请输入学生学号:");
		scanf("%s", pnew->id);
		//判断该学号之前是否存在
		ptemp = head->pnext;
		while (ptemp != NULL) {
			if (0 == strcmp(ptemp->id, pnew->id)) {
				printf("该学号已存在,请重新输入!!!");
				goto start;
			} else
				ptemp = ptemp->pnext;
		}

		printf("\n请输入学生姓名:");
		scanf("%s", pnew->name);
		printf("\n请输入学生性别:");
		scanf("%s", pnew->sex);
		printf("\n请输入学生成绩:");
		scanf("%d", &pnew->score);
		printf("\n第%d名学生信息添加成功", n + 1);
		ptemp = head->pnext;
		//一个学生都没有,放在第一个
		if (head->pnext == NULL) {
			pnew->pnext = NULL;
			head->pnext = pnew;
		}
		// 按学号顺序添加
		else {
			ptemp = head->pnext;
			while (ptemp != NULL) {
				//该学生学号前后都有学生,放在中间
				if (ptemp->pnext) {
					if (strcmp(pnew->id, ptemp->id) > 0 && strcmp(pnew->id, ptemp->pnext->id) < 0) {
						pnew->pnext = ptemp->pnext;
						ptemp->pnext = pnew;
						break;
					}
				}
				//该学生学号放在最后一个
				else {
					if (strcmp(pnew->id, ptemp->id) < 0) {
						pnew->pnext = ptemp;
						head->pnext = pnew;
						ptemp->pnext = NULL;
					} else {
						ptemp->pnext = pnew;
						pnew->pnext = NULL;
					}
					break;
				}
				ptemp = ptemp->pnext;
			}
		}
	}
	i = i + num;
	printf("\n若添加信息存在错误,请在菜单选项中进行更改");
	printf("\n如果添加信息没有错误,记得退出前在菜单进行保存!!!\n");
	system("pause");
}

void modify() {
	system("cls");
	int n, f = 0, num;
	char a[10];
	printf("*---------------请以学号的方式修改学生信息----------------*\n\n");
	printf("请输入需要修改学生的学号:");
start:
	scanf("%s", a);
	St *ptemp = head->pnext;
	//遍历链表进行查找
	for (; ptemp; ptemp = ptemp->pnext) {
		if (0 == strcmp(a, ptemp->id)) {
			f = 1;
			printf("\n该学生存在");
			printf("\n该学生的信息如下\n");
			printf("*|----------------------------------------------|*\n");
			printf("*|学号\t\t姓名\t性别\t成绩            |*\n");
			printf("*|%-8s\t%s\t%s\t%d              |*\n", ptemp->id, ptemp->name, ptemp->sex, ptemp->score);
			printf("*|----------------------------------------------|*\n");
			printf("\n\n\n\n*---------------请输入需要修改的学生信息----------------*");
			printf("\n********************************\n");
			printf("*          1.修改姓名            *\n");
			printf("*          2.修改性别            *\n");
			printf("*          3.修改成绩            *\n");
			printf("**********************************\n");
			break;
		}
	}
	if (0 == f) {
		printf("该学号不存在,若您想回到菜单,可输入<quit>,其他任意键将进行重新输入");
		printf("\n请输入您想执行的操作:");
		char qq[10];
		scanf("%s", qq);
		if (strcmp(qq, "quit") == 0) {
			return;
		} else {
			printf("\n请重新输入学号:");
			goto start;
		}
	} else {
enheng:
		scanf("%d", &num);
		switch (num) {
			case 1:
				printf("\n请输入修改后的姓名:");
				scanf("%s", ptemp->name);
				break;
			case 2:
				printf("\n请输入修改后的性别:");
				scanf("%s", ptemp->sex);
				break;
			case 3:
				printf("\n请输入修改后的成绩:");
				scanf("%d", &ptemp->score);
				break;
			default :
				printf("输入错误,请重新输入:");
				goto enheng;
		}
	}
	printf("\n若您修改的信息没有问题可在菜单界面进行保存。");
	printf("\n请按任意键继续...");
	fflush(stdin);
	getchar();
}

void del() {
	char a[10], b;
	int n, j, f = 0;
	system("cls");
	printf("*---------删除学生只能用学号方式进行删除----------*\n");
	printf("请输入您想删除信息的学生的学号:");
start:
	scanf("%s", a);
	St *ptemp = head->pnext;
	St *shadow = head;
	for (; ptemp; shadow = ptemp, ptemp = ptemp->pnext) {
		if (strcmp(a, ptemp->id) == 0) {
			f = 1;
			printf("\n该学生存在,您确定要删除该学生吗?(Y/N)\n");
			break;
		}
	}
	if (0 == f) {
		printf("找学号不存在,若您想回到菜单,可输入<quit>,其他任意键将进行重新输入");
		printf("\n请输入您想执行的操作:");
		char qq[10];
		scanf("%s", qq);
		if (strcmp(qq, "quit") == 0) {
			return;
		} else {
			printf("\n请重新输入学号:");
			goto start;
		}
	}
	getchar();
lula:
	scanf("%c", &b);
	if ('Y' == b || 'y' == b) {
		shadow->pnext = ptemp->pnext;
		free(ptemp);
		printf("\n删除成功!!!");
		i = i - 1;
		printf("\n若删除无误,您可在菜单界面进行保存");
		printf("\n按任意键继续...");
		fflush(stdin);
		getchar();
		return;
	} else if ('n' == b || 'N' == b) {
		return;
	} else {
		printf("\n您输入有误,请重新输入:");
		goto lula;
	}
}

void quickSort(int l, int r, St arr[]) {
	if (l >= r)
		return;
	int i = l - 1, j = r + 1, x = arr[(l + r) >> 1].score;
	while (i < j) {
		do
			i++;
		while (arr[i].score < x);
		do
			j--;
		while (arr[j].score > x);
		if (i < j) {
			St a3 = arr[i];
			arr[i] = arr[j];
			arr[j] = a3;
		}
	}
	quickSort(l, j, arr);
	quickSort(j + 1, r, arr);
}

void printByScore() {
	int n;
	St *ptemp;
	St students[10000];
	int length = 0;
	double all_score = 0;
	system("cls");
	printf("目前保存的学生信息共%d名(按成绩从高到低进行排序)\n", i);
	printf("学号\t\t姓名\t性别\t成绩\t排名\n");
	printf("------------------------------------------------\n");

	if (0 != i) {
		for (ptemp = head->pnext; ptemp; ptemp = ptemp->pnext) {
			strcpy(students[length].id, ptemp->id);
			strcpy(students[length].name, ptemp->name);
			students[length].pnext = NULL;
			students[length].score = ptemp->score;
			strcpy(students[length].sex, ptemp->sex);
			all_score += ptemp->score;
			length++;
		}
		quickSort(0, length - 1, students);
		for (int idx = length - 1; idx >= 0 ; idx--) {
			printf("%-8s\t%s\t%s\t%d\t%d", students[idx].id, students[idx].name, students[idx].sex, students[idx].score,
			       length - idx);
			printf("\n");
		}
		printf("学生平均成绩为: %.2lf\n", all_score / length);

	} else
		printf("\n\n目前无任何学生信息\n") ;
	system("pause");
	return;
}

void save() {
	system("cls");
	FILE *p;
	p = fopen(filename, "w");
	St *ptemp;
	int n;
	if (i != 0) {
		for (ptemp = head->pnext, n = 0; ptemp && n <= i; ptemp = ptemp->pnext, n++) {
			fprintf(p, "%s %s %s %d", ptemp->id, ptemp->name, ptemp->sex, ptemp->score);
			if (n != i)
				fputs("\n", p);
		}
	}
	fclose(p);
	printf("保存成功!!!\n");
	system("pause");
	return;
}

void display() {
	int n;
	double all_score = 0;
	St *ptemp;
	system("cls");
	printf("目前保存的学生信息共%d名(默认排序方式是按学号从小到大进行排序)\n", i);
	printf("学号\t\t姓名\t性别\t成绩\n");
	printf("------------------------------------------------\n");
	if (0 != i) {
		for (ptemp = head->pnext; ptemp; ptemp = ptemp->pnext) {
			printf("%-8s\t%s\t%s\t%d", ptemp->id, ptemp->name, ptemp->sex, ptemp->score);
			printf("\n");
			all_score += ptemp->score;
		}
		printf("所有学生的平均成绩为: %.2lf", all_score / i);
	} else
		printf("\n\n目前无任何学生信息\n");
	system("pause");
	return;
}

void refresh() {
	char b;
	FILE *fp;
	St *ptemp = head->pnext;
	St *shadow = head;
	system("cls");
	printf("刷新学生信息将删除文件中保存的所有学生信息,您确定要刷新吗?Y/N\n");
	getchar();
	scanf("%c", &b);
	if ('y' == b || 'Y' == b) {
		while (ptemp) {
			shadow = ptemp;
			ptemp = ptemp->pnext;
			shadow = NULL;
		}
		i = 0;
		printf("学生信息刷新成功。\n");
		printf("若要保存刷新后的学生信息,请在菜单界面中进行保存\n");
		system("pause");
		return;
	} else
		return;
}

void COLOR_PRINT(const char *s, int color) {
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);
	printf(s);
	SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值