使用C语言实现学生信息管理系统

2024-05-30 00:20

本文主要是介绍使用C语言实现学生信息管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在我们实现学生信息管理系统的过程中,我们几乎会使用到C语言最常用最重要的知识,对于刚学习完C语言的同学来说是一次很好的巩固机会,其中还牵扯到数据结果中链表的插入和删除内容。

实现学生信息管理系统

文件的创建与使用

·对于要实现一个大项目而言,我们要把函数进行分装,分装到头文件中,在.c文件中使用

#include"//头文件名"

另外对于定义函数时还可以专门的放在另一个.c文件中,便于维护,在这个小项目中当然不用这样做,不过为了养成好习惯,建议大家这样做。

头文件的使用

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

 创建存储学生信息结构体和节点信息结构体

//学生信息
typedef struct _Student
{int stuNum;char name[30];int source;
}Student;//节点信息
typedef struct _Node
{Student student;struct _Node* next;
}Node;

 系统界面的初始化

//初始化界面
void welcome()
{printf("**********************************\n");printf("*\t学生成绩管理系统\t*\n");printf("**********************************\n");printf("*\t请选择功能列表\t\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\t*\n");printf("*\t6.删除学生信息\t\t*\n");printf("*\t7.按成绩排序\t\t*\n");printf("*\t8.退出系统\t\t*\n");printf("**********************************\n");
}

输入学生信息

//输入学生信息
void inputStudent(Node* head)
{Node* fresh = (Node*)malloc(sizeof(Node));fresh->next = NULL;printf("请输入学生的学号、姓名、成绩:");scanf("%d %s %d", &fresh->student.stuNum, fresh->student.name, &fresh->student.source);Node* move = head;while (move->next != NULL){move = move->next;}//将学生信息插入链表尾部move->next = fresh;saveStudent(head);//学生信息持久化函数(自定义)
} 

打印学生信息

//打印学生信息
void printStudent(Node* head)
{Node* move = head->next;while (move != NULL){printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.source);move = move->next;}//暂停程序system("pause");
//清空控制台system("cls");
}

统计学生人数

//统计学生人数
void countStudent(Node* head)
{welcome();int count = 0;Node* move = head->next;while (move != NULL){count++;move = move->next;}printf("学生的总人数为%d", count);//暂停程序system("pause");
//清空控制台system("cls");
}

查找学生信息

void findStudent(Node* head)
{welcome();int stuNum;printf("\n请输入要查找的学生的学号:");scanf("%d", &stuNum);Node* move = head->next;while (move != NULL){if (stuNum == move->student.stuNum){printf("学号:%d 姓名:%s 成绩:%d\n", move->student.stuNum, move->student.name, move->student.source);return;}move = move->next;}printf("未找到学生信息\n");//暂停程序system("pause");
//清空控制台system("cls");
}

学生信息持久化

//学生信息持久化
void saveStudent(Node* head)
{FILE* file = fopen("./stu.info", "w");if (file == NULL){printf("文件打开失败\n");return;}Node* move = head->next;while (move != NULL){if ((fwrite(&move->student, sizeof(Student), 1, file)) != 1){printf("写入失败\n");return;}move = move->next;}fclose(file);
}

读取学生信息

//读取学生信息
void loadStudent(Node* head)
{FILE* file = fopen("./stu.info", "r");if (!file){printf("没有学生文件,跳过读取\n");return;}Node* fresh = (Node*)malloc(sizeof(Node));fresh->next = NULL;Node* move = head;while (fread(&fresh->student, sizeof(Student), 1, file) == 1){move->next = fresh;move = fresh;fresh = (Node*)malloc(sizeof(Node));fresh->next = NULL;}free(fresh);fclose(file);printf("读取成功\n");
}

修改学生信息

//学生信息修改
void modifyStudent(Node* head)
{welcome();printf("请输入要修改信息学生的学号:");int stuNum;scanf("%d", &stuNum);Node* move = head->next;while (move != NULL){if (stuNum == move->student.stuNum){printf("请输入学生的姓名、成绩\n");scanf("%s %d", move->student.name, &move->student.source);saveStudent(head);printf("修改成功\n");return;}move = move->next;//暂停程序system("pause");
//清空控制台system("cls");}printf("未找到学生信息\n");
}

删除学生信息

//删除学生信息
void deleteStudent(Node* head)
{welcome();int stuNum;printf("请输入要删除学生信息的学号");scanf("%d", &stuNum);Node* move = head;while (move->next != NULL){if (move->student.stuNum == stuNum){Node* tmp = move->next;//把要删除的数据的保存的节点存放在一个临时节点中,防止前后节点丢失move->next = move->next->next;free(tmp);tmp = NULL;saveStudent(head);printf("删除成功\n");return;}move = move->next;}//暂停程序system("pause");
//清空控制台system("cls");
}

链表的删除操作

由于没学到数据结构,这个只是我浅薄的认识。

对学生成绩进行排序

//对学生成绩排序
void sortStudent(Node* head)
{welcome();Node* move = NULL;Node* save = NULL;for (Node* turn = head->next; turn->next != NULL; turn = turn->next){for (Node* move = head->next; move->next != save; move = move->next){if (move->student.source > move->next->student.source){Student temp = move->student;move->student = move->next->student;move->next->student = temp;}}save = move;//下一趟排序不用再次比较已经排序好的最大值}printStudent(head);//暂停程序system("pause");
//清空控制台system("cls");
}

冒泡排序

冒泡排序是在一趟一趟的过程中对相邻元素比较大小进行排序,例如我们进行升序排序,在每一趟的过程中,会把这一趟的最大元素排到最前面,进而进行下一趟排序,周而复始知道最后一趟的相邻元素大小符合升序排列。

在其中排序的过程中,由于在每一趟中我们会把最大数排列在随后,所以在以后的每一次排序中都不必要对上一趟排序后结果的最大值进行比较,例如:

对于这个算法的实现请看下面:

退出系统以及在main函数中调用这些函数:

int main()
{Node* head = (Node*)malloc(sizeof(Node));head->next = NULL;loadStudent(head);welcome();while(1){char c = _getch();switch (c){case '1': inputStudent(head);break;case '2':printStudent(head);break;case '3':countStudent(head);break;case '4':findStudent(head);break;case '5':modifyStudent(head);break;case '6':deleteStudent(head);break;case '7':sortStudent(head);break;case '8':printf("\n欢迎下次使用,bye-");exit(0);break;default:printf("请重新输入\n");break;}}return 0;
}

退出系统

总结

对于前面的函数实现而言,大多数代码的思路是相同的,对于学生信息的删除和成绩排序需要我们重点理解,愿与诸君共勉!

这篇关于使用C语言实现学生信息管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015049

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主