#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);
}
大一时的管理系统
最新推荐文章于 2024-08-03 21:15:16 发布