多模块小项目~~简*学生管理系统(重点思路咯)小白撸代码第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;}

最后嘛….菜单咯….自己来咯…….

原创粉丝点击