#include "StudentManagerSystem.h"
int main()
{
while (1)
{
Welcome(); //欢迎
//从键盘接收一个字符
// getchar();
char ch = getch(); // getch读取的是个字符
switch (ch)
{
case '1': //学生信息的录入
InputStudent();
break;
case '2': //学生信息的打印
PrintStudent();
break;
case '3': //学生信息的保存
SaveStudent();
break;
case '4': //学生信息的读取
ReadStudent();
break;
case '5': //学生人数的统计
printf("学生总人数为:%d\n", CountStudent());
system("pause"); //暂停
system("cls"); //清屏
break;
case '6': //学生信息的查找
{
Node* p = FindStudent();
if (p != NULL)
printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%d\n", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.score);
else
printf("没有找到该学生。\n");
system("pause"); //暂停
system("cls"); //清屏
break;
}
case '7': //修改学生信息
ModifyStudent();
break;
case '8': //删除学生信息
DeleteStudent();
break;
case '0': //退出系统
printf("Bye Bye!!!\n");
return 0;
default:
printf("您的输入有误,请重新输入。\n");
system("pause"); //暂停
system("cls"); //清屏
break;
}
}
return 0;
}
//欢迎
void Welcome()
{
printf("----------------------------------------------------------------\n");
printf(" 请选择功能列表 \n");
printf("----------------------------------------------------------------\n");
printf(" 欢迎使用高校学生信息管理系统 \n");
printf("----------------------------------------------------------------\n");
printf(" 0.退出系统 \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("----------------------------------------------------------------\n");
}
//学生信息的录入
void InputStudent()
{
//创建一个新节点
Node *pNewNode = (Node *)malloc(sizeof(Node));
pNewNode->pNext = NULL;
//头插法、尾插法
//头插法
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入学生姓名:\n");
scanf("%s", pNewNode->stu.name); //从键盘接收一个字符串、整数等等 不需要加 “&”,因为name是数组名
printf("请输入学生的年龄:\n");
scanf("%d", &pNewNode->stu.age); //&:取地址运算符
printf("请输入学生的学号:\n");
scanf("%d", &pNewNode->stu.stuNum);
printf("请输入学生的成绩:\n");
scanf("%d", &pNewNode->stu.score);
printf("学生信息录入成功。\n");
system("pause"); //暂停
system("cls"); //清屏
}
//打印学生信息
void PrintStudent()
{
system("cls"); //清屏
printf("----------------------------------------------------------------\n");
printf(" 欢迎使用高校学生信息管理系统 \n");
printf("----------------------------------------------------------------\n");
printf("-\t学号\t-\t姓名\t-\t年龄\t-\t成绩-\n");
printf("----------------------------------------------------------------\n");
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
printf("-\t%d\t-\t%s\t-\t%d\t-\t%d-\n",
p->stu.stuNum,
p->stu.name,
p->stu.age,
p->stu.score);
p = p->pNext;
}
printf("----------------------------------------------------------------\n");
system("pause"); //暂停
system("cls"); //清屏
}
//保存学生信息
void SaveStudent()
{
//打开文件
FILE* fp = fopen("D:\\student-information.data", "w");
if (fp == NULL)
{
printf("打开文件失败。\n");
return;
}
//遍历链表
Node *p = g_pHead;
while (p != NULL)
{
fwrite(&p->stu, 1, sizeof(Student), fp); //&p->stu:一个结构体 1;一个字节 sizeof(Student):结构体的大小,Student的大小 fp:fp携带的
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("\n数据保存成功。\n");
system("pause"); //暂停
system("cls"); //清屏
}
//读取学生信息
void ReadStudent()
{
//打开文件
FILE *fp = fopen("D:\\student-information.data", "r");
if (fp == NULL)
{
printf("打开文件失败\n");
return;
}
//读文件
Student stu;
while (fread(&stu, 1, sizeof(Student), fp)) // feof()判断是否读取到文件末尾 fread()读取文件
{
//创建一个新节点
Node *pNewNode = (Node *)malloc(sizeof(Node));
pNewNode->pNext = NULL;
memcpy(pNewNode, &stu, sizeof(Student)); // memcpy是string.h的头文件,要加#include <string.h>
//头插法
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
//关闭文件
fclose(fp);
printf("数据读取成功\n");
system("pause"); //暂停
system("cls"); //清屏
}
//统计所有学生人数
int CountStudent()
{
int nCount = 0; //学生总数
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
nCount++;
p = p->pNext;
}
return nCount;
}
//查找学生
Node* FindStudent()
{
int nStuNum;
char szName[20];
printf("请输入要查找学生的学号:\n");
scanf("%d", &nStuNum);
printf("请输入要查找学生的姓名:\n");
scanf("%s", szName);
Node* p = g_pHead;
while (p != NULL)
{
if (p->stu.stuNum == nStuNum || 0 == strcmp(p->stu.name, szName)) // strcmp()字符串比较函数
{
return p;
}
p = p->pNext;
}
//没有找到
return NULL;
}
//修改学生信息
void ModifyStudent()
{
int nStuNum;
printf("请输入需要修改的学生信息的学号:\n");
scanf("%d", &nStuNum);
Node* p = g_pHead;
while (p != NULL)
{
if (p->stu.stuNum == nStuNum) // strcmp()字符串比较函数
{
printf("请输入要修改的学生的姓名 年龄 成绩:\n");
scanf("%s %d %d", p->stu.name, &p->stu.age, &p->stu.score);
printf("修改成功。\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生信息。\n");
}
system("pause"); //暂停
system("cls"); //清屏
}
//删除学生信息 删除链表的一个节点
void DeleteStudent()
{
int nStuNum;
printf("请输入要删除的学生的学号:\n");
scanf("%d",&nStuNum);
//�