【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.pswp.cn/web/72639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72639.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenResty/Lua 編碼指南/指南

很多開發語言都有自己的編碼規范&#xff0c;來告訴開發者這個領域內一些約定俗成的東西&#xff0c;讓大家寫的代碼風格保持一致&#xff0c;并且避免一些常見的陷阱。這對于新手來說是非常友好的&#xff0c;可以讓初學者快速準確地上手。比如 Python 的 PEP 80&#xff0c;就…

數據結構 -- 二叉樹的存儲結構

二叉樹的存儲結構 順序存儲 #define MaxSize 100 struct TreeNode{ElemType value; //結點中的數據元素bool isEmpty; //結點元素是否為空 };//定義一個長度為MaxSize的數組t&#xff0c;按照從上至下、從左至右的順序依次完成存儲完全二叉樹中的各個節點 TreeNode t[MaxSi…

Linux系統移植篇(十一)Linux 內核啟動流程

要分析 Linux 啟動流程&#xff0c;同樣需要先編譯一下 Linux 源碼&#xff0c;因為有很多文件是需要編譯才 會生成的。首先分析 Linux 內核的連接腳本文件 arch/arm/kernel/vmlinux.lds&#xff0c;通過鏈接腳本可以 找到 Linux 內核的第一行程序是從哪里執行的。vmlinux.lds …

【Docker入門】構建推送第一個Docker映像

【Docker入門】構建推送第一個Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是輕量級的可執行獨立包&#xff0c;包含代碼、運行時、庫、環境變量以及配置文件&#xff0c;它對于運行軟件至關重要。注冊表可在團隊間分享映像。…

【eNSP實戰】(續)一個AC多個VAP的實現—將隧道轉發改成直接轉發

在 一個AC多個VAP的實現—CAPWAP隧道轉發 此篇文章配置的基礎上&#xff0c;將隧道轉發改成直接轉發 一、改成直接轉發需要改動的配置 &#xff08;一&#xff09;將連接AP的接口改成trunk口&#xff0c;并允許vlan100、101、102通過 [AC1]interface GigabitEthernet 0/0/8 …

SPI 總線協議

1、協議介紹 SPI&#xff0c;是英語 Serial Peripheral interface 的縮寫&#xff0c;顧名思義就是串行外圍設備接口。是 Motorola 首先在其 MC68HCXX 系列處理器上定義的。 SPI&#xff0c;是一種高速的&#xff0c;全雙工&#xff0c;同步的通信總線。主節點或子節點的數據在…

我愛學算法之——滑動窗口攻克子數組和子串難題(上)

現在來學習"滑動窗口"這一算法思想。 至于什么是"滑動窗口"呢&#xff1f;簡單來說就是同向雙指針&#xff1b;現在來通過題目來了解什么是"滑動窗口" 一、長度最小的子數組 題目鏈接&#xff1a;長度最小的子數組 題目解析 先來看題目&#…

ora-600 ktugct: corruption detected---惜分飛

接手一個oracle 21c的庫恢復請求,通過Oracle數據庫異常恢復檢查腳本(Oracle Database Recovery Check)腳本檢測之后,發現undo文件offline之后,做了resetlogs操作,導致該文件目前處于WRONG RESETLOGS狀態 嘗試恢復數據庫ORA-16433錯誤 SQL> recover datafile 1; ORA-00283:…

20. Excel 自動化:Excel 對象模型

一 Excel 對象模型是什么 Excel對象模型是Excel圖形用戶界面的層次結構表示&#xff0c;它允許開發者通過編程來操作Excel的各種組件&#xff0c;如工作簿、工作表、單元格等。 xlwings 是一個Python庫&#xff0c;它允許Python腳本與Excel進行交互。與一些其他Python庫&#x…

IIS 服務器日志和性能監控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能強大、靈活且可擴展的 Web 服務器&#xff0c;用于托管網站、服務和應用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供網頁的協議&#xff0c;因此廣泛用于企業環境。 IIS 的…

jenkins pipline 自動化測試

以下是一個典型的 Jenkins Pipeline 示例&#xff0c;用于執行自動化測試流程&#xff08;支持單元測試、集成測試、代碼質量掃描&#xff09;&#xff0c;包含多階段執行和測試結果處理&#xff1a; pipeline {agent anyenvironment {// 定義環境變量PROJECT_NAME "my-…

APP測試

一、APP測試范圍 功能測試性能測試&#xff1a;CPU、內存占用、啟動速度、流量、電量消耗、流暢度、穩定性專項測試&#xff1a;安裝卸載升級、push消息推送 、交叉事件測試 、用戶體驗測試 、兼容性測試 二、APP包發布方式及策略 分類&#xff1a; 內部發布渠道。如&#x…

12 File文件對象:創建、獲取基本信息、遍歷文件夾、查找文件;字符集的編解碼 (黑馬Java視頻筆記)

文章目錄 File >> 存儲數據的方案1. 認識File2. File操作2.1 創建File對象2.2 File操作1&#xff09;對文件對象的信息的操作2&#xff09;文件/文件夾的創建/刪除3&#xff09;??對文件夾的遍歷 3. 方法遞歸3.1 認識遞歸3.2 遞歸算法及其執行流程1) 案例&#xff1a;2…

oracle 基礎知識之 多表查詢

多表查詢定義&#xff1a;當查詢的數據并不是來源一個表時&#xff0c;需要使用多表連接操作完成查詢。多表連接查詢通過表之間的關聯字段&#xff0c;一次查詢出多個表的數據。多表查詢包括了等值連接、左連接、右連接、完全連接。 1.等值連接 等值連接也稱為簡單連接&#xf…

服務器防火墻根據什么特征來過濾數據包?

防火墻是服務器安全防護的第一道屏障&#xff0c;它的主要作用是監控、過濾和控制進出服務器的數據流量&#xff0c;防止惡意攻擊、非法訪問和數據泄露。防火墻通過分析數據包的特定特征來決定是否允許、拒絕或限制數據的傳輸。 服務器防火墻的基本工作原理&#xff1a; 防火墻…

Prims region.Views 為null

原因&#xff1a; 導航未完成或異步問題 解決方式&#xff1a;使用回調確認導航完成后再操作視圖 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…

reconstruct_3d_object_model_for_matching例子

文章目錄 1.獲取om3文件2.準備可視化3.準備3D可視化4.讀取3D模型5.顯示成對注冊結果16.顯示成對注冊結果27.聯合注冊模型8.處理圖像8.1子采樣8.2 圖像計算與平滑8.3 三角測量 9.基于表面做3D匹配10.評估模型準確度10.1 在場景中找到模型10.2 計算模型和場景之間的距離 11.立體系…

軟件安全性測試的重要性和常用工具介紹,軟件測試服務公司推薦

在當今數字化快速發展的時代&#xff0c;軟件已經成為各行各業不可或缺的一部分。然而&#xff0c;隨著軟件系統的復雜性增加&#xff0c;安全性問題也愈發突出&#xff0c;因此軟件產品生產周期中安全測試必不可少。軟件安全性測試是指對軟件系統進行評估&#xff0c;以發現潛…

Redis項目:短信驗證碼登錄

這是黑馬的黑馬點評項目&#xff0c;短信驗證碼的業務。一開始是使用session做的&#xff0c;后來重構&#xff0c;使用redis緩存來完成。 第一層攔截器&#xff1a; public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stri…

Docker下載,包含Win、Mac

介紹 Docker 是一種開源的容器化平臺&#xff0c;通過操作系統級虛擬化技術實現應用的快速開發、部署和運行。以下從多個維度對 Docker 進行詳細介紹&#xff1a; 一、Docker 的核心概念與功能 容器化技術 Docker 利用 Linux 內核的容器隔離技術&#xff08;如 Cgroups 和 Nam…