多模块小项目~~简*学生管理系统(重点思路咯)小白撸代码第30天
来源:互联网 发布:儿童编程 ipad 编辑:程序博客网 时间:2024/06/05 22:30
大家在浏览的时候一定注意.c/.h、可执行文件等相关文件的分文件操作,做到尽量提高代码运行效率~~~本人第一次写,不太好,望大家多评论,教教小弟!谢谢一定在心中深化MVC思想,做到尽量条理清晰,思路明确,毕竟工作中要的大多是严谨的逻辑和思维能力,以及认真仔细的学习态度和高效的学习效率。里边涉及到一点点链表的基础知识,初学者看看资料就可以了,学好指针哦!
第一个.c程序:main.c(主题思路和最外层框架的架构)
//main.c#include "stuLink.h"#include "control.h"#include <assert.h>int main(int argc, char **argv){ //链表的创建 StuLink *head = createLink(); assert(head); //读取文件 loadAllStudent(head); //主要逻辑控制 mainControl(head); //保存文件 saveAllStudent(head); //释放所有节点 freeAllLink(head); return 0;}
其中最为重要的就是执行程序所需要的最直接的代码部分,我把它叫主控制部分maincontrol;分别含有control.c和control.h。
//control.h:#ifndef CONTROL_H_#define CONTROL_H_#include "stuLink.h"/* 功能:主界面控制函数 参数:head 链表头节点 返回值:无*/void mainControl(StuLink* head);/* 功能:判定管理员登录 参数:无 返回值:1 成功, 0 失败*/int adminLogin(void);/* 功能:管理员界面控制函数 参数:head 链表头节点 返回值:无*/void adminControl(StuLink* head);/* 功能:学生界面控制函数 参数:head 链表头节点 返回值:无*/void studentControl(StuLink* head);#endif//control.c:#include "control.h"#include "view.h"#include "func.h"#include <stdio.h>#include <assert.h>#include <string.h>#define ADMIN "admin"#define PWD "12345"#define FFLUSH() { while(getchar () != '\n'); } //缓存清理#define CONTINUE(X) { while(getchar() != '\n'); printf(X); getchar (); } //屏幕暂停/* 功能:主界面控制函数 参数:head 链表头节点 返回值:无*/void mainControl(StuLink* head){ int choice = 0; while(1){ printMainView(); scanf("%d", &choice); switch(choice){ case 1: //管理员登录 if(adminLogin()){ printf("登录成功!\n"); //进入管理员界面 adminControl(head); }else{ printf("登录失败,请核对你的帐号和密码!\n"); } break; case 2: //学生登录 studentControl(head); break; case 3: //退出 return ; default: break; } }}//void mainControl(StuLink* head);/* 功能:判定管理员登录 参数:无 返回值:1 成功, 0 失败*/int adminLogin(void){ char name[20] = {'\0'}; char pwd[20] = {'\0'}; printf("请输入管理员帐号:"); scanf("%s", name); printf("请输入管理圆密码: "); scanf("%s", pwd); if(!strcmp(name, ADMIN) && !strcmp(pwd, PWD)){ return 1; }else{ return 0; }}/* 功能:管理员界面控制函数 参数:head 链表头节点 返回值:无*/void adminControl(StuLink* head){ assert(head); int choice = 0; int id = 0; while(1){ adminView(); scanf("%d", &choice); switch(choice){ case 1: //添加 if(insertStudent(head)){ printf("添加学生成功\n"); }else{ printf("添加学生失败\n"); } break; case 2: //打印 printAllStudent(head); break; case 3: //删除 if(!deleteNode(head)){ printf("删除失败!\n"); CONTINUE("结果看完了记得回车\n"); }else{ printf("删除成功!\n"); CONTINUE("结果看完了记得回车呦\n"); } break; case 4: //查询 printf("请输入要查询的学生的id:"); scanf("%d",&id); if(findNode(head,id) == NULL){ printf("未找到该学生!\n"); CONTINUE("结果看完了记得回车呦\n"); }else{ outNode(head,id); CONTINUE("结果看完了记得回车呦\n"); } break; case 5: //修改 printf("请输入要查询的学生的id:"); scanf("%d",&id); modifyNode(head,id); CONTINUE("结果看完了记得回车呦\n"); break; case 6: //排序 selectLink(head); CONTINUE("结果看完了记得回车呦\n"); break; case 0: //退出 return ; default: break; } }}void studentControl(StuLink* head){ assert(head); int choice = 0; int id = 0; char p1[30] = {'\0'}; while(1){ studentMenu(); scanf("%d",&choice); switch(choice){ case 1: printf("如需查看您的个人信息,请输入帐号和密码!\n"); printf("请输入帐号:"); scanf("%d",&id); while(getchar() != '\n'); printf("请输入密码:"); gets(p1); chatMyInf(head,id,p1); CONTINUE("结果看完了记得回车呦\n"); break; case 2: modifyKey(head); CONTINUE("结果看完了记得回车呦\n"); break; case 3: printf("byebye!!!\n"); CONTINUE("结果看完了记得回车呦\n"); return; default: break; } }}
接下来就是控制函数中包含的每个操作的一些功能函数,都在func.c和func.h中:
//func.h:#ifndef FUNC_H_#define FUNC_H_#include "stuLink.h"/* 功能:在链表尾部插入一个学生的信息 参数:head 头节点 返回值:1 成功 0 失败*/int insertStudent(StuLink* head);/* 功能:遍历链表打印所有学生 参数:head 头节点 返回值:无*/void printAllStudent(StuLink* head);/* 功能:删除指定学生 参数:head 头节点 返回值:0删除失败,1删除成功*/int deleteNode(StuLink* head);/* 功能:查找指定学生 参数:head 头节点 返回值:查找到的节点的地址*/StuLink* findNode(StuLink* head,int id);/* 功能:输出找到的学生的信息 参数:head头节点、学生id 返回值:空*/void outNode(StuLink* head,int id);/* 功能:修改制定学生的信息 参数:head头节点、学生id 返回值:空*/void modifyNode(StuLink* head,int id);/* 功能:对学生信息进行排序 参数:head头节点 返回值:空*/void selectLink(StuLink* head);/* 功能:对学生登录信息进行核实 参数:head头节点,id,密码 返回值:空*/void chatMyInf(StuLink* head,int id,char* p1);/* 功能:对学生登录密码进行修改 参数:head头节点,id,密码 返回值:空*/void modifyKey(StuLink* head);#endif//func.c:#include "func.h"#include <assert.h>#include <stdlib.h>#include <string.h>#include <stdio.h>/* 功能:在链表尾部插入一个学生的信息 参数:head 头节点 返回值:1 成功 0 失败*/int insertStudent(StuLink* head){ assert(head); Stu stu; memset(&stu, 0, sizeof(Stu)); //输入学生信息 printf("请输入学生的ID: "); scanf("%d", &(stu.id)); if(checkId(head, stu.id)){ return 0; } printf("请输入学生的姓名: "); scanf("%s", stu.name); //设置默认密码 strcpy(stu.pwd, "123456"); printf("请输入学号成绩: "); scanf("%lf", &(stu.score)); printf("请输入学生的年龄:"); scanf("%d", &(stu.age)); //链接到链表中 return insertNewNode(head, stu); }/* 功能:遍历链表打印所有学生 参数:head 头节点 返回值:无*/void printAllStudent(StuLink* head){ assert(head); StuLink* p = head->next; printf("学号\t\t姓名\t\t密码\t\t分数\t\t年龄\n"); while(p != NULL){ Stu stu = p->stu; printf("%d\t\t%s\t\t%s\t\t%.2lf\t\t%d\n", stu.id, stu.name, stu.pwd, stu.score, stu.age); p = p->next; }}/* 功能:删除指定学生 参数:head 头节点 返回值:0删除失败,1删除成功*/int deleteNode(StuLink* head){ assert(head); int id = 0; printf("请输入要删除的学生的id:"); scanf("%d",&id); if(!checkId(head,id)){ return 0; } StuLink* p = head; StuLink* delNode = NULL; while(p->next != NULL){ if(p->next->stu.id == id){ delNode = p->next; p->next = p->next->next; free(delNode); delNode = NULL; }else{ p = p->next; } } return 1;}/* 功能:查找指定学生 参数:head 头节点 返回值:查找到的节点的地址*/StuLink* findNode(StuLink* head,int id){ assert(head); StuLink* p = head->next; while(p != NULL){ if(p->stu.id == id){ return p; } p = p->next; } return NULL;}/* 功能:输出找到的学生的信息 参数:head头节点、学生id 返回值:空*/void outNode(StuLink* head,int id){ StuLink* p = findNode(head,id); printf("找到该学生,学生信息如下:\n"); printf("学号:%d\n姓名:%s\n成绩:%.2lf\n年龄:%d\n",p->stu.id,p->stu.name,p->stu.score,p->stu.age);}/* 功能:修改制定学生的信息 参数:head头节点、学生id 返回值:空*/void modifyNode(StuLink* head,int id){ StuLink* p = findNode(head,id); double score = 0.0; if(p){ printf("请输入要修改的学生的成绩:"); //scanf("%lf",p->stu.score); scanf("%lf",&score); p->stu.score = score; printf("修改成功!!!\n"); }else{ printf("未找到该学生!!!\n"); }}/* 功能:对学生信息进行排序 参数:head头节点 返回值:空*/void selectLink(StuLink* head){ assert(head); if(NULL == head->next || NULL == head->next->next){ printf("大哥!一个人怎么排?没有人排个锤子!!!\n"); return; } StuLink* p = head->next; StuLink* q = p; for(p = head->next;p->next != NULL;p = p->next){ for(q = p->next;q != NULL;q = q->next){ if(p->stu.score > q->stu.score){ int tmp = p->stu.score; p->stu.score = q->stu.score; q->stu.score = tmp; } } } printf("恭喜你,排序完成啦!\n");}/* 功能:对学生登录信息进行核实 参数:head头节点,id,密码 返回值:空*/void chatMyInf(StuLink* head,int id,char* p1){ assert(head); StuLink* p = head->next; int flag = 0; while(p != NULL){ if(p->stu.id == id && strcmp(p->stu.pwd,p1) == 0){ flag++; break; } p = p->next; } if(flag){ printf("登录成功,您的基本信息为:\n"); printf("姓名:%s\n年龄:%d\n成绩:%.2lf\n",p->stu.name,p->stu.age,p->stu.score); }else{ printf("帐号或密码错误\n"); }}/* 功能:对学生登录密码进行修改 参数:head头节点,id,密码 返回值:空*/void modifyKey(StuLink* head){ assert(head); printf("如需查看您的个人信息,请输入帐号和密码!\n"); printf("请输入帐号:"); int id = 0; scanf("%d",&id); while(getchar() != '\n'); printf("请输入密码:"); char p1[30] = {'\0'}; gets(p1); StuLink* p = head->next; int flag = 0; char p2[30] = {'\0'}; while(p != NULL){ if(p->stu.id == id && strcmp(p->stu.pwd,p1) == 0){ flag++; break; } p = p->next; } if(flag){ printf("登录成功!!\n"); printf("请输入15个字符以内的新密码(字符+数字+符号 = 更安全):\n"); gets(p2); if(strcmp(p1,p2) == 0){ printf("新旧密码重复!!"); return; }else{ strcpy(p->stu.pwd,p2); printf("修改成功!!\n"); } }else{ printf("你猜你的帐号密码对不对?\n"); sleep(1); printf("不对!!!\n"); }}
其次,是一些其他文件I/O操作,以及表连接,建表/插表、修改表等操作的函数,都在stuLink.h和stuLink.c中
//stuLink.h:#ifndef STULINK_H_#define STULINK_H_typedef struct student{ int id; char name[20]; char pwd[20]; double score; int age;}Stu;typedef struct stuLink{ Stu stu; struct stuLink* next;}StuLink;/* 功能:创建链表头节点 参数:无 返回值:头节点的地址*/StuLink* createLink(void);/* 功能:添加新节点 参数:head 头节点 stu 新节点的值域 返回值:1 成功 0 失败*/int insertNewNode(StuLink* head, Stu stu);/* 功能:释放所有节点 参数:头节点的地址 返回值:无*/void freeAllLink(StuLink* head);/* 功能:查询链表中是否存在该节点 参数:head 头节点 id 查找的节点 返回值:1 成功 0 失败*/int checkId(StuLink* head, int id);/* 功能:读取学生信息到内存中 参数:head 头节点 返回值:无*/void loadAllStudent(StuLink* head);/* 功能:保存学生信息到文件中 参数:head 头节点 返回值:无*/void saveAllStudent(StuLink* head);#endif//stuLink.c:#include "stuLink.h"#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>/* 功能:创建链表头节点 参数:无 返回值:头节点的地址*/StuLink* createLink(void){ StuLink* head = (StuLink*)calloc(1, sizeof(StuLink)); assert(head); head->next = NULL; return head;}/* 功能:添加新节点 参数:head 头节点 stu 新节点的值域 返回值:1 成功 0 失败*/int insertNewNode(StuLink* head, Stu stu){ assert(head); //新节点的申请 StuLink* newNode = (StuLink*)calloc(1, sizeof(StuLink)); assert(head); newNode->stu = stu; newNode->next = NULL; //找到尾节点 StuLink* p = head; while(p->next != NULL){ p = p->next; } //链接新节点 p->next = newNode; return 1;}/* 功能:释放所有节点 参数:头节点的地址 返回值:无*/void freeAllLink(StuLink* head){ assert(head); StuLink* p = head->next; StuLink* q = p; while(p != NULL){ q = p->next; free(p); p = q; } free(head);}/* 功能:查询链表中是否存在该节点 参数:head 头节点 id 查找的节点 返回值:1 成功 0 失败*/int checkId(StuLink* head, int id){ assert(head); StuLink* p = head->next; while(p != NULL){ if(id == p->stu.id){ return 1; } p = p->next; } return 0;}/* 功能:读取学生信息到内存中 参数:head 头节点 返回值:无*/void loadAllStudent(StuLink* head){ assert(head); //打开文件 FILE* fp = fopen("./data/stu.bin", "rb"); if(fp == NULL){ system("touch ./data/stu.bin"); fp = fopen("./data/stu.bin", "rb"); assert(fp); } //读取文件 Stu stu; memset(&stu, 0 ,sizeof(Stu)); while(fread(&stu, sizeof(Stu), 1, fp)){ insertNewNode(head, stu); } //关闭文件 fclose(fp); fp = NULL;}/* 功能:保存学生信息到文件中 参数:head 头节点 返回值:无*/void saveAllStudent(StuLink* head){ assert(head); //打开文件 FILE* fp = fopen("./data/stu.bin", "wb"); assert(fp); //写入文件 StuLink* p = head->next; while(p != NULL){ fwrite(&(p->stu), sizeof(Stu), 1, fp); p = p->next; } //关闭文件 fclose(fp); fp = NULL;}
最后嘛….菜单咯….自己来咯…….
阅读全文
0 0
- 多模块小项目~~简*学生管理系统(重点思路咯)小白撸代码第30天
- Android小项目之学生管理系统(附源码)
- 【Java】-小项目-小型学生管理系统
- 学生管理系统(模块和登陆)
- c++小项目(学生信息管理系统)
- 学生管理系统链接数据库问题解决思路
- 简化版学生管理系统,主要思路
- 学生管理系统小感
- 小程序--学生管理系统
- 学生管理系统 项目总结
- 学生管理系统项目演示
- 项目:学生管理系统[C++]
- Java 学生管理系统代码
- c++学生管理系统代码
- 学生管理系统代码赏析
- SSM整合开发的小Demo----毕业设计管理系统之学生模块
- 基于pickle模块的学生管理系统
- (小案例)数组应用:实现学生管理系统
- C语言(六)--数组
- C语言(七)--函数
- Linux下安装antiword
- C语言(八)--变量的存储类型
- [LeetCode] 453.Minimum Moves to Equal Array Elements
- 多模块小项目~~简*学生管理系统(重点思路咯)小白撸代码第30天
- TensorFlow学习笔记
- Scratch 游戏项目学习法 —— 接苹果(完)改良你的游戏
- PAT 甲级 1118. Birds in Forest (25)
- 第一次玩CsdnBOKE
- 198. House Robber
- 如何快速生成十九大会议内容摘要
- 多项式相加减【数据结构实验报告】
- webview高度自适应图文详情