本系统通过多模块化设计进行开发,包含三个.c文件(main.c、function.c和extra.c)、一个function.h文件和一个student.txt文件。实现的功能有:对学生的学号自动分配,对学生数据的读取、插入、删除、查询、输出等,对学生成绩进行等级划分、名次排序等。
1、头文件:
#include
#include
#include
#include
2、数据结构:动态单链表
3、结构体:
typedef struct StuLink
{
int xh; //学生学号(由系统自动生成)
char xm[20]; //学生姓名
enum Sex_type xb; //学生性别(枚举类型)
int cj; //学生成绩(0-100之间)
char dj; //学生等级
int mc; //学生名次
struct StuLink *next; //单向链表next结点指向下一位学生
} StuLink;
4、枚举类型:
enum Sex_type{ boy = 0, girl = 1 };
5、全局变量:
int Max_xh = 0; //当前最大学号
int dj[6] = {0, 0, 0, 0, 0, 0}; //一维数组存储ABCDE各等级人数
//功能:从数据文件中逐行读取学生信息生成学生链表,返回头指针。
StuLink *ReadFromFile(FILE *fp, StuLink *head);
//功能:先将学生链表按学号升序排序,再将学生链表中的数据逐行保存到数据文件。
void SaveToFile(FILE *fp, StuLink *head);
//功能:在链表尾插入一个新结点,返回头指针
StuLink *InsertNode(StuLink *head);
//修改链表中指定学号的结点(学号不能修改,成绩必须在[0,100]区间的整数)。
void EditNode(StuLink *head, int num);
//功能:删除链表中指定学号的结点,返回头指针。
StuLink *DeleteNode(StuLink *head, int num);
//功能:查询链表中指定学号的结点,并显示查询结果
void QueryNode(StuLink *head, int num);
//功能:查询链表中不及格的所有结点,并显示查询结果
void QueryLink(StuLink *head);
//功能:计算链表中每个结点的名次。
void RankLink(StuLink *head);
//功能:统计并返回各等级人数。
void AnalysisLink(StuLink *head);
//功能:按指定数据项的顺序对学生链表进行排序。
void SortLink(StuLink *head, int choose);
//功能:按指定数据项的顺序输出学生成绩表、各等级人数。
void OutputLink_1(StuLink *head, int choose);
//功能:分页显示全部学生的信息。
void OutputLink_2(StuLink *head, int num);
//功能:匹配等级
void dj_change(StuLink *p);
//功能:确定学号
void xh_define(StuLink *p, StuLink *head);
//功能:计算人数
int count(StuLink *head);
//功能:开始菜单
void start_menu();
//功能:显示二级菜单,返回头指针
StuLink *menu(int choose1, StuLink *head);
//功能:交换两个学生的顺序
void exchange(StuLink *p1, StuLink *p2);
//功能:单独显示10个学生信息
void OutputLink_only10(StuLink *head, int start);
文件:student.txt
测试数据:
1 aaa 0 98 A 4
2 bbb 0 42 E 13
3 ccc 1 98 A 4
5 eee 1 75 C 11
7 rrr 0 91 A 7
8 qqq 0 70 C 12
10 mmm 1 86 B 9
11 kkk 0 98 A 4
12 ttt 0 42 E 13
13 小红 1 100 A 1
14 dzh 0 100 A 1
15 小蓝 0 85 B 10
16 小薇 1 90 A 8
17 小黑 0 100 A 1
c语言学生管理系统视频演示
function.h
#ifndef _FUNCTION_H_
#define _FUNCTION_H_
#include
#include
#include
#include
enum Sex_type
{
boy = 0, // 男生:0
girl = 1, //女生:1
};
typedef struct StuLink
{
int xh; //学生学号(由系统自动生成)
char xm[20]; //学生姓名
enum Sex_type xb; //学生性别(枚举类型)
int cj; //学生成绩(0-100之间)
char dj; //学生等级
int mc; //学生名次
struct StuLink *next; //单向链表next结点指向下一位学生
} StuLink;
//函数声明
//功能:从数据文件中逐行读取学生信息生成学生链表,返回头指针。
StuLink *ReadFromFile(FILE *fp, StuLink *head);
//功能:先将学生链表按学号升序排序,再将学生链表中的数据逐行保存到数据文件。
void SaveToFile(FILE *fp, StuLink *head);
//功能:在链表尾插入一个新结点,返回头指针
StuLink *InsertNode(StuLink *head);
//修改链表中指定学号的结点(学号不能修改,成绩必须在[0,100]区间的整数)。
void EditNode(StuLink *head, int num);
//功能:删除链表中指定学号的结点,返回头指针。
StuLink *DeleteNode(StuLink *head, int num);
//功能:查询链表中指定学号的结点,并显示查询结果
void QueryNode(StuLink *head, int num);
//功能:查询链表中不及格的所有结点,并显示查询结果
void QueryLink(StuLink *head);
//功能:计算链表中每个结点的名次。
void RankLink(StuLink *head);
//功能:统计并返回各等级人数。
void AnalysisLink(StuLink *head);
//功能:按指定数据项的顺序对学生链表进行排序。
void SortLink(StuLink *head, int choose);
//功能:按指定数据项的顺序输出学生成绩表、各等级人数。
void OutputLink_1(StuLink *head, int choose);
//功能:分页显示全部学生的信息。
void OutputLink_2(StuLink *head, int num);
//功能:匹配等级
void dj_change(StuLink *p);
//功能:确定学号
void xh_define(StuLink *p, StuLink *head);
//功能:计算人数
int count(StuLink *head);
//功能:开始菜单
void start_menu();
//功能:显示二级菜单,返回头指针
StuLink *menu(int choose1, StuLink *head);
//功能:交换两个学生的顺序
void exchange(StuLink *p1, StuLink *p2);
//功能:单独显示10个学生信息
void OutputLink_only10(StuLink *head, int start);
#endif
function.c
#include "function.h"
int Max_xh = 1; //当前最大学号
int dj[6] = {0, 0, 0, 0, 0, 0}; //一维数组存储ABCDE各等级人数
StuLink *ReadFromFile(FILE *fp, StuLink *head)
{
StuLink *p1 = NULL, *p2 = NULL;
char ch;
int i = 0;
if ((fp = fopen("student.txt", "r")) == NULL)
{
fp = fopen("student.txt", "w");
} //判断是否正常打开文件并使指向文件
head = NULL;
ch = fgetc(fp);
if (ch != EOF)
{
rewind(fp);
while (!feof(fp))
{
if ((p2 = (StuLink *)malloc(sizeof(StuLink))) == NULL)
{
printf(" 不能成功分配储存块!\n");
exit(0);
} //动态分配空间
fscanf(fp, "%d %s %d %d %c %d\n", &p2->xh, p2->xm, &p2->xb, &p2->cj, &p2->dj, &p2->mc);
p2->next = NULL;
if (head == NULL)
{
p1 = p2;
head = p2;
}
else
{
p1->next = p2;
p1 = p2;
}
if (p2->xh > i)
i = p2->xh;
}
Max_xh = i + 1;
AnalysisLink(head);
RankLink(head);
}
if (fclose(fp))
{
printf("\n 无法正常关闭数据文件!\n");
getchar();
exit(0);
}
return head;
}
void SaveToFile(FILE *fp, StuLink *head)
{
StuLink *p = head;
SortLink(head, 1);
if ((fp = fopen("student.txt", "w")) == NULL)
{
printf("\n 文件打开失败!\n");
getchar();
exit(0);
}
while (p != NULL)
{
fprintf(fp, "%d %s %d %d %c %d\n", p->xh, p->xm, p->xb, p->cj, p->dj, p->mc);
p = p->next;
}
if (fclose(fp))
{
printf("\n 无法正常关闭数据文件!\n");
getchar();
exit(0);
}
}
StuLink *InsertNode(StuLink *head)
{
StuLink *new = NULL, *p = NULL;
char xb[10];
if ((new = (StuLink *)malloc(sizeof(StuLink))) == NULL)
{
printf("\n 内存分配失败!\n");
getchar();
exit(0);
}
printf("\n 请依次输入该生的姓名、性别、成绩:(0代表男生 1代表女生,各项以空格隔开)\n\n ");
scanf("%s %d %d", new->xm, &new->xb, &new->cj);
while (new->xb != 0 && new->xb != 1)
{
printf("\n 性别输入错误!请重新输入性别( 0 或 1 )!\n ");
scanf("%d", &new->xb);
}
while (new->cj > 100 || new->cj < 0)
{
printf("\n 成绩输入错误!请重新输入成绩( 0 至 100)!\n ");
scanf("%d", &new->cj);
}
dj_change(new);
new->next = NULL;
p = head;
if (head == NULL)
{
head = new;
}
else
{
while (p->next != NULL)
p = p->next;
p->next = new;
}
xh_define(new, head);
printf("\n 插入成功!\n");
return head;
}
void EditNode(StuLink *head, int num)
{
StuLink *p = head;
int choose;
while (p != NULL)
{
if (p->xh == num)
{
switch (p->xb)
{
case boy:
printf("\n 该生的信息为:\n\n学号:%d 姓名:%s 性别:男 成绩:%d 等级:%c 名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
case girl:
printf("\n 该生的信息为:\n\n学号:%d 姓名:%s 性别:女 成绩:%d 等级:%c 名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
}
printf("\n 要修改的数据项是:\n");
printf("\n 1)姓名 2)性别 3)成绩 4)返回\n");
start:
printf("\n 请输入:");
scanf("%d", &choose);
printf("\n 请修改:");
if (choose == 1)
scanf("%s", p->xm);
else if (choose == 2)
{
printf("(0代表男生 1代表女生) ");
scanf("%d", &p->xb);
while (p->xb != 0 && p->xb != 1)
{
printf("\n 性别输入错误!请重新输入性别!(0代表男生 1代表女生)\n\n ");
scanf("%d", &p->xb);
}
}
else if (choose == 3)
{
scanf("%d", &p->cj);
while (p->cj > 100 || p->cj < 0)
{
printf("\n 成绩输入错误!请重新输入成绩( 0 至 100 )!\n\n ");
scanf("%d", &p->cj);
}
dj_change(p);
RankLink(head);
}
else if (choose == 4)
return;
else
{
printf("\n 输入错误!\n\n");
goto start;
}
printf("\n 修改成功!\n");
break;
}
p = p->next;
}
if (p == NULL)
{
printf("\n 无法查到该学号的信息!\n");
}
}
StuLink *DeleteNode(StuLink *head, int num)
{
StuLink *p1 = head, *p2 = NULL;
while (p1->xh != num && p1 != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p1->xh == num && p1 == head)
{
head = head->next;
free(p1);
}
else if (p1->xh == num)
{
p2->next = p1->next;
free(p1);
}
else
{
printf("\n 无法查到该学号的信息!\n");
return head;
}
RankLink(head);
printf("\n 删除成功!\n");
getchar();
return head;
}
void QueryNode(StuLink *head, int num)
{
StuLink *p = head;
if (head == NULL)
{
printf("\n 数据为空!\n");
getchar();
return;
}
else
{
while (p != NULL)
{
if (p->xh == num)
{
switch (p->xb)
{
case boy:
printf("\n 该生的信息为:\n\n 学号:%d 姓名:%s 性别:男 成绩:%d 等级:%c 名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
case girl:
printf("\n 该生的信息为:\n\n 学号:%d 姓名:%s 性别:女 成绩:%d 等级:%c 名次:%d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
}
break;
}
p = p->next;
}
if (p == NULL)
{
printf("\n 无法查到该学号的信息!\n");
}
getchar();
}
}
void QueryLink(StuLink *head)
{
int i = 0;
StuLink *p = head;
if (head == NULL)
{
printf("\n 数据为空!\n");
return;
}
else
{
while (p != NULL)
{
if (p->cj < 60)
{
i++;
if (i == 1)
printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
switch (p->xb)
{
case boy:
printf("\n\t%3d\t%6s\t 男\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
case girl:
printf("\n\t%3d\t%6s\t 女\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
}
}
p = p->next;
}
if (i == 0)
{
printf("\n 没有不及格人数!\n");
}
else
{
printf("\n 不及格人数:%d 人\n", i);
}
}
}
void RankLink(StuLink *head)
{
StuLink *p1, *p2;
int i = 1;
if (head == NULL)
{
printf("\n 数据为空!\n");
getchar();
return;
}
if (head->next == NULL)
{
head->mc = 1;
return;
}
for (p1 = head; p1 != NULL; p1 = p1->next)
{
for (p2 = head; p2 != NULL; p2 = p2->next)
{
if (p1->cj < p2->cj)
i++;
}
p1->mc = i;
i = 1;
}
}
void AnalysisLink(StuLink *head)
{
StuLink *p = head;
int i;
if (head == NULL)
{
printf("\n 数据为空!\n");
getchar();
return;
}
else
{
for (i = 1; i <= 5; i++)
dj[i] = 0; //初始化等级数组
while (p != NULL)
{
if (p->cj >= 90)
dj[1]++;
else if (p->cj < 90 && p->cj >= 80)
dj[2]++;
else if (p->cj < 80 && p->cj >= 70)
dj[3]++;
else if (p->cj < 70 && p->cj >= 60)
dj[4]++;
else if (p->cj < 60)
dj[5]++;
p = p->next;
}
}
}
void exchange(StuLink *p1, StuLink *p2)
{
StuLink *temp;
if ((temp = (StuLink *)malloc(sizeof(StuLink))) == NULL)
{
printf("\n 空间分配失败!\n");
getchar();
exit(0);
}
temp->xh = p1->xh;
strcpy(temp->xm, p1->xm);
temp->xb = p1->xb;
temp->cj = p1->cj;
temp->dj = p1->dj;
temp->mc = p1->mc;
p1->xh = p2->xh;
strcpy(p1->xm, p2->xm);
p1->xb = p2->xb;
p1->cj = p2->cj;
p1->dj = p2->dj;
p1->mc = p2->mc;
p2->xh = temp->xh;
strcpy(p2->xm, temp->xm);
p2->xb = temp->xb;
p2->cj = temp->cj;
p2->dj = temp->dj;
p2->mc = temp->mc;
free(temp);
}
void SortLink(StuLink *head, int choose)
{
StuLink *p1 = head, *p2;
StuLink *temp;
if (p1 == NULL || p1->next == NULL)
return;
if (choose == 1) //按学号排序(升序)
{
for (p1 = head; p1->next != NULL; p1 = p1->next)
{
temp = p1;
for (p2 = p1->next; p2 != NULL; p2 = p2->next)
{
if (temp->xh > p2->xh)
temp = p2;
}
exchange(temp, p1);
}
}
else if (choose == 2) //按成绩排名(降序)
{
for (p1 = head; p1->next != NULL; p1 = p1->next)
{
temp = p1;
for (p2 = p1->next; p2 != NULL; p2 = p2->next)
{
if (temp->cj < p2->cj)
temp = p2;
}
exchange(temp, p1);
}
}
else
printf("\n 输入错误!\n");
}
void OutputLink_1(StuLink *head, int choose)
{
StuLink *p = NULL;
if (choose == 1)
{
if (head != NULL)
{
SortLink(head, 1);
printf("\n 学生成绩表如下:(按学号升序排序)\n");
printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
for (p = head; p != NULL; p = p->next)
{
switch (p->xb)
{
case boy:
printf("\n\t%3d\t%6s\t 男\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
case girl:
printf("\n\t%3d\t%6s\t 女\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
}
}
AnalysisLink(head);
printf("\n 各等级人数:\n");
printf("\n A等级:%d 人\n B等级:%d 人\n C等级:%d 人\n D等级:%d 人\n E等级:%d 人\n", dj[1], dj[2], dj[3], dj[4], dj[5]);
}
else
{
printf("\n 数据为空!\n");
}
}
else if (choose == 2)
{
if (head != NULL)
{
SortLink(head, 2);
printf("\n 学生成绩表如下:(按学号升序排序)\n");
printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
for (p = head; p != NULL; p = p->next)
{
switch (p->xb)
{
case boy:
printf("\n\t%3d\t%6s\t 男\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
case girl:
printf("\n\t%3d\t%6s\t 女\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
}
}
AnalysisLink(head);
printf("\n 各等级人数:\n");
printf("\n A等级:%d 人\n B等级:%d 人\n C等级:%d 人\n D等级:%d 人\n E等级:%d 人\n", dj[1], dj[2], dj[3], dj[4], dj[5]);
}
else
{
printf("\n 数据为空!\n");
}
}
else
printf("\n 输入错误!\n");
getchar();
}
void OutputLink_2(StuLink *head, int num)
{
int i = 1; //每十个数据中第一个数据的下标
int choose;
int page = 1;
if (head == NULL)
{
printf("\n 数据为空!\n");
getchar();
return;
}
else
{
printf("\n 当前位置:第 %d 页 , 共 %d 页\n", page, (count(head) / 10) + 1);
OutputLink_only10(head, 1);
printf("\n\n 1)首页 2)上一页 3)下一页 4)尾页 0)返回\n");
back:
printf("\n 请对应操作输入序号:");
scanf("%d", &choose);
switch (choose)
{
case 1:
{
if (i == 1 || num == 10)
{
printf("\n 当前位置位于首页!\n");
}
else
{
system("cls");
start_menu();
printf("\n");
page = 1;
printf("\n 当前位置:第 %d 页\n", page);
OutputLink_only10(head, 1);
printf("\n\n 1)首页 2)上一页 3)下一页 4)尾页 0)返回\n");
i = 1;
}
getchar();
goto back;
}
case 2:
{
if (i == 1 || num == 10)
{
printf("\n 当前位置位于首页!\n");
getchar();
goto back;
}
else
{
system("cls");
start_menu();
printf("\n");
page--;
printf("\n 当前位置:第 %d 页\n", page);
OutputLink_only10(head, i - 10);
printf("\n\n 1)首页 2)上一页 3)下一页 4)尾页 0)返回\n");
i = i - 10;
}
getchar();
goto back;
}
case 3:
{
if (i == num / 10 * 10 + 1 || num == 10)
{
printf("\n 当前位置位于尾页!\n");
getchar();
goto back;
}
else
{
system("cls");
start_menu();
printf("\n");
page++;
printf("\n 当前位置:第 %d 页\n", page);
OutputLink_only10(head, i + 10);
printf("\n\n 1)首页 2)上一页 3)下一页 4)尾页 0)返回\n");
i = i + 10;
}
getchar();
goto back;
}
case 4:
{
if (i == num / 10 * 10 + 1 || num == 10)
{
printf("\n 当前位置位于尾页!\n");
}
else
{
system("cls");
start_menu();
printf("\n");
page = num / 10;
printf("\n 当前位置:第 %d 页\n", page);
if (num % 10 == 0)
OutputLink_only10(head, (num / 10 - 1) * 10 + 1);
else
OutputLink_only10(head, num / 10 * 10 + 1);
printf("\n\n 1)首页 2)上一页 3)下一页 4)尾页 0)返回\n");
i = num / 10 * 10 + 1;
}
getchar();
goto back;
}
case 0:
return;
default:
{
printf("\n 输入错误!请重新输入!\n");
getchar();
goto back;
}
}
}
}
extra.c
#include "function.h"
extern int Max_xh;
extern int dj[6];
void dj_change(StuLink *p)
{
if (p->cj >= 90)
p->dj = 'A';
else if (p->cj < 90 && p->cj >= 80)
p->dj = 'B';
else if (p->cj < 80 && p->cj >= 70)
p->dj = 'C';
else if (p->cj < 70 && p->cj >= 60)
p->dj = 'D';
else if (p->cj < 60)
p->dj = 'E';
}
void xh_define(StuLink *p, StuLink *head)
{
p->xh = Max_xh;
Max_xh++;
}
void OutputLink_only10(StuLink *head, int start)
{
int i = 1;
StuLink *p = head;
while (p != NULL && i != start)
{
p = p->next;
i++;
}
i = 1;
printf("\n\t学号\t 姓名 \t性别\t成绩\t等级\t名次\n");
for (p; (p != NULL) && (i <= 10); p = p->next, i++)
{
switch (p->xb)
{
case boy:
printf("\n\t%3d\t%6s\t 男\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
case girl:
printf("\n\t%3d\t%6s\t 女\t%3d\t %c\t%3d\n", p->xh, p->xm, p->cj, p->dj, p->mc);
break;
}
}
}
int count(StuLink *head)
{
int num = 0;
StuLink *p = head;
while (p != NULL)
{
p = p->next;
num++;
}
return num;
}
void start_menu()
{
printf("\n\t**********欢迎来到学生管理系统**********\n\n");
printf("\n\t\t (1) 数据维护\n\n\t\t (2) 数据查询\n\n\t\t (3) 统计分析\n\n\t\t (4) 报表输出\n\n\t\t (0) 退出\n\n");
printf("\n 请不要强制关闭本窗口导致数据保存出错!\n");
printf("\n\t*****************************************\n\n");
}
StuLink *menu(int choose1, StuLink *head)
{
int choose2, choose3, num, i; //choose2:二级菜单选择 choose3:三级菜单选择 num:学号 i:人数
switch (choose1)
{
case 1:
{
start1:
printf("\n 1)数据插入 2)数据修改 3)数据删除 0)返回\n");
printf("\n 请对应操作输入序号:");
scanf("%d", &choose2);
switch (choose2)
{
case 1:
{
head = InsertNode(head);
RankLink(head);
getchar();
break;
}
case 2:
{
printf("\n 请输入学号:");
scanf("%d", &num);
EditNode(head, num);
getchar();
break;
}
case 3:
{
printf("\n 请输入学号:");
scanf("%d", &num);
DeleteNode(head, num);
break;
}
case 0:
break;
default:
{
printf("\n 输入错误!请重新输入!\n");
goto start1;
}
}
break;
}
case 2:
{
start2:
printf("\n 1)学号查询 2)不及格学生查询 0)返回\n");
printf("\n 请对应操作输入序号:");
scanf("%d", &choose2);
switch (choose2)
{
case 1:
{
printf("\n 请输入学号:");
scanf("%d", &num);
QueryNode(head, num);
break;
}
case 2:
{
QueryLink(head);
getchar();
break;
}
case 0:
break;
default:
{
printf("\n 输入错误!请重新输入!\n");
getchar();
goto start2;
}
}
break;
}
case 3:
{
start3:
printf("\n 1)成绩名次计算 2)成绩频度分析 0)返回\n");
printf("\n 请对应操作输入序号:");
scanf("%d", &choose2);
switch (choose2)
{
case 1:
{
RankLink(head);
printf("\n 操作完成!\n");
getchar();
break;
}
case 2:
{
AnalysisLink(head);
printf("\n 操作完成!\n");
printf("\n 各等级人数:\n");
printf("\n A等级:%d 人\n B等级:%d 人\n C等级:%d 人\n D等级:%d 人\n E等级:%d 人\n", dj[1], dj[2], dj[3], dj[4], dj[5]);
getchar();
break;
}
case 0:
break;
default:
{
printf("\n 输入错误!请重新输入!\n");
getchar();
goto start3;
}
}
break;
}
case 4:
{
start4:
printf("\n 1)排序显示学生信息 2)分页显示学生信息 0)返回\n");
printf("\n 请对应操作输入序号:");
scanf("%d", &choose2);
switch (choose2)
{
case 1:
{
printf("\n 1)按学号升序排序 2)按成绩降序排序\n");
printf("\n 请对应操作输入序号:");
scanf("%d", &choose3);
OutputLink_1(head, choose3);
break;
}
case 2:
{
OutputLink_2(head, count(head));
break;
}
case 0:
break;
default:
{
printf("\n 输入错误!请重新输入!\n");
goto start4;
}
}
break;
}
default:
break;
}
return head;
}
main.c
#include "function.c"
#include "extra.c"
int main(void)
{
int choice1; //一级选择
FILE *fp; //定义一个文件指针
StuLink *head = NULL; //定义一个头指针
head = ReadFromFile(fp, head); //读取学生信息
start:
start_menu();
start1:
printf("\n 请对应操作输入序号:");
scanf("%d", &choice1);
if (choice1 == 1 || choice1 == 2 || choice1 == 3 || choice1 == 4 || choice1 == 0)
goto out; //满足条件 --> 移动到 out位置继续运行
else //不满足条件 --> 移动到 start位置继续运行
{
printf("\n 输入错误!请重新输入!\n");
getchar();
goto start1;
}
out:
switch (choice1)
{
case 0:
{
SaveToFile(fp, head);
exit(0);
}
case 1:
case 2:
case 3:
case 4:
{
head = menu(choice1, head);
SaveToFile(fp, head);
printf("\n 按任意键返回...");
getchar();
system("cls");
goto start;
}
}
return 0;
}
完!全部分享给大家!希望大家不要直接照搬,靠自己写出来的还是会比较有成就感的!努力搬砖!
觉得不错的给我点个赞,点个关注吧!
邮箱:[email protected](欢迎交流!)
b站:鸭脖来lo(主要是日常和自己一些小的视频作品,欢迎大家关注!)