首页 > 其他分享 >C语言实现学生成绩管理系统

C语言实现学生成绩管理系统

时间:2022-11-17 21:42:12浏览次数:45  
标签:Node 管理系统 system C语言 stu pHead printf 成绩 pNext



相关视频——https://www.bilibili.com/video/BV13z4y117qC?p=8

我的小站——半生瓜のblog


​代码​实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<conio.h>//从键盘接收一个按键,无序按回车的那种
#include<stdlib.h>
#include<string.h>
//定义学生
typedef struct _Student
{

char name[20];
int age;
int stuNum;//学号
int score;//成绩
}Student;
//定义链表的结点
typedef struct _Node
{
Student stu;//学生-数据域
struct _Node* pNext;//指向下一个结点的指针
}Node;
//定义头结点
Node* g_pHead = NULL;
//录入学生信息
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("*\t————————欢迎使用高校学生管理系统——————----\t\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\t\n",p->stu.stuNum,p->stu.name,p->stu.age,p->stu.score);
p = p->pNext;
}
printf("——————————————------——————————————------\n");
system("pause");
system("cls");
}
//保存学生信息
void saveStudent()
{
system("cls");
//打开文件
FILE* fp = fopen("文件路径","w");
if (fp == NULL)
{
printf("打开文件失败。\n");
return;
}
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
fwrite(&p->stu, 1,sizeof(Student),fp);
p = p->pNext;
}
//关闭文件
fclose(fp);
printf("保存数据成功。\n");
system("pause");
system("cls");
}
//读取学生信息
void browerStudent()
{
//打开文件
FILE* fp = fopen("C:\\Users\\xuanxuan\\Desktop\\test.txt", "r");
if (fp == NULL)
{
printf("打开文件失败。\n") ;
}
//读文件
Student stu;
while (fread(&stu, 1, sizeof(Student), fp))//只要不是文件末尾就继续读
{
//创建一个新结点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
memcpy(pNewNode,&stu,sizeof(Student));

//头插法
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 nStudent;
char nName[20];
printf("请输入要查找的学生学号:\n");
scanf("%d", &nStudent);

printf("请输入要查找的学生姓名:\n", nName);
scanf("%s",nName);
//遍历链表
Node* p = g_pHead;
while (p != NULL)
{
if (p->stu.stuNum == nStudent || 0 == strcmp(p->stu.name , nName))
{
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)
{
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);

Node* p1,*p2;
//判断是不是头结点
if (g_pHead->stu.stuNum == nStunum)
{
p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
printf("删除成功。\n");
system("pause");
system("cls");
return;
}
//不是头结点
Node* p = g_pHead;
while (p->pNext != NULL)
{
if (p->pNext->stu.stuNum == nStunum)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
printf("删除成功。\n");
system("pause");
system("cls");
return;
}
p = p->pNext;
if (p->pNext == NULL)
{
break;
}

}
if (p->pNext ==NULL)
{
printf("查无此人。\n");
}
system("pause");
system("cls");

}
//主菜单
void mainMenu()
{
printf("——————————————------\n");
printf("*\t欢迎使用高校学生管理系统*\n");
printf("——————————————------\n");
printf("*\t1.录入学生信息\t\t*\n");
printf("*\t2.打印学生信息\t\t*\n");
printf("*\t3.保存学生信息\t\t*\n");
printf("*\t4.读取学生信息\t\t*\n");
printf("*\t5.统计所有学生人数\t*\n");
printf("*\t6.查找学生信息\t\t*\n");
printf("*\t7.修改修生信息\t\t*\n");
printf("*\t8.删除学生信息\t\t*\n");
printf("*\t0.退出系统\t\t*\n");
printf("——————————————------\n");


}
//键盘输入
void keyDown()
{
char ch = _getch();
switch (ch)
{
case '1'://录入
inputStudent();
break;
case '2'://打印
printStudent();
break;
case '3'://保存
saveStudent();
break;
case '4'://读取
browerStudent();
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'://退出
exit(0);
break;
default:
printf("输入错误,请重新输入。\n");
break;
}
}
int main(void)
{
while (1)
{
mainMenu();
keyDown();
}
return 0;
}


标签:Node,管理系统,system,C语言,stu,pHead,printf,成绩,pNext
From: https://blog.51cto.com/u_15333750/5866166

相关文章

  • LeetCode刷题(1)【链表】【反转链表】(C语言)
    我的小站——半生瓜のblog(doraemon2.xyz)题目链接——206.反转链表-力扣(LeetCode)(leetcode-cn.com)反转链表思路一:反转指针。本质上就是调转指针的方向。首先我们......
  • 【链表】双向循环带头链表-增-删-查(C语言)
    我的小站——半生瓜のblog——同步更新单链表存在的缺陷:不能从后往前走,找不到他的前驱,指定位置删除增加尾删都要找前一个,时间复杂度都是O(n)针对上面的这些缺陷的解决......
  • 【链表】单链表-增-删-查(C语言)
    我的小站——半生瓜のblog单链表​​结构体定义​​​​打印​​​​创建结点​​​​尾插​​​​头插​​​​尾删​​​​头删​​​​查找​​​​在指定位置前插入某个......
  • 【线性表】之顺序表(C语言)
    【线性表】之顺序表​​线性表​​​​顺序表​​​​结构定义​​​​初始化​​​​销毁​​​​打印​​​​扩展空间​​​​尾插​​​​头插​​​​尾删​​​​头删......
  • LeetCode刷题(4)【移除元素&合并两个有序数组】(C语言)(含图解)
    移除元素典型双指针玩法。27.移除元素-力扣(LeetCode)(leetcode-cn.com)我们都会想到这样的解法:从前面依次往后推,是val就将该数据后面的元素依次覆盖上来,但是这样的时间复......
  • LeetCode刷题(5)【链表】【环形链表II】(C语言)
    环形链表I​​LeetCode刷题(3)【链表】【环形链表】&扩展_半生瓜のblog-CSDN博客​​环形链表II142.环形链表II-力扣(LeetCode)(leetcode-cn.com)这个题写起来不难,但是证......
  • 【线性表】之栈(C语言)
    栈​​回顾​​​​栈​​​​结构定义​​​​初始化​​​​销毁​​​​入栈​​​​出栈​​​​返回栈顶元素​​​​返回栈中元素个数​​​​判断栈是否为空​​​​......
  • 【线性表】之队列(C语言)
    队列​​队列的概念​​​​结构定义​​​​初始化​​​​销毁​​​​队尾入​​​​队头出​​​​队头出​​​​队头数据​​​​队尾数据​​​​是否为空​​​​返......
  • LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)
    用队列实现栈225.用队列实现栈-力扣(LeetCode)(leetcode-cn.com)目的:用队列实现栈,从先进先出——>先进后出,1234这四个数据依次从队列1的队尾进入,要让4先出,一个队列是无法......
  • LeetCode刷题(2)【链表】【合链表&链表的中间结点】(C语言)
    我的小站——半生瓜のblog快慢指针问题:思路:定义一个快指针和一个慢指针,快指针走到结束的时候,慢指针刚好走到一半。链表的中间结点。876.链表的中间结点-力扣(LeetCode)(le......