一、文件框架
?二、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
?
?總體來說還是比較簡單的,只是要注意多文件的結構和關系。