【C语言】:学生管理系统(多文件版)

一、文件框架

 二、Data

data.txt

 三、Inc

1. list.h

学生结构体

#ifndef __LIST_H__
#define __LIST_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>#define MAX_LEN 20// 学生信息结构体
typedef struct
{// 登录用char user_name[128]; // 账号char password[128];  // 密码// 学生信息char name[128]; // 学生姓名char sex[5];    // 学生性别int id;         // 学生idint age;        // 学生年龄int soc;        // 学生成绩
} stu_user;

 顺序表结构体

// 顺序表结构体
typedef struct list_str
{// 信息stu_user data[MAX_LEN];// 长度int len;
} list_str;

 一些关于list功能函数声明...

2. file.h

#ifndef __FILE_H__
#define __FILE_H__#include <stdio.h>
#include <string.h>
#include "list.h"// 保存用户数据
#define FILE_NAME "./Data/data.txt"// 更新文件 写入文件
void file_updata_file(list_str *L);// 更新顺序表
void file_updata_list(list_str *L);#endif

 3.  main.h

#ifndef __MAIN_H__
#define __MAIN_H__// 添加头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 添加库文件
#include "file.h"
#include "list.h"#endif

 四、Src

1. file.c

更新顺序表

#include "file.h"// 更新文件  写入文件
void file_updata_file(list_str *L)
{// 安全判定if (NULL == L){printf("表为空\n");exit(-1);}// 打开文件FILE *fp = fopen(FILE_NAME, "w");if (NULL == fp){printf("文件打开失败\n");exit(-1);}// 写入文件for (size_t i = 0; i < L->len; i++){fprintf(fp, "%s\t%s\t%s\t%s\t%d\t%d\t%d\n",L->data[i].user_name, L->data[i].password,L->data[i].name, L->data[i].sex, L->data[i].id,L->data[i].age, L->data[i].soc);}
}// 更新顺序表
void file_updata_list(list_str *L)
{// 安全判定if (NULL == L){printf("表为空\n");exit(-1);}// 打开文件FILE *fp = fopen(FILE_NAME, "r+");if (NULL == fp){printf("文件打开失败\n");exit(-1);}// 让文件流回到开头fseek(fp, 0, SEEK_SET);// 获取文件行数int len = 0;char ch = 0;// EOF 为 文件结尾while (EOF != (ch = fgetc(fp))){if ('\n' == ch){len++;}}// 让文件流回到开头fseek(fp, 0, SEEK_SET);// 读取文件到顺序表stu_user s1;for (size_t i = 0; i < len; i++){fscanf(fp, "%s\t%s\t%s\t%s\t%d\t%d\t%d\n",s1.user_name, s1.password,s1.name, s1.sex, &s1.id,&s1.age, &s1.soc);// 插入到表中list_add(L, s1);}// 关闭文件fclose(fp);
}

 2. list.c

#include "list.h"/********************************** 登录 **********************************/
// 学生登录
bool Student_log_in(list_str *L, int *index)
{printf("欢迎来到学生登录界面\n");// 声明两个字符串char user[128];char pass[128];while (1){// 清空字符串memset(user, 0, sizeof(user));memset(pass, 0, sizeof(pass));// 用户输入printf("请输入账号:");scanf("%s", user);printf("请输入密码:");scanf("%s", pass);// 循环判定for (size_t i = 0; i < L->len; i++){if (!strcmp(user, L->data[i].user_name)){if (!strcmp(pass, L->data[i].password)){*index = i;return true;}}}printf("登录失败,请重新登录!\n");}
}// 老师登录
bool Teacher_log_in(list_str *L)
{system("clear");printf("欢迎来到老师登录界面\n");// 声明两个字符串char user[128];char pass[128];while (1){// 清空字符串memset(user, 0, sizeof(user));memset(pass, 0, sizeof(pass));// 用户输入printf("请输入账号:");scanf("%s", user);printf("请输入密码:");scanf("%s", pass);// 循环判定for (size_t i = 0; i < L->len; i++){if (!strcmp(user, L->data[i].user_name)){if (!strcmp(pass, L->data[i].password)){return true;}}}printf("登录失败,请重新登录!\n");}
}// 初始化
void list_init(list_str **L)
{// 创建动态内存(*L) = (list_str *)malloc(sizeof(list_str));if (NULL == (*L)){printf("创建失败\n");exit(-1);}// 初始化数据(*L)->len = 0;return;
}// 增
bool list_add(list_str *L, stu_user data)
{// 判定是否为空if (NULL == L){printf("传入顺序表为空\n");exit(-1);}// 是否越界if (MAX_LEN <= L->len){printf("学生已经满了\n");return false;}// 插入操作L->data[L->len] = data;// 迭代长度L->len++;
}// 增 从终端输入
bool list_add_in(list_str *L)
{system("clear");list_printf(L);// 判定是否为空if (NULL == L){printf("传入顺序表为空\n");exit(-1);}// 是否越界if (MAX_LEN <= L->len){printf("学生已经满了\n");return false;}stu_user newStudent;char name[128];char sex[5];int flag = 0;printf("请输入你要添加学生的信息:\n");printf("姓名:");scanf("%s", newStudent.name);printf("性别:");scanf("%s", newStudent.sex);while (1){int add_id;printf("id:");scanf("%d", &add_id);for (int i = 0; i < L->len; i++){if (add_id == L->data[i].id){flag = 1;break;}}if (1 == flag){printf("你输入的id已重复,请重新输入");}}printf("年龄:");scanf("%d", &newStudent.age);printf("成绩:");scanf("%d", &newStudent.soc);printf("密码:");scanf("%s", newStudent.password);strcpy(newStudent.user_name, newStudent.name);// 插入操作L->data[L->len] = newStudent;// 迭代长度L->len++;printf("添加成功!\n");list_printf(L);
}// 尾删
bool list_del(list_str *L)
{system("clear");// 判定是否为空if (NULL == L){printf("传入顺序表为空\n");exit(-1);}// 是否没有学生了if (-1 >= L->len){printf("学生已经满了\n");return false;}// 删除尾部学生L->len--;printf("删除成功!\n");list_printf(L);
}// 老师改  姓名....
bool list_Teacher_alter(list_str *L)
{int op;char user_name[128]; // 账号char password[128];  // 密码char name[128];      // 学生姓名char sex[5];         // 学生性别int find_id;         // 查找学生idint age;             // 学生年龄int soc;             // 学生成绩system("clear");list_printf(L);printf("请输入你要修改的id:");scanf("%d", &find_id);printf("请输入你要修改的信息:\n");printf("1.账号\n2.密码\n3.姓名\n4.性别\n5.年龄\n6.成绩\n7.退出修改\n");while (1){scanf("%d", &op);switch (op){case 1:scanf("%s", L->data[find_id].user_name);break;case 2:scanf("%s", L->data[find_id].user_name);break;case 3:scanf("%s", L->data[find_id].name);break;case 4:scanf("%s", L->data[find_id].sex);break;case 5:scanf("%d", &L->data[find_id].age);break;case 6:scanf("%d", &L->data[find_id].soc);break;default:break;}printf("是否继续修改,是输入1,否输入0\n");scanf("%d", &op);if (0 == op)break;}printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",L->data[find_id].user_name, L->data[find_id].password,L->data[find_id].name, L->data[find_id].sex, L->data[find_id].id,L->data[find_id].age, L->data[find_id].soc);printf("修改成功!\n");
}// 老师查
bool list_Teacher_find(list_str *L)
{system("clear");int find_id;printf("请输入你要查找的id:");scanf("%d", &find_id);printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",L->data[find_id].user_name, L->data[find_id].password,L->data[find_id].name,L->data[find_id].sex, L->data[find_id].id,L->data[find_id].age, L->data[find_id].soc);printf("查找成功!\n");
}// 学生查  查自己
bool list_Student_find(list_str *L, stu_user data)
{system("clear");printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",data.user_name, data.password,data.name, data.name, data.id,data.age, data.soc);printf("查找成功!\n");
}// 成绩排序
bool list_sort(list_str *L)
{for (int i = 0; i < L->len; i++){for (int j = 0; j < j - i - 1; i++){if (L->data[j].soc > L->data[j + 1].soc){int t = L->data[j].soc;L->data[j].soc = L->data[j + 1].soc;L->data[j + 1].soc = t;}}}
}// 遍历程序
void list_printf(list_str *L)
{if (NULL == L){printf("传入顺序表为空\n");exit(-1);}printf("账号\t密码\t姓名\t性别\tid\t年龄\t成绩\n");for (size_t i = 0; i < L->len; i++){printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",L->data[i].user_name, L->data[i].password,L->data[i].name, L->data[i].sex, L->data[i].id,L->data[i].age, L->data[i].soc);}
}// 释放顺序表
void list_free(list_str **L)
{if (NULL == (*L)){printf("传入顺序表为空\n");exit(-1);}free(*L);*L = NULL;
}// 九九乘法表
void nine_nine()
{system("clear");for (int i = 1; i <= 9; i++){for (int j = 1; j <= i; j++){printf("%d * %d = %d\t", j, i, j * i);}printf("\n");}
}// 清屏
void clean_screen()
{system("clear");
}// 猜数字
void guess_num()
{system("clear");int val;val = (time(NULL)) % 100;int max_val = 99;int min_val = 0;int data;while (1){printf("请输入你要猜的数:");scanf("%d", &data);if (data > val){if (data > max_val){printf("输入数据违规,请输入数据:%d ~ %d\n", min_val, max_val);}else{max_val = data;printf("输入数据大了,请输入数据:%d ~ %d\n", min_val, max_val);}}if (data < val){if (data < min_val){printf("输入数据违规,请输入数据:%d ~ %d\n", min_val, max_val);}else{min_val = data;printf("输入数据小了,请输入数据:%d ~ %d\n", min_val, max_val);}}if (data == val){printf("恭喜你!!!猜对了\n");break;}}
}// 计算器
// 加
int add(int data1, int data2)
{return data1 + data2;
}// 减
int subtract(int data1, int data2)
{return data1 - data2;
}// 乘
int multiply(int data1, int data2)
{return data1 * data2;
}// 除
int divide(int data1, int data2)
{return data1 / data2;
}// 回调函数
typedef int (*count_func)(int, int);void counter()
{system("clear");count_func func[4];func[0] = add;func[1] = subtract;func[2] = multiply;func[3] = divide;int data1, data2;char ch;printf("请输入你要输入的算式:\n");scanf("%d %c %d", &data1, &ch, &data2);switch (ch){case '+':printf("%d %c %d = %d\n", data1, ch, data2, func[0](data1, data2));break;case '-':printf("%d %c %d = %d\n", data1, ch, data2, func[1](data1, data2));break;case '*':printf("%d %c %d = %d\n", data1, ch, data2, func[2](data1, data2));break;case '/':printf("%d %c %d = %d\n", data1, ch, data2, func[3](data1, data2));break;default:break;}
}

 3. main.c

#include "main.h"// 学生功能函数
// 学生登录
void Student_Func(list_str *list)
{// 登录int user_index = 0;clean_screen();if (!Student_log_in(list, &user_index)){printf("登录失败\n");exit(-1);}printf("恭喜你 登录成功\n");int op = 0; // 菜单选型while (1){// 写一个菜单printf("1、查成绩\n");printf("2、乘法表\n");printf("3、猜数字\n");printf("4、计算器\n");scanf("%d", &op);switch (op){case 1:/* 1、查成绩 */list_Student_find(list, list->data[user_index]);break;case 2:/* 2、乘法表 */nine_nine();break;case 3:/* 3、猜数字 */guess_num();break;case 4:/* 4、计算器 */counter();break;default:break;}}// 销毁顺序表
}// 老师登录
void Teacher_Func(list_str *list)
{// 登录if (!Teacher_log_in(list)){printf("登录失败\n");exit(-1);}clean_screen();printf("恭喜你 登录成功\n");int op = 0; // 菜单选型while (1){// 写一个菜单printf("1、增加学生\n");printf("2、删除学生\n");printf("3、成绩排序\n");printf("4、修改学生\n");scanf("%d", &op);switch (op){case 1:/* 1、增加学生 */// 1. 写一个函数 从 终端获取学生信息// 2. 插入list_add_in(list);break;case 2:/* 2、删除学生 */list_del(list);break;case 3:/* 3、成绩排序 */list_sort(list);break;case 4:/* 4、修改学生 */list_Teacher_alter(list);break;default:break;}}// 销毁顺序表list_free(&list);
}int main(int argc, char const *argv[])
{// 1 数据初始化 从文件中读取数据到表// 1.1 创建表list_str *list;list_init(&list);// 1.2 从文件中读取数据到表file_updata_list(list);// 2 选择 老师 或 学生登录int op = 0;clean_screen();printf("1、学生登录 2、老师登录\n");scanf("%d", &op);switch (op){case 1: // 学生登录Student_Func(list);break;case 2: // 老师登录Teacher_Func(list);break;default:break;}return 0;
}

五、Makefile

Src = ./Src/main.c ./Src/file.c ./Src/list.c# 编译选项
CFLAGS = -g -I./IncPro:$(Src)gcc $(CFLAGS) $(Src) -o Pro

 

 总体来说还是比较简单的,只是要注意多文件的结构和关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35907.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】第三弹:基于 XML 获取 Bean 对象

一、获取 Bean 对象 1.1 根据名称获取 Bean 对象 由于 id 属性指定了 bean 的唯一标识&#xff0c;所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。 1.确保存在一个测试类&#xff1a; public class HelloWorld {public void sayHello(){System.out.println(&quo…

Easysearch 索引生命周期管理实战

如果你的使用场景是对时序型数据进行分析&#xff0c;可能你会更重视最新的数据&#xff0c;并且可能会定期对老旧的数据进行一些处理&#xff0c;比如减少副本数、forcemerge、 删除等。Easysearch 的索引生命周期管理功能&#xff0c;可以自动完成此类索引的管理任务。 创建…

ARMv8.x-M架构计算能力概览

1.ARMv8.xM架构提供了哪些计算能力&#xff1f; ARMv7-M时代&#xff0c;Cortex-M系列CPU以提供通用计算能力为主。ARMv8-M架构提供了更加多样的计算能力。 首先&#xff0c;提供Thumb2指令集提供整数通用计算能力。 其次&#xff0c;ARMv8.x-M架构手册明确列出了更多可选的CPU…

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…

大模型GGUF和LLaMA的区别

GGUF&#xff08;Gigabyte-Graded Unified Format&#xff09;和LLaMA&#xff08;Large Language Model Meta AI&#xff09;是两个不同层面的概念&#xff0c;分别属于大模型技术栈中的不同环节。它们的核心区别在于定位和功能&#xff1a; 1. LLaMA&#xff08;Meta的大语言…

一周学会Flask3 Python Web开发-SQLAlchemy查询所有数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们来新建一个的蓝图模块-班级模块&#xff0c;后面可以和学生模块&#xff0c;实现一对多的数据库操作。 blueprint下新建g…

STM32学习【5】用按键控制LED亮灭(寄存器)以及对位运算的思考

目录 1. 看原理图2 使能GPIOAGPIOA时钟模块2.2 设置引脚GPIO输入2.3 读取引脚值 3. 关于寄存器操作的思考 写在前面 注意&#xff0c;这篇文章虽然说是用按键控制led亮灭&#xff0c;重点不在代码&#xff0c;而是关键核心的描述。 用寄存器的方式&#xff0c;通过key来控制led…

js,html,css,vuejs手搓级联单选

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>级联选择器</title><script src"h…

【Spring】第四弹:基于XML文件注入Bean对象

一、setter 注入Bean对象 1.创建Student对象 public class Student {private Integer id;private String name;private Integer age;private String sex;public Student() {}public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String …

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近&#xff0c;国产AI大模型Deepseek成了网红爆款&#xff0c;大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

单目3d detection算法记录

1、centernet object as points 这篇文章的核心单目3d检测主要是利用中心点直接回归出3d模型的所有属性&#xff0c;head共享整个backbone&#xff0c;其中3d属性包括&#xff1a;2d目标中心点、2dw和h、2d offsets、3doffsets、3d dimmession、rot还有depth。 其中对应的dep…

MySQL程序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. mysqld (MySQL服务器) mysqld也被称为MySQL服务器&#xff0c;是⼀个多线程程序&#xff0c;对数据⽬录进⾏访问管理(包含数据库…

rust学习笔记17-异常处理

今天聊聊rust中异常错误处理 1. 基础类型&#xff1a;Result 和 Option&#xff0c;之前判断空指针就用到过 Option<T> 用途&#xff1a;表示值可能存在&#xff08;Some(T)&#xff09;或不存在&#xff08;None&#xff09;&#xff0c;适用于无需错误信息的场景。 f…

IIS 服务器日志和性能监控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能强大、灵活且可扩展的 Web 服务器&#xff0c;用于托管网站、服务和应用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供网页的协议&#xff0c;因此广泛用于企业环境。 IIS 的…

基于Netty实现高性能HTTP反向代理

以下将分步骤实现一个基于Netty的高性能HTTP反向代理&#xff0c;支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置&#xff08;Maven&#xff09; 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…

Feedback-Guided Autonomous Driving

Feedback-Guided Autonomous Driving idea 问题设定&#xff1a;基于 CARLA 的目标驱动导航任务&#xff0c;通过知识蒸馏&#xff0c;利用特权智能体的丰富监督信息训练学生传感器运动策略函数 基于 LLM 的端到端驱动模型&#xff1a;采用 LLaVA 架构并添加航点预测头&#…

OpenCV基础【图像和视频的加载与显示】

目录 一.创建一个窗口&#xff0c;显示图片 二.显示摄像头/多媒体文件 三.把摄像头录取到的视频存储在本地 四.鼠标回调事件 五.TrackBar滑动条 一.创建一个窗口&#xff0c;显示图片 import cv2img_path "src/fengjing.jpg" # 自己的图片路径 img cv2.imre…

springboot实现调用百度ocr实现身份识别

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

Linux--内核进程O(1)调度队列

⼀个CPU拥有⼀个runqueue 如果有多个CPU就要考虑进程个数的负载均衡问题 优先级 普通优先级&#xff1a;100〜139&#xff08;我们都是普通的优先级&#xff0c;想想nice值的取值范围&#xff0c;可与之对应&#xff01;&#xff09;实时优先级&#xff1a;0〜99&#xff08…

1.排序算法(学习自用)

1.冒泡排序 算法步骤 相邻的元素之间对比&#xff0c;每次早出最大值或最小值放到最后或前面&#xff0c;所以形象的称为冒泡。 特点 n个数排序则进行n轮&#xff0c;每轮比较n-i次。所以时间复杂度为O(n^2)&#xff0c;空间复杂度为O(1)&#xff0c;该排序算法稳定。 代码…