一、文件框架
二、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
总体来说还是比较简单的,只是要注意多文件的结构和关系。