一、文件框架
二、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; // 学生id
- int 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; // 查找学生id
- int 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
五、Makefile
- Src = ./Src/main.c ./Src/file.c ./Src/list.c
- # 编译选项
- CFLAGS = -g -I./Inc
- Pro:$(Src)
- gcc $(CFLAGS) $(Src) -o Pro
复制代码
总体来说照旧比较简朴的,只是要注意多文件的结构和关系。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |