文章目录
学生信息管理系统
知识点如下:
- 数组遍历
- 结构体、结构体指针、结构体数组
- 函数调用
- 文件处理
功能如下:
- 登入验证
- 文件存储信息
- 录入/浏览学生信息
- 查找(按学号、姓名)/修改/删除学生信息
- 排序(按单科、三科成绩)/求平均分数/求最高低分学生信息
视频展示:
一、项目思路
在做一个项目时,需要知道如何去做?怎样按步骤?第一步该做什么,第二步该做什么?
1、模块化思想
- 学生系统:学生需要写哪些属性(学号、姓名、成绩等);学生的数量
- 将学生系统的中的每个功能作为一个模块,通过一个函数来实现
2、流程图
二、功能框架
1、系统菜单
//2.绘制菜单
void menu() {
printf("*---------------【管理系统】-------------*\n");
printf("\t\t0.退出功能\n");
printf("\t\t1.录入信息\n");
printf("\t\t2.浏览信息\n");
printf("\t\t3.查找信息\n");
printf("\t\t4.修改信息\n");
printf("\t\t5.删除信息\n");
printf("\t\t6.排序显示\n");
printf("\t\t7.平均分数\n");
printf("\t\t8.最高低分\n");
printf("*---------------------------------------*\n");
printf("请输入要实现的功能(0-8):\n");
}
运行效果:
2、其他功能
利用模块化思想将每个模块用一个函数来实现
//1.创建系统
pSys createSystem() {
}
//2.绘制菜单
void menu() {
}
//4.录入信息
void insertData(pSys psystem) {
}
//5.浏览信息
void printData(pSys psystem) {
}
//6.查找信息
void searchMenu() {
}
void searchByStudentNumber(pSys psystem) {
}
void searchByName(pSys psystem) {
}
void searchData(pSys psystem) {
}
//7.修改信息
void modifyData(pSys psystem) {
}
//8.删除信息
void deleteData(pSys psystem) {
}
//9.排序显示
void sortMenu() {
}
void sortByEnglish(pSys psystem) {
}
void sortByTotal(pSys psystem) {
}
void sortData(pSys psystem) {
}
//10.平均分数
void calAverage(pSys psystem) {
}
//11.最高低分数
void highLow(pSys psystem) {
}
//12.文件读写
void readFile(pSys psystem, const char* fileName) {
}
//13.登入验证
void login() {
}
//3.按键操作
void keyDown(pSys psystem) {
}
int main() {
while (1)
{
}
return 0;
}
三、分布实现
0.学生属性/系统属性
(1)学生属性
因学生具有多种属性,则具有多种数据类型(字符型、整型、浮点型等);利用结构体存储学生信息;
//学生信息
typedef struct Student {
char number[20]; //学号
char name[20]; //姓名
int english; //英语成绩
int math; //数学成绩
int chinese; //语文成绩
double score; //总分
}Stu, * pStu;
(2)系统属性
系统属性包括学生信息、学生数量;
//系统信息
typedef struct System {
Stu stuInfo[100];
int curSize; //当前学生数量
}Sys, * pSys;
1.创建系统
//1.创建系统
pSys createSystem() {
pSys psystem = (pSys)malloc(sizeof(Sys)); //申请内存
assert(psystem); //断言处理:判断内存是否申请成功
psystem->curSize = 0;
return psystem;
}
2.绘制菜单
//2.绘制菜单
void menu() {
printf("*---------------【管理系统】-------------*\n");
printf("\t\t0.退出功能\n");
printf("\t\t1.录入信息\n");
printf("\t\t2.浏览信息\n");
printf("\t\t3.查找信息\n");
printf("\t\t4.修改信息\n");
printf("\t\t5.删除信息\n");
printf("\t\t6.排序显示\n");
printf("\t\t7.平均分数\n");
printf("\t\t8.最高低分\n");
printf("*---------------------------------------*\n");
printf("请输入要实现的功能(0-8):\n");
}
3.按键操作
通过按键输入指令,再利用switch
判断指令并调用相关函数;
//3.按键操作
void keyDown(pSys psystem) {
int userkey = 0;
scanf_s("%d", &userkey);
switch (userkey)
{
case 0:
printf("----退出----\n");
exit(0);
break;
case 1:
printf("----录入----\n");
insertData(psystem);
writeFile(psystem, "studentInfo.txt");
break;
case 2:
printf("----浏览----\n");
printData(psystem);
break;
case 3:
printf("----查找----\n");
searchData(psystem);
break;
case 4:
printf("----修改----\n");
modifyData(psystem);
writeFile(psystem, "studentInfo.txt");
break;
case 5:
printf("----删除----\n");
deleteData(psystem);
writeFile(psystem, "studentInfo.txt");
break;
case 6:
printf("----排序----\n");
sortData(psystem);
break;
case 7:
printf("----平均分数----\n");
calAverage(psystem);
break;
case 8:
printf("----最高低分----\n");
highLow(psystem);
break;
default:
printf("----Error----\n");
break;
}
}
4.录入信息
//4.录入信息
void insertData(pSys psystem) {
int userkey = 0;
while (1)
{
printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
scanf_s("%s%s%d%d%d",
psystem->stuInfo[psystem->curSize].number, 20,
psystem->stuInfo[psystem->curSize].name, 20,
&psystem->stuInfo[psystem->curSize].english,
&psystem->stuInfo[psystem->curSize].math,
&psystem->stuInfo[psystem->curSize].chinese);
psystem->curSize++;
printf("是否继续录入信息?(y/n):");
while (getchar() != '\n');
userkey = getchar();
if (userkey == 'N' || userkey == 'n') {
break;
}
while (getchar() != '\n');
printf("录入信息成功\n");
}
}
5.浏览信息
通过数组遍历方式,打印学生信息;
//5.浏览信息
void printData(pSys psystem) {
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
6.查找信息
绘制一个查找菜单,通过两种方式查找;一种是根据学号查找,另一种是根据姓名查找;
//6.查找信息
//查找菜单
void searchMenu() {
printf("--------【查找菜单】--------\n");
printf("\t1.按学号查找\n");
printf("\t2.按姓名查找\n");
printf("---------------------------\n");
printf("请输入查找方式(1-2):");
}
//1.通过学号查找
void searchByStudentNumber(pSys psystem) {
int flag = 0;
char student_number[20] = { "" };
printf("请输入查找的学号:\n");
scanf_s("%s", student_number, 20);
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
flag = 1;
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
if (flag == 0) {
printf("查找失败\n");
}
else
printf("查找成功\n");
}
//2.通过姓名查找
void searchByName(pSys psystem) {
int flag = 0;
char name[20] = { "" };
printf("请输入查找的姓名:\n");
scanf_s("%s", name, 20);
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
if (strcmp(name, psystem->stuInfo[i].name) == 0) {
flag = 1;
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
if (flag == 0) {
printf("查找失败\n");
}
else
printf("查找成功\n");
}
//键盘输入指令;选择
void searchData(pSys psystem) {
int userkey = 0;
while (1)
{
searchMenu();
scanf_s("%d", &userkey);
switch (userkey)
{
case 1:
searchByStudentNumber(psystem);
break;
case 2:
searchByName(psystem);
break;
default:
printf("----Error----\n");
break;
}
printf("是否继续查找?(y/n):");
while (getchar() != '\n'); //清除缓冲区
userkey = getchar();
if (userkey == 'N' || userkey == 'n') {
break;
}
system("cls");
}
}
7.修改信息
首先通过学号找到该同学的数组坐标,然后进行修改信息;
//7.修改信息
void modifyData(pSys psystem) {
int pos = -1; //第一个数据可能是数组下标0,所以要从-1开始
int i = 0;
char student_number[20] = { "" };
printf("请输入修改的学号:");
scanf_s("%s", student_number, 20);
for (i = 0; i < psystem->curSize; i++) {
if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
pos = i;
break;
}
}
if (pos == -1) {
printf("未找到修改的信息\n");
}
else {
printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
scanf_s("%s%s%d%d%d",
psystem->stuInfo[pos].number, 20,
psystem->stuInfo[pos].name, 20,
&psystem->stuInfo[pos].english,
&psystem->stuInfo[pos].math,
&psystem->stuInfo[pos].chinese);
printf("修改成功\n");
}
}
8.删除信息
//8.删除信息
void deleteData(pSys psystem) {
int pos = -1;
int i = 0, j = 0;
char student_number[20] = { "" };
printf("请输入删除的学号:");
scanf_s("%s", student_number, 20);
for (i = 0; i < psystem->curSize; i++) {
if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
pos = i;
break;
}
}
if (pos == -1) {
printf("未找到删除的信息\n");
}
else {
for (int j = i; j < psystem->curSize - 1; j++) {
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
}
psystem->curSize--;
printf("删除成功\n");
}
}
9.排序显示
绘制一个排序菜单,通过两种方式排序;一种是根据单科成绩(本项目是英语成绩;可自行修改),另一种是三科总分;
//9.排序显示
void sortMenu() {
printf("--------【排序菜单】------\n");
printf("\t1.按英语成绩\n");
printf("\t2.按三科总分\n");
printf("-------------------------\n");
printf("请输入(1-2):");
}
void sortByEnglish(pSys psystem) {
for (int i = 0; i < psystem->curSize; i++) {
for (int j = 0; j < psystem->curSize - 1 - i; j++) {
if (psystem->stuInfo[j].english > psystem->stuInfo[j + 1].english) {
Stu temp = psystem->stuInfo[j];
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
psystem->stuInfo[j + 1] = temp;
}
}
}
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = psystem->curSize - 1; i >= 0; i--) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
void sortByTotal(pSys psystem) {
double total = 0;
for (int i = 0; i < psystem->curSize; i++) {
total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
psystem->stuInfo[i].score = total;
}
for (int i = 0; i < psystem->curSize; i++) {
for (int j = 0; j < psystem->curSize - 1 - i; j++) {
if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
Stu temp = psystem->stuInfo[j];
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
psystem->stuInfo[j + 1] = temp;
}
}
}
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = psystem->curSize - 1; i >= 0; i--) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
void sortData(pSys psystem) {
int userkey = 0;
while (1)
{
sortMenu();
scanf_s("%d", &userkey);
switch (userkey)
{
case 1:
sortByEnglish(psystem);
break;
case 2:
sortByTotal(psystem);
break;
default:
printf("----Error---\n");
break;
}
printf("是否继续排序?(y/n):");
while (getchar() != '\n');
userkey = getchar();
if (userkey == 'N' || userkey == 'n')
break;
system("cls");
}
}
10.平均分数
本项目的平均分数是求每科的平均分数;可以自己写总分的平均分数;
//10.平均分数
void calAverage(pSys psystem) {
int sum1 = 0, sum2 = 0, sum3 = 0;
double average1 = 0, average2 = 0, average3 = 0;
for (int i = 0; i < psystem->curSize; i++) {
sum1 += psystem->stuInfo[i].english;
sum2 += psystem->stuInfo[i].math;
sum3 += psystem->stuInfo[i].chinese;
}
average1 = sum1 / psystem->curSize;
average2 = sum2 / psystem->curSize;
average3 = sum3 / psystem->curSize;
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
printf("\n");
printf("平均分数\t\t英语\t数学\t语文\n");
printf("平均分数\t %.2f\t%.2f\t%.2f\n", average1, average2, average3);
}
11.最高低分数
先求出每个学生的三科总分,然后通过冒泡排序方式进行排序,最后得出最高分与最低分的数组坐标并打印出来;
//11.最高低分数
void highLow(pSys psystem) {
double total = 0;
for (int i = 0; i < psystem->curSize; i++) {
total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
psystem->stuInfo[i].score = total;
}
for (int i = 0; i < psystem->curSize; i++) {
for (int j = 0; j < psystem->curSize - 1 - i; j++) {
if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
Stu temp = psystem->stuInfo[j];
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
psystem->stuInfo[j + 1] = temp;
}
}
}
if (psystem->curSize >= 1) {
printf("--------------最高分数--------------\n");
printf("学号\t\t姓名\t英语\t数学\t语文\n");
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[psystem->curSize - 1].number,
psystem->stuInfo[psystem->curSize - 1].name,
psystem->stuInfo[psystem->curSize - 1].english,
psystem->stuInfo[psystem->curSize - 1].math,
psystem->stuInfo[psystem->curSize - 1].chinese);
printf("\n");
printf("--------------最低分数--------------\n");
printf("学号\t\t姓名\t英语\t数学\t语文\n");
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[0].number,
psystem->stuInfo[0].name,
psystem->stuInfo[0].english,
psystem->stuInfo[0].math,
psystem->stuInfo[0].chinese);
}
}
12.文件读写
通过文件指针FILE* fp
访问文件,如果没有学生信息文件,则创建文件;通过fopen
、fclose
、fscanf
、fprintf
函数操作文件进行打开关闭、读写;
//12.文件读写
//读学生信息
void readFile(pSys psystem, const char* fileName) {
FILE* fp = fopen(fileName, "r");
if (fp == NULL) {
fp = fopen(fileName, "w+");
}
while (fscanf(fp, "%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[psystem->curSize].number,
psystem->stuInfo[psystem->curSize].name,
&psystem->stuInfo[psystem->curSize].english,
&psystem->stuInfo[psystem->curSize].math,
&psystem->stuInfo[psystem->curSize].chinese) != EOF)
{
psystem->curSize++;
}
fclose(fp);
}
//写学生信息
void writeFile(pSys psystem, const char* fileName) {
FILE* fp = fopen(fileName, "w+");
for (int i = 0; i < psystem->curSize; i++) {
fprintf(fp, "%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
13.登入验证
登入验证通过用户名与密码一起登入验证,用户输入密码用*
来保护密码;
//13.登入验证
void login() {
char username[20] = { "" };
char password[20] = { "" };
printf("----登入验证----\n");
printf("用户名:");
gets_s(username, 20);
printf("密 码:");
int key = 0;
int i = 0;
while ((key = _getch()) != '\r')
{
if (key == '\b') {
printf("\b \b");
i--;
continue;
}
putchar('*');
password[i++] = key;
}
password[i] = '\0';
printf("\n");
if (!strcmp(username, "root") && !strcmp(password, "123456")) {
printf("登入成功!\n");
}
else {
printf("登入失败!\n");
exit(0);
}
}
效果如下:
四、完整代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
//学生信息
typedef struct Student {
char number[20]; //学号
char name[20]; //姓名
int english; //英语成绩
int math; //数学成绩
int chinese; //语文成绩
double score; //总分
}Stu, * pStu;
//系统信息
typedef struct System {
Stu stuInfo[100];
int curSize; //当前学生数量
}Sys, * pSys;
//1.创建系统
pSys createSystem() {
pSys psystem = (pSys)malloc(sizeof(Sys)); //申请内存
assert(psystem); //断言处理:判断内存是否申请成功
psystem->curSize = 0;
return psystem;
}
//2.绘制菜单
void menu() {
printf("*---------------【管理系统】-------------*\n");
printf("\t\t0.退出功能\n");
printf("\t\t1.录入信息\n");
printf("\t\t2.浏览信息\n");
printf("\t\t3.查找信息\n");
printf("\t\t4.修改信息\n");
printf("\t\t5.删除信息\n");
printf("\t\t6.排序显示\n");
printf("\t\t7.平均分数\n");
printf("\t\t8.最高低分\n");
printf("*---------------------------------------*\n");
printf("请输入要实现的功能(0-8):\n");
}
//4.录入信息
void insertData(pSys psystem) {
int userkey = 0;
while (1)
{
printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
scanf_s("%s%s%d%d%d",
psystem->stuInfo[psystem->curSize].number, 20,
psystem->stuInfo[psystem->curSize].name, 20,
&psystem->stuInfo[psystem->curSize].english,
&psystem->stuInfo[psystem->curSize].math,
&psystem->stuInfo[psystem->curSize].chinese);
psystem->curSize++;
printf("是否继续录入信息?(y/n):");
while (getchar() != '\n');
userkey = getchar();
if (userkey == 'N' || userkey == 'n') {
break;
}
while (getchar() != '\n');
printf("录入信息成功\n");
}
}
//5.浏览信息
void printData(pSys psystem) {
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
//6.查找信息
void searchMenu() {
printf("--------【查找菜单】--------\n");
printf("\t1.按学号查找\n");
printf("\t2.按姓名查找\n");
printf("---------------------------\n");
printf("请输入查找方式(1-2):");
}
void searchByStudentNumber(pSys psystem) {
int flag = 0;
char student_number[20] = { "" };
printf("请输入查找的学号:\n");
scanf_s("%s", student_number, 20);
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
flag = 1;
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
if (flag == 0) {
printf("查找失败\n");
}
else
printf("查找成功\n");
}
void searchByName(pSys psystem) {
int flag = 0;
char name[20] = { "" };
printf("请输入查找的姓名:\n");
scanf_s("%s", name, 20);
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
if (strcmp(name, psystem->stuInfo[i].name) == 0) {
flag = 1;
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
if (flag == 0) {
printf("查找失败\n");
}
else
printf("查找成功\n");
}
void searchData(pSys psystem) {
int userkey = 0;
while (1)
{
searchMenu();
scanf_s("%d", &userkey);
switch (userkey)
{
case 1:
searchByStudentNumber(psystem);
break;
case 2:
searchByName(psystem);
break;
default:
printf("----Error----\n");
break;
}
printf("是否继续查找?(y/n):");
while (getchar() != '\n'); //清除缓冲区
userkey = getchar();
if (userkey == 'N' || userkey == 'n') {
break;
}
system("cls");
}
}
//7.修改信息
void modifyData(pSys psystem) {
int pos = -1; //第一个数据可能是数组下标0,所以要从-1开始
int i = 0;
char student_number[20] = { "" };
printf("请输入修改的学号:");
scanf_s("%s", student_number, 20);
for (i = 0; i < psystem->curSize; i++) {
if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
pos = i;
break;
}
}
if (pos == -1) {
printf("未找到修改的信息\n");
}
else {
printf("请输入学生信息(Student_number,Name,English,Math,Chinese):\n");
scanf_s("%s%s%d%d%d",
psystem->stuInfo[pos].number, 20,
psystem->stuInfo[pos].name, 20,
&psystem->stuInfo[pos].english,
&psystem->stuInfo[pos].math,
&psystem->stuInfo[pos].chinese);
printf("修改成功\n");
}
}
//8.删除信息
void deleteData(pSys psystem) {
int pos = -1;
int i = 0, j = 0;
char student_number[20] = { "" };
printf("请输入删除的学号:");
scanf_s("%s", student_number, 20);
for (i = 0; i < psystem->curSize; i++) {
if (strcmp(student_number, psystem->stuInfo[i].number) == 0) {
pos = i;
break;
}
}
if (pos == -1) {
printf("未找到删除的信息\n");
}
else {
for (int j = i; j < psystem->curSize - 1; j++) {
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
}
psystem->curSize--;
printf("删除成功\n");
}
}
//9.排序显示
void sortMenu() {
printf("--------【排序菜单】------\n");
printf("\t1.按英语成绩\n");
printf("\t2.按三科总分\n");
printf("-------------------------\n");
printf("请输入(1-2):");
}
void sortByEnglish(pSys psystem) {
for (int i = 0; i < psystem->curSize; i++) {
for (int j = 0; j < psystem->curSize - 1 - i; j++) {
if (psystem->stuInfo[j].english > psystem->stuInfo[j + 1].english) {
Stu temp = psystem->stuInfo[j];
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
psystem->stuInfo[j + 1] = temp;
}
}
}
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = psystem->curSize - 1; i >= 0; i--) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
void sortByTotal(pSys psystem) {
double total = 0;
for (int i = 0; i < psystem->curSize; i++) {
total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
psystem->stuInfo[i].score = total;
}
for (int i = 0; i < psystem->curSize; i++) {
for (int j = 0; j < psystem->curSize - 1 - i; j++) {
if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
Stu temp = psystem->stuInfo[j];
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
psystem->stuInfo[j + 1] = temp;
}
}
}
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = psystem->curSize - 1; i >= 0; i--) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
void sortData(pSys psystem) {
int userkey = 0;
while (1)
{
sortMenu();
scanf_s("%d", &userkey);
switch (userkey)
{
case 1:
sortByEnglish(psystem);
break;
case 2:
sortByTotal(psystem);
break;
default:
printf("----Error---\n");
break;
}
printf("是否继续排序?(y/n):");
while (getchar() != '\n');
userkey = getchar();
if (userkey == 'N' || userkey == 'n')
break;
system("cls");
}
}
//10.平均分数
void calAverage(pSys psystem) {
int sum1 = 0, sum2 = 0, sum3 = 0;
double average1 = 0, average2 = 0, average3 = 0;
for (int i = 0; i < psystem->curSize; i++) {
sum1 += psystem->stuInfo[i].english;
sum2 += psystem->stuInfo[i].math;
sum3 += psystem->stuInfo[i].chinese;
}
average1 = sum1 / psystem->curSize;
average2 = sum2 / psystem->curSize;
average3 = sum3 / psystem->curSize;
printf("学号\t\t姓名\t英语\t数学\t语文\n");
for (int i = 0; i < psystem->curSize; i++) {
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
printf("\n");
printf("平均分数\t\t英语\t数学\t语文\n");
printf("平均分数\t %.2f\t%.2f\t%.2f\n", average1, average2, average3);
}
//11.最高低分数
void highLow(pSys psystem) {
double total = 0;
for (int i = 0; i < psystem->curSize; i++) {
total = psystem->stuInfo[i].english + psystem->stuInfo[i].math + psystem->stuInfo[i].chinese;
psystem->stuInfo[i].score = total;
}
for (int i = 0; i < psystem->curSize; i++) {
for (int j = 0; j < psystem->curSize - 1 - i; j++) {
if (psystem->stuInfo[j].score > psystem->stuInfo[j + 1].score) {
Stu temp = psystem->stuInfo[j];
psystem->stuInfo[j] = psystem->stuInfo[j + 1];
psystem->stuInfo[j + 1] = temp;
}
}
}
if (psystem->curSize >= 1) {
printf("--------------最高分数--------------\n");
printf("学号\t\t姓名\t英语\t数学\t语文\n");
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[psystem->curSize - 1].number,
psystem->stuInfo[psystem->curSize - 1].name,
psystem->stuInfo[psystem->curSize - 1].english,
psystem->stuInfo[psystem->curSize - 1].math,
psystem->stuInfo[psystem->curSize - 1].chinese);
printf("\n");
printf("--------------最低分数--------------\n");
printf("学号\t\t姓名\t英语\t数学\t语文\n");
printf("%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[0].number,
psystem->stuInfo[0].name,
psystem->stuInfo[0].english,
psystem->stuInfo[0].math,
psystem->stuInfo[0].chinese);
}
}
//12.文件读写
void readFile(pSys psystem, const char* fileName) {
FILE* fp = fopen(fileName, "r");
if (fp == NULL) {
fp = fopen(fileName, "w+");
}
while (fscanf(fp, "%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[psystem->curSize].number,
psystem->stuInfo[psystem->curSize].name,
&psystem->stuInfo[psystem->curSize].english,
&psystem->stuInfo[psystem->curSize].math,
&psystem->stuInfo[psystem->curSize].chinese) != EOF)
{
psystem->curSize++;
}
fclose(fp);
}
void writeFile(pSys psystem, const char* fileName) {
FILE* fp = fopen(fileName, "w+");
for (int i = 0; i < psystem->curSize; i++) {
fprintf(fp, "%s\t%s\t%d\t%d\t%d\n",
psystem->stuInfo[i].number,
psystem->stuInfo[i].name,
psystem->stuInfo[i].english,
psystem->stuInfo[i].math,
psystem->stuInfo[i].chinese);
}
}
//13.登入验证
void login() {
char username[20] = { "" };
char password[20] = { "" };
printf("----登入验证----\n");
printf("用户名:");
gets_s(username, 20);
printf("密 码:");
int key = 0;
int i = 0;
while ((key = _getch()) != '\r')
{
if (key == '\b') {
printf("\b \b");
i--;
continue;
}
putchar('*');
password[i++] = key;
}
password[i] = '\0';
printf("\n");
if (!strcmp(username, "root") && !strcmp(password, "123456")) {
printf("登入成功!\n");
}
else {
printf("登入失败!\n");
exit(0);
}
}
//3.按键操作
void keyDown(pSys psystem) {
int userkey = 0;
scanf_s("%d", &userkey);
switch (userkey)
{
case 0:
printf("----退出----\n");
exit(0);
break;
case 1:
printf("----录入----\n");
insertData(psystem);
writeFile(psystem, "studentInfo.txt");
break;
case 2:
printf("----浏览----\n");
printData(psystem);
break;
case 3:
printf("----查找----\n");
searchData(psystem);
break;
case 4:
printf("----修改----\n");
modifyData(psystem);
writeFile(psystem, "studentInfo.txt");
break;
case 5:
printf("----删除----\n");
deleteData(psystem);
writeFile(psystem, "studentInfo.txt");
break;
case 6:
printf("----排序----\n");
sortData(psystem);
break;
case 7:
printf("----平均分数----\n");
calAverage(psystem);
break;
case 8:
printf("----最高低分----\n");
highLow(psystem);
break;
default:
printf("----Error----\n");
break;
}
}
int main() {
login();
system("cls"); //清屏
pSys psystem = createSystem(); //创建系统
readFile(psystem, "studentInfo.txt");
while (1)
{
menu();
keyDown(psystem);
system("pause"); //按任意键继续
system("cls"); //清屏
}
return 0;
}
感谢阅读,如有不足之处,欢迎来指正。谢谢!