简介
基于C语言的高校学生成绩管理系统,实现录入学生信息、打印学生信息、保存学生信息、读取学生信息、统计学生人数、查找学生信息、修改删除学生信息的基本功能。代码实现部分将给出实现各个功能的代码步骤解析,完整代码会在文章末尾给出。
代码实现:
基于以上功能,给出用户界面:
//用户界面
void Welcome()
{
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");
}
1.录入信息
关于录入信息的实现,首先需要创建一个包含学生信息链表,包括但不限于学生的学号,姓名,年龄和成绩。我们把定义好的结构体重命名为'Stu',表示学生信息,代码如下:
//定义学生
typedef struct _Stu
{
char name[20];//姓名
int age; //年龄
char num[20]; //学号
float score; //成绩
}Stu;
要建立链表,首先我们需要定义一个头节点,使初始头节点为空,代码是实现如下:
//定义节点
typedef struct _Node
{
Stu s1; //学生
struct _Node*pNext; //指向下一个节点
}Node;
//定义头节点
Node *g_pHead = NULL;
定义录入信息函数'Input()',创建新节点,将创建的新节点利用头插法插入我们所建立的链表之中,并输入我们需要输入的信息,代码如下:
//录入信息
void Input()
{
//创建节点
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->s1.name);
printf("请输入学生年龄:\n");
scanf("%d",&pNewNode->s1.age);
printf("请输入学生学号:\n");
scanf("%s",pNewNode->s1.num);
printf("请输入学生成绩:\n");
scanf("%f",&pNewNode->s1.score);
printf("录入成功!\n");
}
2.打印信息
要打印我们在录入的信息,需要我们遍历所创建链表,并将链表中的信息通过'printf()'函数打印出来,代码实现如下:
//打印信息
void Output()
{
printf("************************\n");
printf("*欢迎使用学生成绩管理系统*\n");
printf("************************\n");
printf("* 学号 * 姓名 * 年龄 * 成绩 *\n");
printf("************************\n");
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
printf("* %s * %s * %d * %f *\n",p->s1.num,p->s1.name,p->s1.age,p->s1.score);
p = p->pNext;
}
}
3.保存信息
对于保存信息,涉及到文件操作,首先我们新建一个txt文件,用于储存我们先前输入的信息,命名为'stuin.txt'。其次,要想将链表中的信息写入到txt文件中,我们需要遍历链表,读取链表中的所有学生信息,将其写入txt文件并保存。代码实现如下:
//保存信息
void Save()
{
//打开文件
FILE* fp = fopen("stuin.txt","w");
if(fp == NULL)
{
printf("打开文件失败!\n");
return;
}
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
fwrite(&p->s1,1,sizeof(Stu),fp);
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("文件数据保存成功!\n");
}
4.读取信息
要读取我们之前保存在txt文件中的信息,首先需要打开文件,如果文件空,则输出文件打开失败,其次,要读取文件中的信息,我们需要创建一个新的节点,并利用头插法将新节点插入链表。代码实现如下:
//读取信息
void Read()
{
//打开文件
FILE* fp = fopen("stuin.txt","r");
if(fp == NULL)
{
printf("打开文件失败!\n");
return;
}
//读取文件
while(!feof(fp))
{
//创建节点
Node*pNewNode = (Node*)malloc(sizeof(Node));
fread(&pNewNode->s1,1,sizeof(Stu),fp);
pNewNode->pNext = NULL;
//插入节点(头插法)
if(g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
//关闭文件
fclose(fp);
printf("数据读取成功!!\n");
}
5.统计人数
同上,要统计学生人数,我们同样需要遍历链表。首先定义一个整数nCount,表示学生人数,赋值为0。其次,利用while循环,如果链表不是空链表,则使nCount自加1,将值返回给nCount,最后打印输出。代码如下:
//统计人数
int ConStu()
{
int nCount = 0;
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
nCount++;
p = p->pNext;
}
return nCount;
printf("一共有%d个学生\n",nCount);
}
6.查找信息
关于查找信息,我们规定学生学号唯一,并以此作为我们进行信息查找的依据。首先我们定义一个学生学号数组,从键盘输入。其次遍历链表,利用strcmp函数将输入的学生学号与链表中的学生学号进行对比,若相同,则输出该学生的相关信息,若不同,则输出没有找到该学生的提示。代码实现如下:
//查找信息
Node* Search()
{
char StuNum[20];
printf("请输入学生学号:\n");
scanf("%s",StuNum);
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
if(0 == strcmp(p->s1.num,StuNum))
{
return p;
}
p = p->pNext;
}
//没有找到
return NULL;
}
7.修改信息
要修改学生信息,首先我们需要查找到我们需要修改的学生。具体可以参考第六步查找信息,不同的是,如果在查找到学生信息后,我们要对链表中的信息进行修改,具体代码如下:
//修改信息
void Modify()
{
char StuNum[20];
printf("请输入需要修改的学生的学号:\n");
scanf("%s",StuNum);
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
if(0 == strcmp(p->s1.num,StuNum))
{
printf("请输入修改信息:\n");
scanf("%s %d %f",p->s1.name,&p->s1.age,&p->s1.score);
printf("修改成功!\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生信息!\n");
}
}
8.删除信息
要实现删除信息,我们首先也是要找到需要我们删除的学生,步骤同上两步相同。在查找到需要删除的学生信息后,我们判断其是否为链表中的头节点,如果是,则定义一个p1,将头节点中的信息赋值p1,并将其释放,也就是删除该节点信息。具体代码如下:
//删除信息
void Del()
{
char StuNum[20];
printf("请输入需要删除的学生的学号:\n");
scanf("%s",StuNum);
//判断是否为头节点
Node* p1;
if(g_pHead->s1.num == StuNum)
{
p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
return;
}
//不是头节点
Node* p2 = g_pHead;
Node* p = g_pHead;
while(p->pNext != NULL)
{
if(p->pNext->s1.num == StuNum)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
return;
}
p = p->pNext;
if(p->pNext == NULL)
{
break;
}
}
if(p->pNext == NULL)
{
printf("没有找到该学生!\n");
}
}
完整代码
Student.c
#include "Student.h"
int main()
{
//设置while死循环,使程序不停运行
while(1)
{
//调用函数Welcome
Welcome();
//等待键盘输入字符
//getch 不需要按回车,输入即响应
char ch = getchar();
//判断输入字符
switch (ch)
{
case '1':
Input();
break;
case '2':
Output();
break;
case '3':
Save();
break;
case '4':
Read();
break;
case '5':
printf("一共有%d个学生\n",ConStu());
break;
case '6':
{
Node* p = Search();
if(p != NULL)
{
printf("学号:%s\t姓名:%s\t年龄:%d\t成绩%f\n",
p->s1.num,p->s1.name,p->s1.age,p->s1.score);
}
else
{
printf("没有找到该学生!\n");
}
break;
}
case '7':
Modify();
break;
case '8':
Del();
break;
case '0':
printf("再见!!!!\n");
return 0;
break;
}
}
return 0;
}
//用户界面
void Welcome()
{
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");
}
//录入信息
void Input()
{
//创建节点
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->s1.name);
printf("请输入学生年龄:\n");
scanf("%d",&pNewNode->s1.age);
printf("请输入学生学号:\n");
scanf("%s",pNewNode->s1.num);
printf("请输入学生成绩:\n");
scanf("%f",&pNewNode->s1.score);
printf("录入成功!\n");
}
//打印信息
void Output()
{
printf("************************\n");
printf("*欢迎使用学生成绩管理系统*\n");
printf("************************\n");
printf("* 学号 * 姓名 * 年龄 * 成绩 *\n");
printf("************************\n");
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
printf("* %s * %s * %d * %f *\n",p->s1.num,p->s1.name,p->s1.age,p->s1.score);
p = p->pNext;
}
}
//保存信息
void Save()
{
//打开文件
FILE* fp = fopen("stuin.txt","w");
if(fp == NULL)
{
printf("打开文件失败!\n");
return;
}
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
fwrite(&p->s1,1,sizeof(Stu),fp);
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("文件数据保存成功!\n");
}
//读取信息
void Read()
{
//打开文件
FILE* fp = fopen("stuin.txt","r");
if(fp == NULL)
{
printf("打开文件失败!\n");
return;
}
//读取文件
while(!feof(fp))
{
//创建节点
Node*pNewNode = (Node*)malloc(sizeof(Node));
fread(&pNewNode->s1,1,sizeof(Stu),fp);
pNewNode->pNext = NULL;
//插入节点(头插法)
if(g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
//关闭文件
fclose(fp);
printf("数据读取成功!!\n");
}
//统计人数
int ConStu()
{
int nCount = 0;
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
nCount++;
p = p->pNext;
}
return nCount;
printf("一共有%d个学生\n",nCount);
}
//查找信息
Node* Search()
{
char StuNum[20];
printf("请输入学生学号:\n");
scanf("%s",StuNum);
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
if(0 == strcmp(p->s1.num,StuNum))
{
return p;
}
p = p->pNext;
}
//没有找到
return NULL;
}
//修改信息
void Modify()
{
char StuNum[20];
printf("请输入需要修改的学生的学号:\n");
scanf("%s",StuNum);
//遍历链表
Node*p = g_pHead;
while (p != NULL)
{
if(0 == strcmp(p->s1.num,StuNum))
{
printf("请输入修改信息:\n");
scanf("%s %d %f",p->s1.name,&p->s1.age,&p->s1.score);
printf("修改成功!\n");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生信息!\n");
}
}
//删除信息
void Del()
{
char StuNum[20];
printf("请输入需要删除的学生的学号:\n");
scanf("%s",StuNum);
//判断是否为头节点
Node* p1;
if(g_pHead->s1.num == StuNum)
{
p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
return;
}
//不是头节点
Node* p2 = g_pHead;
Node* p = g_pHead;
while(p->pNext != NULL)
{
if(p->pNext->s1.num == StuNum)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
return;
}
p = p->pNext;
if(p->pNext == NULL)
{
break;
}
}
if(p->pNext == NULL)
{
printf("没有找到该学生!\n");
}
}
Student.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义学生
typedef struct _Stu
{
char name[20];//姓名
int age; //年龄
char num[20]; //学号
float score; //成绩
}Stu;
//定义节点
typedef struct _Node
{
Stu s1; //学生
struct _Node*pNext; //指向下一个节点
}Node;
//定义头节点
Node *g_pHead = NULL;
//定义用户界面
void Welcome();
//定义录入信息
void Input();
//定义打印信息
void Output();
//定义保存信息
void Save();
//定义读取信息
void Read();
//定义统计人数
int ConStu();
//定义查找信息
Node* Search();
//定义修改信息
void Modify();
//定义删除信息
void Del();
总结
总的来说,以上代码实现了一个简单的学生成绩管理系统,通过用户的输入实现对学生信息的录入、输出、保存、读取、统计、查找、修改和删除等操作。