教你如何玩飞c语言------学生管理系统篇下(系统篇)

教你如何玩飞c语言------学生管理系统篇下(系统篇)

呀哈喽,又到了见面的时候,今日是个特殊的日子,不仅仅是被八月甩在了身后,也不仅仅是即将抓住九月的脑袋,而是!明天就是TMD七夕!七夕!这是一个高富帅注定流泪的日子,一个穷逼注定吃狗粮的日子,还是一个。。。。。。程序猿注定加班的日子。。。那么闲聊到此结束,不要眨眼,不要鸡~动,接下来就是我们期待已久的学生管理系统篇下半部分亮相的日子!(到底有没有期待已久,谁知道呢,不过,我沙石乐的面不能丢啊!吃瓜群众:面?在哪呢,在哪呢…)咳咳,废话说完了,还是赶紧上代码把。来人啊,把朕的屠龙宝码呈上来!:

功能模块声明:
typedef char * charRef;

typedef void (*Runnable)(ListRef);

//查询学生信息:
void check(ListRef list);

//添加学生记录:
void add(ListRef list);

//删除学生记录:
void del(ListRef list);

//修改学生记录:
void update(ListRef list);

//启动系统:
void load(ListRef list);

//展示菜单:
void showMenu(charRef choice);

//责任链:
void taskChain(charRef choice,ListRef list);
功能模块实现:
void check(ListRef list){
    if(foreach(list) < 0)
        printf("There is not any lists and nodes!\n");
}

void add(ListRef list){
    fflush(stdin);
    char name[1024] = {0x00};
    int gender = GenderUnknow;
    int age = 0x00;
    double scores = (double)0x00;
    scanf("%s %d %d %lf",name,&gender,&age,&scores);
    printf("input successfully,adding...\n");
    if(push(list,newNode(name,gender,age,scores)) == null){
        printf("error: add fail!\n");
        return;
    }
    printf("info: add success!\n");
}

void del(ListRef list){
    printf("Please input the position:\n");
    fflush(stdin);
    int pos = 0x00;
    scanf("%d",&pos);
    if(pos == 0)
        return;
    if(remove(list,(const int)pos) < 0){
        printf("error: delete fail!\n");
        return;
    }
    printf("info: delete success!\n");
}

void update(ListRef list){
    printf("Please input the position:\n");
    fflush(stdin);
    int pos = 0x00;
    scanf("%d",&pos);
    fflush(stdin);
    printf("Please input the new information on the record in the position:\n");
    char name[1024] = {0x00};
    int gender = GenderUnknow;
    int age = 0x00;
    double scores = (double)0x00;
    scanf("%s %d %d %lf",name,&gender,&age,&scores);
    if(set(list,(const int)pos,newNode(name,gender,age,scores)) < 0){
        printf("error: delete fail!\n");
        return;
    }
    printf("info: delete success!\n");
}

const Runnable tasks[] = {check,add,del,update};
const int taskLen = 4;
const char *CHOICES = "1234";

void load(ListRef list){
    char choice = 0x00;
    while(TRUE){
        showMenu(&choice);
        taskChain(&choice,list);
        printf("Whether exit? y or n\n");
        fflush(stdin);
        scanf("%c",&choice);
        fflush(stdin);
        if(choice == 'y')
            break;
        system("cls");
        continue;
    }
}

void showMenu(charRef choice){
    printf("\n<-Student Infomation Managment System->\n");
    printf("1.check the information of students.\n"); 
    printf("2.add a new record of a student.\n"); 
    printf("3.remove a record of a student.\n"); 
    printf("4.update a record of a student.\n");
    printf("Please input your choice:\n\n");
    scanf("%c",choice);
}

void taskChain(charRef choice,ListRef list){
    int i = 0;
    for(;i <= taskLen - 1;++i){
        if(*choice != CHOICES[i])
            continue;
        break;
    }
    
    if(i == taskLen){
        printf("your choice is not is 1 or 2 or 3 or 4\n");
        return;
    }
    tasks[i](list);
}

代码上完了,接下来,就又是本石乐玩空气讲解的时候了,哈哈哈哈,各位不要打我,我也是让大家自主学习,绝对不会说是本博主懒得缘故的~

1.第一个功能模块:
void check(ListRef list) //查询学生信息
接口解析:传递一个ListRef实例(即链表)进入check合约中,然后调用foreach(这个也是我们文件中自定义的一个接口,这里采用了合约转发的手法)进行对链表的外部迭代遍历(很多人问石乐,为什么要把遍历说成是外部迭代,这个外部又是在强调啥?于是石乐我采纳了广大同胞的建议给大家科普一下外部迭代是啥:其实外部迭代就是指一般的遍历,这里的外部是指我们的遍历流程或者说是业务是直接交给我们开发者进行控制的,那么既然这个玩意儿是外部,那么内部呢?是不是又内部迭代啊?bingo!机智的你们猜对了,内部迭代的说法也是存在的!!!那么内部迭代到底是啥呢,可能学过Java的骚年了解这个内部迭代机制,但是本宝宝还是得科普一下滴!内部在这里就是指迭代的业务权不在我们开发者的手里,而是在计算核的手里,也就是并行化机制的手里,也就是多线程的手里,也就是异步的手里,也就是…总而言之,内部就是指我们的cpu核心掌握了这个内部迭代的控制权!那么这个有啥好处呢?简单来说,好处就是更加简洁了嘛,我们都不用控制了,能不简洁么?哈哈哈,还有一个主要意义就是提升了迭代的效率,毕竟我们的并发机制在搞它,能不快么?以上就是对外部迭代以及内部迭代的简单介绍!石乐科普完后就继续讲解主题了。continue…)。

2.第二个功能模块:
void add(ListRef list) 添加学生记录
接口解析:传递一个链表进入合约中,然后找到链表尾部rear,然后直接往它屁股后面,插!

3.第三个功能模块:
void del(ListRef list) //删除学生记录
接口解析:传递一个链表进入合约,然后通过输入得到要删除的记录的位置索引,然后用这个索引对这个记录进行查找到并且删除。

4.第四个功能模块:
void update(ListRef list) //修改学生记录
接口解析:传递一个链表进入合约,然后输入得到要修改的记录的索引位置,然后找到这个记录,进行修改,修改的数据来源为用户输入。

5.第五个功能模块:
void load(ListRef list) //启动系统
接口解析:顾名思义,启动整个学生管理器系统的接口。

6.第六个功能模块:
void showMenu(charRef choice) //展示菜单
接口解析:简单的打印出选择项功能菜单。

7.第七个功能模块:
void taskChain(charRef choice,ListRef list) //责任链模块
接口解析:通过传入的选择项和链表,进行责任链的选择执行,自动去调用相应的功能模块。

源文件(测试管理系统的文件):

#include "System.h"

int main(const int argc,const char *args[]){
    NodeRef nodes[] = {newNode(0x00,0x00,0x00,0x00)};
    //启动系统:
    load(newList(nodes,1));
    return EXIT_SUCCESS;
}

当 当 当 当!看到没,启动管理系统就一行代码啊,一行代码!就这,你还学不会么,就这?你们绝对学得会,相信自己,加油同志们!石乐撸完这最后一行字就要下班了,哈哈哈哈哈哈哈!明天七夕,就不陪你们这群单身狗了,哈哈哈哈哈~(吃瓜群众:这绝对是反派吧,是吧!是吧!)。

注:感兴趣的小伙伴们,想要一起交流问题的小伙伴们,请加QQ:1611653027(ID:沙石乐),下面附上我们的QQ学习群,骚年们!一起来交流吧!:1121175506。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值