对于这个项目是每一个刚学编程的必备入门项目,今天就由我来给各位详细介绍下,该项目基于双向循环链表编写,主要分为管理员和学生两个系统界面,还有一个主界面用于选择管理员还是学生。
学生界面可以查看c语言成绩排名查看自己的信息,管理员界面可以添加学生信息,查找学生,删除学生,修改学生信息,根据学生id进行升序排序,根据学生成绩降序排序,修改管理员登录密码等等,
前半部分为项目详解(源码见文章最后);代码注释超级详细!!!
注意:首先做任何项目之前需要先构思,确定项目的内容及怎么实现,确定一个大概的框架,做到事半功倍的效果,项目构思图片如下
1,让我们进入项目分段解析;首先编译过后会弹出主界面,用于选择身份
选择管理员之后需要输入密码才能进入,初始密码12345678,输入错误会提示两秒后重试
输入正确之后进入管理员界面如下输入选项实现功能
选择学生界面如下
ui界面介绍完毕让我们来看看源码吧,
首先任何代码都是由main函数进入,main文件如下
#include"linkend.h"
#include"ui.h"
#include"mainaff.h"
/******************使用说明****************************/
/*一.各文件说明
studentmain.c是主函数
mainaff.c是主函数的功能实现文件,为了主函数更加简介
mainaff.h上一个文件内所使用函数的说明
linkend.c是链表文件,将本文件看作一个工具箱,提供给mainaff.c使用!
linkend.h是上一个文件内所使用的函数说明
ui.c是界面实现的函数,运用了大量颜色转变及底色,运行后查看效果
ui.h是上一个文件内所使用的函数说明
二.运行逻辑
程序从主函数进入,遇到do-while循环,switch阻塞等待用户选择,
选择执行某个功功能,执行完成后退回 重新选择下一个功能,主函数内函数命名均为中文拼音形式
三.个文件运行流程
主函数文件(studentmain)>>界面文件(ui.c)>>主函数的功能实现文件(mainaff.c)>>
>>>链表文件(linkend.c)>>>界面文件(ui.c)............往复执行
***************/
int main(int argc,char* argv[])
{
int sum=12345678;//管理员密码
pnode phead=create();//创建头节点
int num=0;//主界面选择管理员还是学生的变量
int ass=0;//管理员的功能变量
int we=0;//学生功能选择变量
AAA://跳转主界面的标志位
hshshs();//主界面函数
do
{
scanf("%d",&num);//输入主界面选择变量
switch(num)//管理员和学生的选择
{
case 1://选择管理员
admlogin(sum);//管理员密码判断
do
{
adm();//管理员界面
scanf("%d",&ass);//输入管理员选择变量
switch(ass)//管理员界面选择
{
case 1:
/******添加学生信息******/
system("clear");
tianjia(phead);
break;
case 2:
/********查找学生********/
system("clear");
chazhao(phead);
break;
case 3:
/******修改学生信息*******/
system("clear");
xiugai(phead);
break;
case 4:
/***********删除学生*******/
system("clear");
shanchu(phead);
break;
case 5:
/********显示学生信息*****/
system("clear");
dayin(phead);
break;
case 6:
/*********比较学生信息*******/
system("clear");
paixu(phead);
break;
case 7:
/*******管理员密码********/
system("clear");
srand(time(NULL));//
int yanzhen=rand()%100000;//随即生成验证码(最大99999)
int shuyan;//输入验证码匹配
int xinmi;//新密码
printf("\n");
printf("等待系统发送验证码>>>>>\n");
sleep(3);
printf("您的验证码是:%d\n",yanzhen);
ppp:
sleep(1);
printf("\033[33m\033[37m请输入系统发送的验证码:");scanf("%d",&shuyan);
printf("\n\033[0;42m正在验证.............\033[0m\n");
sleep(2);
if(shuyan==yanzhen)
{
sleep(1);
printf("\n\033[33m\033[37m验证码正确,请输入新的密码:");
scanf("%d",&xinmi);
sum=xinmi;//新密码覆盖旧密码
sleep(2);
printf("密码修改成功哦\n");
printf("修改密码后请重新登陆!\n");
}
else
{
sleep(2);
printf("\033[33m\033[31m\n验证码错误,请重新输入验证码!\n\n");
goto ppp;
}
case 0:printf("感谢使用 ===管理员系统=== 已退出\n");goto AAA;//跳转到主界面
default : printf("没有此选项,请重新输入您的选项\n");break;
}//管理员switch下括号
}while(ass);//管理员选项的循环
case 2://选择学生系统
/*******学生界面*****/
do
{
StuDesk();//学生界面
scanf("%d",&we);//输入学生选择变量
switch(we)
{
case 1:
/***********查看自己的信息******/
system("clear");
printf("请记住自己的id\n\n");
chazhao(phead);
break;
case 2:
/**********查看C语言成绩排名*****/
system("clear");
Cpaixu(phead);
break;
case 0: printf("感谢使用 ===学生系统=== 已退出\n");goto AAA;//跳转到主界面
default: printf("没有此选项,请重新输入您的选项\n");break;
}
}while(we);//学生系统选项循环
case 0: printf("感谢使用====学生管理系统==== 已退出\n");break;
default :printf("没有此选项,请重新输入您的选项\n");break;
}//选择管理员还是学生的switch下括
}while(num);//外层系统循环
return 0;
}//main函数的下括号
mainaff.c文件
#include"mainaff.h"
//添加学生信息(头节点插入)
void tianjia(pnode phead)
{
printf("****************************\n");
printf("*********录入学生信息*********\n");
//定义个结构体变量
stu huaqin;
//输入信息到huaqin
printf("学号:");scanf("%d",&huaqin.id);
printf("年龄:");scanf("%d",&huaqin.age);
printf("C语言成绩:");scanf("%d",&huaqin.program);
printf("姓名:");scanf("%s",huaqin.name);
printf("性别:");scanf("%s",huaqin.sex);
//调用头插入法
insert_head(phead,&huaqin,sizeof(stu));//stu是32字节
printf("添加成功哦\n");
}
//查找学生信息
void chazhao(pnode phead)
{
printf("请输入学生学号查找\n");
stu pte;//定义pte变量
printf("学号:");
scanf("%d",&pte.id);
pnode ptemp=node_find(phead,&pte,stuCmp);//查找函数
if(!ptemp)//查找函数的返回值为空
{
printf("找不到,可能是以下原因\n\n" );
printf(" 已经删除了\n\n");
printf(" 已经修改了,原来信息不存在\n\n");
printf(" 没有添加该学生\n\n");
}
else//不为空就打印
{
printf("找到了,信息如下\n" );
printf("\n");
printf("学号:%d\n年龄:%d\n姓名:%s\n性别:%s\nC成绩:%d\n",ptemp->data->id,ptemp->data->age,ptemp->data->name,ptemp->data->sex,ptemp->data->program);
}
}
//修改学生信息
void xiugai(pnode phead)
{
QQQ:
printf("请输入要修改学生的学号\n\n");
printf("学号:");
stu pte;//定义结构体变量
scanf("%d",&pte.id);
//先调用查找函数找到,查找函数调用了id比较函数
pnode ptemp=node_find(phead,&pte,stuCmp);
//查找函数的返回值为空
if(ptemp==NULL)
{
printf("没有该id的学生;重新输入>>>>>\n\n");
goto QQQ;
}
else
{
//定义p指向查找函数的找到的节点
pnode p=ptemp;
int id; //id
int age; //年龄
int program; //c语言成绩
char name[10]; //姓名
char sex[10]; //性别
printf("\n请输入要修改的学号:\n");//给p赋值
scanf("%d",&id);
p->data->id=id;
printf("请输修改学生年龄:\n");
scanf("%d",&age);
p->data->age=age;
printf("请输入学生的C语言成绩:\n");
scanf("%d",&program);
p->data->program=program;
printf("请输修改学生名字:\n");
scanf("%s",name);
printf("请输入学生的性别:\n");
scanf("%s",sex);
//名字性别是字符串需要拷贝进去
strcpy(p->data->name,name);
strcpy(p->data->sex,sex);
updata(phead,ptemp,p->data,sizeof(stu));//调用修改函数
}
}
//删除函数
void shanchu(pnode phead)
{
stu pte;//定义结构体变量
SSS:
printf("请输入要删除学生的学号\n");
printf("学号:");
scanf("%d",&pte.id);
//调用查找函数,查找函数调用了id比较函数
pnode ptemp=node_find(phead,&pte,stuCmp);
if(!ptemp)//查找函数没找到
{
printf("没有这个学号的相关信息,重新输入\n\n");
goto SSS;
}
else
{
//调用删除函数,传入找到学生的id
delete(phead,ptemp->data->id);
}
}
//打印所有学生信息
void dayin(pnode phead)
{
//打印函数 调用了 单个打印函数
node_Show(phead,StuShow);
}
//按要求给学生排序
void paixu(pnode phead)
{
int qaz=0;//switch变量
printf("如果需要id从小到大排序就按 1;\n\n");
printf("如果需要成绩从高到低排序就按 2;\n\n");
printf("退出按0;\n\n");
printf("请选择>>>>>");
do
{
scanf("%d",&qaz);
switch(qaz)
{
case 1:
printf("按照id排序\n");
//id冒泡排序函数 调用id比较函数
node_sort(phead,stuCmp);
//输出所有学生信息 调用了单个输出函数
node_Show(phead,StuShow);
break;
case 2:
printf("按照成绩排序\n");
//成绩冒泡排序函数 调用成绩比较函数
node_chenji(phead,stuwsx);
//输出所有学生信息 调用了单个输出函数
node_Show(phead,StuShow);
break;
default :printf("退出\n");
break;
}
}while(qaz);
}
//C语言成绩排序
void Cpaixu(pnode phead)
{
printf("按照成绩从高到低排序\n");
//成绩冒泡排序函数 调用成绩比较函数
node_chenji(phead,stuwsx);
//输出所有学生信息 调用了单个输出函数
node_Show(phead,StuShow);
}
mainaff.h函数
#ifndef _UI_HHHH__
#define _UI_HHHH__
//调用链表头文件
#include"linkend.h"
//添加学生信息
void tianjia(pnode phead);
//查找学生信息
void chazhao(pnode phead);
//修改学生信息
void xiugai(pnode phead);
//删除学生信息
void shanchu(pnode phead);
//打印所有学生信息
void dayin(pnode phead);
//按照要求给学生排序
void paixu(pnode phead);
//C语言成绩排序
void Cpaixu(pnode phead);
#endif
linkend.c文件
#include"linkend.h"
/*功能:管理员登陆密码对比
* 参数:传入管理员密码
* 返回值:无
**/
int admlogin(int add)
{
int num;
AA:
printf("请输入管理员密码\n");
scanf("%d",&num);
if(add!=num)//输入的密码和传入的密码不一样
{
printf("密码错误,请等两秒输入\n");
sleep(2);
goto AA;
}
if(add==num)
{
printf("密码正确,稍等\n");
sleep(2);
}
return 0;
}
/*功能:创建头节点
* 参数:无
* 返回值:返回头节点指针
**/
pnode create()
{
pnode phead=(pnode)malloc(sizeof(node));//申请节点
if(phead==NULL)//容错
{
perror("mallocphead!\n");
exit(-1);
}//头节点赋值
phead->data=NULL;
phead->next=phead;
phead->prve=phead;
return phead;
}
/***功能:头节点插入
* 参数:1:头节点指针
* 2:需要存入链表的数据
* 3:需要存放的数据大小
* 返回值:无
**/
void insert_head(pnode phead,stu* data,int size)
{
pnode pnew=(pnode)malloc(sizeof(node));//申请新节点
if(pnew==NULL)//容错
{
perror("mallocpnew!!\n");
exit(-1);
}
pnew->prve=NULL;//给新节点赋值
pnew->next=NULL;
pnew->data=malloc(size);//可做容错
memcpy(pnew->data,data,size);//将申请的
if(phead->next == phead) //如果没有数据节点的情况
{
pnew->prve = phead;
phead->next = pnew;
phead->prve = pnew;
pnew->next = phead;
}
else//有数据节点的情况
{
pnew->next = phead->next;
pnew->prve = phead;
phead->next->prve = pnew;
phead->next = pnew;
}
}
/***功能:打印所有信息
* 参数:1:头节点指针
* 2:单个打印的函数
* 返回值:无
**/
void node_Show(pnode phead,void(*show)(void* pdata))
{
//创建p指针保存第一个数据节点
pnode p = phead->next;
if(p->data==NULL)//判断空
{
printf("现在还没有学生信息,请输入后重试\n\n");
}
while (p !=phead)//第一个数据节点不等于头节点循环
{
//调用单个打印函数循环打印
StuShow(p->data);
printf("\n");
p = p->next;//循环自加
}
}
/***功能:打印单个学生信息
* 参数:1:需要打印的数据
* 返回值:无
**/
void StuShow(void* pdata)
{
if(!pdata)//容错
{
return ;
}
//强转赋给p1
stu * p1 = (stu *)pdata;
printf("学号:%d\t年龄:%d\t姓名:%s\t性别:%s\tC成绩:%d\t",p1->id,p1->age,p1->name,p1->sex,p1->program);
}
/***功能:查找学生信息
* 参数:1:头节点指针
* 2:需要查找的学生数据(id)
* 3:查找id的函数(stuCmp)
* 返回值:找到的节点指针
**/
pnode node_find(pnode phead,void *data,int(*cmp)( void* pa, void* pb))
{
if(phead == NULL||data==NULL) //容错
{
printf("头为空 或 数据不存在\n");
return NULL;
}
//创建ptemp指针保存第一个数据节点
pnode ptemp = phead->next;
while (ptemp != phead)//循环
{
//查找id的函数如果返回值等于0,找到了
if(cmp(ptemp->data,data)==0)
{
return ptemp;
}
ptemp = ptemp->next;//循环自加
}
return NULL;
}
/***功能:修改学生信息
* 参数:1: 头节点指针
* 2:需要修改的节点(把ptemp位置的数据修改为传入的数据)
* 3: 外部传入的数据(以写好)
* 4:数据大小(stu型)
* 返回值:
**/
void updata(pnode phead,pnode ptemp,stu* data,int size)
{
if(phead==NULL||ptemp==NULL)//容错
{
return ;
}
if(ptemp->data==NULL)//释放数据
{
free(ptemp->data);
}
//申请空间强转化类型
ptemp->data=(stu*)malloc(size);
if(ptemp->data==NULL)//新数据空间容错
{
return ;
}
//拷贝数据到新数据空间
memcpy(ptemp->data,data,size);
printf("修改成功\n");
}
/***功能:删除学生信息
* 参数:1: 头节点指针
* 2:需要删除的学生id
* 返回值:
**/
void delete(pnode phead,int id)
{
pnode ptemp=phead;//定义指针
while(ptemp->next!=phead)//不等于头循环
{
ptemp=ptemp->next;//循环自加
//如果传入的id有
if(ptemp->data->id==id)
{
//链接与断开
ptemp->prve->next = ptemp->next;
ptemp->next->prve = ptemp->prve;
printf("\n删除成功!\n");
free(ptemp->data);
free(ptemp); //释放内存并置空
ptemp = NULL;
return ;
}
}
}
//id比较函数
int stuCmp( void* pa, void* pb)
{
//比较学生id的信息
struct student* p1 = (stu*)pa;//强转
struct student* p2 = (stu*)pb;
//相同说明找到了
if(p1->id == p2->id)
{
return 0;
}
else if(p1->id > p2->id)
{ //返回值大于0
return 1;
}
else if(p1->id < p2->id)
{ //返回值小于0
return -1;
}
}
//成绩排序函数
int stuwsx(void* pa,void* pb)
{
//比较学生成绩
stu* p1=(stu*)pa;//强转
stu* p2=(stu*)pb;
if(p1->program == p2->program)
{
return 0;
}
else if(p1->program > p2->program)
{ //返回值大于0
return 1;
}
else if(p1->program < p2->program)
{ //返回值小于1
return -1;
}
}
/***功能:id冒泡排序
* 参数:1: 头节点指针
* 2:id比较函数
* 返回值:无
**/
void node_sort(pnode phead,int (*cmp)( void* pa, void* pb))//排序
{
//用来遍历数据
pnode temp_q = phead->next;//指向第一个数据节点
pnode temp_end = phead->prve;//找到最后末尾的节点
void* tempData=NULL;//中间变量
while(temp_end != phead->next) //外循环次数处理,最后一个不等于第一个
{
temp_q = phead->next;//将第一个节点数据给i
while(temp_q!= temp_end)//如果第一个节点不等于最后一个节点
{
//拿第一个和 第一个的下一个 在传入函数里比较
//如果返回值大于0,说明第一个比第二个大
//id大的排后面
if(cmp(temp_q->data ,temp_q->next->data)>0)
{
tempData = temp_q->data;//进行数据交换
temp_q->data = temp_q->next->data;
temp_q->next->data = tempData;
}
temp_q = temp_q->next;//向后循环跑起来
}
temp_end = temp_end->prve;//外层循环向前跑起来
}
}
/***功能:成绩冒泡排序
* 参数:1: 头节点指针
* 2:成绩比较函数
* 返回值:无
**/
void node_chenji(pnode phead,int (*cmp)( void* pa, void* pb))//排序
{
//用来遍历数据
pnode temp_q = phead->next;//指向第一个数据节点
pnode temp_end = phead->prve;//找到最后末尾的节点
void* tempData=NULL;//中间变量
while(temp_end != phead->next) //外循环次数处理,最后一个不等于第一个
{
temp_q = phead->next;//将第一个节点数据给i
while(temp_q!= temp_end)//如果第一个节点不等于最后一个节点
{
//拿第一个和 第一个的下一个 在传入函数里比较
//如果返回值小于0,说明第一个比第二个小
//成绩小排到后面
if(cmp(temp_q->data ,temp_q->next->data)<0)
{
tempData = temp_q->data;//进行数据交换
temp_q->data = temp_q->next->data;
temp_q->next->data = tempData;
}
temp_q = temp_q->next;//向后循环跑起来
}
temp_end = temp_end->prve;//外层循环向前跑起来
}
}
linkend.h文件
#ifndef __LINKEND__HH__
#define __LINKEND__HH__
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include<unistd.h>
#include<time.h>
/*学生结构体*/
typedef struct student
{
int id; //id
int age; //年龄
int program; //c语言成绩
char sex[10]; //性别
char name[10]; //姓名
}stu;//别名
/*链表结构体*/
typedef struct Node
{
stu* data;//学生数据
struct Node* prve;//前指针域
struct Node* next;//后指针域
}node,*pnode;//结构体指针别名
//管理员界面功能
//输入管理员和密码完成登陆
int admlogin(int add);
//创建头节点
pnode create();
//添加学生信息
void insert_head(pnode phead,stu* data,int size);
//删除学生信息
void delete(pnode phead,int id);
//查找学生信息
pnode node_find(pnode phead,void* data,int (*cmp)( void* pa, void* pb));
//修改学生信息
void updata(pnode phead,pnode pnew,stu* data,int size);
//打印单个学生信息
void StuShow(void* pdata);
//打印所有学生信息
void node_Show(pnode phead,void(*show)(void* pdata));
//id比较函数
int stuCmp( void* pa, void* pb);
//id冒泡排序
void node_sort(pnode phead,int (*cmp)( void* pa, void* pb));
//成绩比较函数
int stuwsx(void* pa,void* pb);
//成绩冒泡排序
void node_chenji(pnode phead,int (*cmp)( void* pa, void* pb));
#endif
ui.c文件(该文件中涉及代码颜色修改,所以子啊代码中看到界面比较杂乱,但实际运行效果如图2)
#include "ui.h"
#include "linkend.h"
/*主界面*/
void hshshs()
{
printf("\033[0;46m**************************************************************\033[0m\n");
printf("\033[0;46m**************************************************************\033[0m\n");
printf("\033[0;46m**************************************************************\033[0m\n");
printf("\033[33m\033[31m## #\n");
printf("## ⣿⣿⣿⣿⣿⠟⠋⠄⠄⠄⠄⠄⠄⠄⢁⠈⢻⢿⣿⣿⣿⣿⣿⣿⣿ #\n");
printf("## ⣿⣿⣿⣿⣿⠃⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠈⡀⠭⢿⣿⣿⣿⣿ # \n");
printf("## ⣿⣿⣿⣿⡟⠄⢀⣾⣿⣿⣿⣷⣶⣿⣷⣶⣶⡆⠄⠄⠄⣿⣿⣿⣿ #\n");
printf("## ⣿⣿⣿⣿⡇⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠄⠄⢸⣿⣿⣿⣿ # \n");
printf("## ⣿⣿⣿⣿⣇⣼⣿⣿⠿⠶⠙⣿⡟⠡⣴⣿⣽⣿⣧⠄⢸⣿⣿⣿⣿ # \n");
printf("## ⣿⣿⣿⣿⣿⣾⣿⣿⣟⣭⣾⣿⣷⣶⣶⣴⣶⣿⣿⢄⣿⣿⣿⣿⣿ # \n");
printf("## ⣿⣿⣿⣿⣿⣿⣿⣿⡟⣩⣿⣿⣿⡏⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ #\n");
printf("## ⣿⣿⣿⣿⣿⣿⣹⡋⠘⠷⣦⣀⣠⡶⠁⠈⠁⠄⣿⣿⣿⣿⣿⣿⣿ # \n");
printf("## ⣿⣿⣿⣿⣿⣿⣍⠃⣴⣶⡔⠒⠄⣠⢀⠄⠄⠄⡨⣿⣿⣿⣿⣿⣿ # \n");
printf("## ⣿⣿⣿⣿⣿⣿⣿⣦⡘⠿⣷⣿⠿⠟⠃⠄⠄⣠⡇⠈⠻⣿⣿⣿⣿ #\n");
printf("## ⣿⣿⣿⣿⡿⠟⠋⢁⣷⣠⠄⠄⠄⠄⣀⣠⣾⡟⠄⠄⠄⠄⠉⠙⠻ # \n");
printf("## ⡿⠟⠋⠁⠄⠄⠄⢸⣿⣿⡯⢓⣴⣾⣿⣿⡟⠄⠄⠄⠄⠄⠄⠄⠄ #\n");
printf("## ⠄⠄⠄⠄⠄⠄⠄⣿⡟⣷⠄⠹⣿⣿⣿⡿⠁⠄⠄⠄⠄⠄⠄⠄⠄ #\n");
printf("##\033[33m\033[37m #\n");
printf("## 欢迎使用学生管理系统 # \n");
printf("## 再次欢迎使用学生管理系统 # \n");
printf("## # \n");
printf("## [1]管理员登录 #\n");
printf("## #\n");
printf("## [2]学生信息 # \n");
printf("## #\n");
printf("## [0]退出 # \n");
printf("## #\n");
printf("\033[0;46m**************************************************************\033[0m\n");
printf("\033[0;46m**************************************************************\033[0m\n");
printf("\033[33m\033[37m请输入你的选择:\n");
printf(">>>>>>");
}
/*管理管理员界面*/
void adm()
{
printf("\033[33m\033[32m*****************************************************************\n");
printf("*****************************************************************\n");
printf("* ========管理员界面======== *\n");
printf("* *\n");
printf("*\033[33m\033[37m [1]添加学生信息 [2]查找学生信息 *\n");
printf("* *\n");
printf("* [3]修改学生信息 [4]删除学生信息 *\n");
printf("* *\n");
printf("* [5]打印所有学生信息 [6]排序选项 *\n");
printf("* *\n ");
printf(" [7]修改管理员密码 [0]退出 \n");
printf("\033[33m\033[32m*****************************************************************\n");
printf("*****************************************************************\n");
printf("\033[33m\033[37m请输入你的选择:\n");
printf(">>>>>>");
}
/*学生界面*/
void StuDesk()
{
printf("\033[33m\033[33m*************************************************************\n");
printf("*************************************************************\n");
printf("* ==学生界面== *\n");
printf("* =========好好学习,天天向上============ *\n");
printf("* *\n");
printf("*\033[33m\033[37m [1]查看自己信息 *\n");
printf("* *\n");
printf("* [2]查看自己C语言排行耪 *\n");
printf("* *\n");
printf("* *\n");
printf("* [0]退出 *\n");
printf("* *\n");
printf("\033[33m\033[33m*************************************************************\n");
printf("*************************************************************\n");
printf("\033[33m\033[37m请输入你的选择:\n");
printf(">>>>");
}
ui.h文件
#ifndef _UI_H__
#define _UI_H__
#include <stdio.h>
#include <time.h>
/*主界面*/
void hshshs();
/*管理管理员界面*/
void adm();
/*学生界面*/
void StuDesk();
#endif
到这里所有的源码都已经开放出来了,如果理不清楚每个文件是干嘛的,请到主函数文件开头中查看,相信聪明的你一定能看懂!!具体项目效果各位亲自动手演示噢,截图的话太多了,快动手敲代码吧😁