语言学生学籍管理系统流程图_基于C语言的学生管理系统(含文件)(一)
"点击上方“蓝色字”,关注我们哦(*^▽^*)!"
NO.1
篇幅较长,请空闲时观看
前言
这个项目是大一暑假完成,纯C语言编写,界面比较美观,由于当时还是一个初学者,有什么问题希望大家可以批评指正。(源码会在第二篇文章末尾给出)
这个项目有些瑕疵,但基本功能都已实现,在此分享一下我的思路。
全部内容我会分为两部分:第一部分主要写每个功能界面以及它们之间的逻辑关系。第二部分主要写单链表和文件读写的实现。正文
先看看作品效果
流程图如下
首先是一个菜单选择界面,其中包括登录,找回密码和退出系统。
源码如下
//主界面void menu(){ printf("\t\t\t----------------------------------------\n"); printf("\t\t\t|\t欢迎来到三千学生管理系统\t|\n"); printf("\t\t\t----------------------------------------\n"); printf("\t\t\t|\t1.登陆\t\t\t\t|\n"); printf("\t\t\t|\t2.找回密码\t\t\t|\n"); printf("\t\t\t|\t3.退出系统\t\t\t|\n"); printf("\t\t\t----------------------------------------\n"); printf("\t\t\t请选择功能(1-3)(按回车键确认):");
//获取选择 int choice = 0; scanf("%d",&choice);
//清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)//判断选择 { case 1: { system("cls");//刷新界面 login();//调用login()函数进行登录 break; } case 2: { system("cls"); rebackPassword();//调用rebackPassword()函数找回密码 break; } case 3: { printf("\n\t\t\t"); exit(0);//退出系统 } default: { //当输入不是指定选项时 printf("\n\t\t\t输入错误!请重新输入!\n\t\t\t"); system("pause");//暂停程序 system("cls");//刷新界面
menu();//重新调用本函数 break; } }}
选择其中一项都会跳转到其他界面。本文只写登录和登录成功后。登录失败以及找回密码都有对应措施,在文中不再介绍。
进入登录界面后,输入密码:123,即可登录成功。
源码如下
//登录界面void login(){ int i = 0; char Password[]="123";//登录密码 char tempPass[10]="0";//从输入端获取的密码
printf("\t\t\t---------------登陆系统---------------\n\n"); printf("\t\t\t\t管理员账号:三千\n"); for(i=1;i<=3;i++) { printf("\t\t\t\t管理员密码:"); //获取你所输入的密码 scanf("%s",tempPass);
//清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
//判断登录密码和获取的密码是否相同 //strcmp()用于字符串比较,两字符串相同时返回0 if(!strcmp(Password,tempPass)) { printf("\n\t\t\t\t登陆成功!"); printf("\n\t\t\t\t"); system("pause");//程序暂停 system("cls");//刷新界面 function();//调用fuction()函数进入功能界面 }else { //密码错误达到三次 if(3 == i) { printf("\n\t\t\t\t密码输入错误3次!请重新选择!\n\n"); printf("\t\t\t\t"); system("pause"); }else { printf("\n\t\t\t\t密码输入错误%d次!请重新输入!\n",i); } } } if(4 == i) { system("cls"); //登录密码失败后进入登录分界面 login_Second();/ }}
//登录分界面,解决密码输入错误超过三次后void login_Second(){ printf("\t\t\t-------------------------------------\n"); printf("\t\t\t|\t 1.找回密码\t\t |\n"); printf("\t\t\t|\t 2.重新登录\t\t |\n"); printf("\t\t\t|\t 3.退出系统\t\t |\n"); printf("\t\t\t-------------------------------------\n"); printf("\t\t\t\t 请选择(1-3):");
//获取选择 int choice = 0; scanf("%d",&choice);
//清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF); switch(choice) { case 1: { system("cls");//刷新界面 rebackPassword();//调用rebackPassword()函数找回密码 break; } case 2: { system("cls"); login();//调用login()函数进行登录 break; } case 3: { printf("\n\t\t\t\t"); exit(0);//退出系统 } default: { printf("\n\t\t\t\t输入错误!请重新输入!\n\t\t\t\t"); system("pause");//暂停程序 system("cls");//刷新界面
login_Second();//重新调用本函数 break; } }}
登录成功后进入功能选择界面。
其中包括八个功能:增,删,改,查,统计,排序,返回,退出。
源码如下
//功能界面void function(){ printf("\t\t\t-----------------------------------------\n"); printf("\t\t\t|\t欢迎使用三千学生管理系统\t|\n"); printf("\t\t\t-----------------------------------------\n"); printf("\t\t\t|\t1.添加学生信息\t\t\t|\n"); printf("\t\t\t|\t2.统计学生信息\t\t\t|\n"); printf("\t\t\t|\t3.查找学生信息\t\t\t|\n"); printf("\t\t\t|\t4.修改学生信息\t\t\t|\n"); printf("\t\t\t|\t5.删除学生信息\t\t\t|\n"); printf("\t\t\t|\t6.排序学生信息\t\t\t|\n"); printf("\t\t\t|\t7.返回上一级\t\t\t|\n"); printf("\t\t\t|\t8.退出程序\t\t\t|\n"); printf("\t\t\t-----------------------------------------\n"); printf("\t\t\t请选择功能(1-8):");
//存储临时数据 struct student tempData={"0","0","0",0,0.0,0.0,0.0};
//获取选择 int choice = 0; scanf("%d",&choice); //清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice) { case 1: { //调用addStudent()函数添加学生信息 addStudent(tempData); printf("\n\t\t\t\t"); system("pause");//暂停程序 system("cls");//刷新界面 break; } case 2: { printf("\n\t\t\t--------------统计学生信息--------------\n"); //调用printList()函数打印所有学生信息 printList(List); printf("\n\t\t\t\t"); system("pause"); system("cls"); break; } case 3: { //调用searchStudent()函数查找学生信息 searchStudent(tempData); printf("\n\t\t\t\t"); system("pause"); system("cls"); break; } case 4: { //调用modifyStudent()函数修改学生信息 modifyStudent(tempData); printf("\n\t\t\t\t"); system("pause"); system("cls"); break; } case 5: { //调用deleteStudent()函数删除学生信息 deleteStudent(tempData); printf("\n\t\t\t\t"); system("pause"); system("cls"); break; } case 6: { //调用sortStudent()函数排序学生信息 sortStudent(); printf("\n\t\t\t\t"); system("pause"); system("cls"); break; } case 7: { system("cls"); menu();//返回主界面 break; } case 8: { printf("\n\t\t\t\t"); exit(0);//退出系统 } default: { printf("\n\t\t\t\t输入错误!请重新输入!\n"); printf("\n\t\t\t\t"); system("pause");//暂停程序 system("cls");//刷新界面 break; } } function();//重新调用本函数}
每一个功能的实现背后都有链表和文件在运行工作。(我将链表和文件读写的实现专门写在另一个.h文件中,在第二篇文章中将会写到。)
接下来开始一一讲解程序的功能(功能效果图不再展示)
功能一:添加学生信息
调用addStudent()函数将学生信息添加到链表中,并最终存储在文件中。
//添加学生信息void addStudent(struct student tempData){ printf("\n\t\t\t--------------添加学生信息--------------\n"); printf("\t\t\t\t学号:"); scanf("%s",tempData.id);//获取学生学号 char ch; while((ch = getchar()) != '\n' && ch != EOF);//清除缓冲区
printf("\t\t\t\t姓名:"); scanf("%s",tempData.name);//获取学生姓名 while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t性别:"); scanf("%s",tempData.gender);//获取学生性别 while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t年龄:"); scanf("%d",&tempData.age);//获取学生年龄 while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t数学:"); scanf("%f",&tempData.math);//获取学生数学成绩 while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t英语成绩:"); scanf("%f",&tempData.english);//获取学生英语成绩 while((ch = getchar()) != '\n' && ch != EOF);
tempData.sumscore=tempData.math+tempData.english;//计算学生总成绩 printf("\t\t\t\t总成绩为:%.1f\n",tempData.sumscore);//打印学生总成绩
insertnode(List,tempData);//向链表中插入学生信息 saveToFile("student.txt",List);//将链表中的学生信息保存到文件student.txt printf("\n\t\t\t\t添加成功!\n");}
功能二:统计学生信息
调用printList()函数将链表中的全部学生信息打印到界面上。
...case 2:{ printf("\n\t\t\t--------------统计学生信息--------------\n"); //调用printList()函数打印所有学生信息 printList(List); printf("\n\t\t\t\t"); system("pause"); system("cls"); break;}...//打印学生信息,打印函数,位于另一个.h文件中void printList(struct Node *StudentListhead){ struct Node *pmove=StudentListhead->next;
//按格式打印 printf("\t学号\t\t姓名\t性别\t年龄\t高数成绩\t英语成绩\t成绩总和\n");
while(pmove)//pmove为NULL时,退出循环 { //格式化输出打印 printf("\t%-10s\t%-4s\t%-6s\t%-3d\t%.1f\t\t%.1f\t\t%.1f\n",pmove->data.id,pmove->data.name,pmove->data.gender,pmove->data.age,pmove->data.math,pmove->data.english,pmove->data.sumscore);
//pmove指向下一个结点,以此遍历链表 pmove=pmove->next; } printf("\n");}
功能三:查找学生信息
方式:1.按学号查找
2.按姓名查找(缺陷:若有重名者,只能查找其中一个)
输入要查找学生的学号或姓名,与链表中的学生信息进行对比。若存在,则打印该学生信息;反之则打印“查无此人!”
//查找学生信息void searchStudent(struct student tempData){ printf("\n\t\t\t---------------查找学生信息--------------\n\n"); printf("\t\t\t\t1.按学号查找\t\t\t\t\n"); printf("\t\t\t\t2.按姓名查找\t\t\t\t\n"); printf("\t\t\t\t请选择功能:");
//获取选择 int choice = 0; scanf("%d",&choice); //清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice) { case 1: { printf("\n\t\t\t请输入要查找的学生的学号:"); scanf("%s",tempData.id);//获取学生学号 while((ch= getchar()) != '\n' && ch != EOF);//清除缓冲区
//searchnode_byid()返回值为结点指针或NULL //返回NULL,说明未查到 if(searchnode_byid(List,tempData.id) == NULL) { //若链表中不存在该学号 printf("\n\t\t\t\t查无此人!\n"); } else { //打印查找的学生信息 printsearch(searchnode_byid(List,tempData.id)); } break; } case 2: { printf("\n\t\t\t请输入要查找的学生的姓名:"); scanf("%s",tempData.name);//获取学生姓名 while((ch = getchar()) != '\n' && ch != EOF);//清除缓冲区
//searchnode_byname()返回值为结点指针或NULL //返回NULL,说明未查到 if(searchnode_byname(List,tempData.name) == NULL) { //若链表中不存在该姓名 printf("\n\t\t\t\t查无此人!\n"); }else { //打印查找的学生信息 printsearch(searchnode_byname(List,tempData.name)); } break; } default: { printf("\n\t\t\t\t输入错误!请重新输入!\n"); break; } }}
功能四:修改学生信息
方式:1.按学号查找修改
2.按姓名查找修改(缺陷:若有重名者,只能查找其中一个)
调用modifyStudent()函数将在链表中查找到学生信息进行修改,再重新保存到文件中。
//修改学生信息void modifyStudent(struct student tempData){ printf("\n\t\t\t--------修改学生信息--------\t\t\t\t\n"); //先调用printList()函数打印全部学生信息 printList(List); printf("\t\t\t\t1.按学号修改\t\t\t\t\n"); printf("\t\t\t\t2.按姓名修改\t\t\t\t\n"); printf("\t\t\t\t请选择功能:");
//获取选择 int choice = 0; scanf("%d",&choice); //清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice) { case 1: { printf("\n\t\t\t请输入要修改的学生的学号:");
scanf("%s",tempData.id);//获取学生的学号 while((ch = getchar()) != '\n' && ch != EOF);
if(searchnode_byid(List,tempData.id) == NULL) { //若链表中不存在该学号 printf("\n\t\t\t\t查无此人!\n"); }else { //修改学生信息的分函数 modifyStudent_Second(tempData); } break; } case 2: { printf("\n\t\t\t\t请输入要修改的学生的姓名:"); scanf("%s",tempData.name);//获取学生姓名 while((ch = getchar()) != '\n' && ch != EOF);
if(searchnode_byname(List,tempData.name)==NULL) { //若链表中不存在该姓名 printf("\n\t\t\t\t查无此人!\n"); }else { modifyStudent_Second(tempData); } break; } default: { printf("\t\t\t\t输入错误!请重新输入!\n"); function();//进入功能界面 break; } }}void modifyStudent_Second(struct student tempData){ //重新定义一个指针并指向要修改的学生的信息的结点 struct Node *curnode=searchnode_byid(List,tempData.id); //调用printsearch()函数打印要修改学生的信息 printsearch(searchnode_byid(List,tempData.id));
printf("\n"); printf("\t\t\t\t1.学号\t\t\t\t\n"); printf("\t\t\t\t2.姓名\t\t\t\t\n"); printf("\t\t\t\t3.性别\t\t\t\t\n"); printf("\t\t\t\t4.年龄\t\t\t\t\n"); printf("\t\t\t\t5.高数成绩\t\t\t\t\n"); printf("\t\t\t\t6.英语成绩\t\t\t\t\n"); printf("\t\t\t\t请选择要修改的内容:");
//获取选择 int choice = 0; scanf("%d",&choice); //清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice) { case 1: { printf("\n\t\t\t\t修改前的学号:%s\n",curnode->data.id); printf("\t\t\t\t请输入修改后的学号:");
scanf("%s",curnode->data.id); while((ch = getchar()) != '\n' && ch != EOF);
//将修改后的信息保存到文件 saveToFile("student.txt",List); printf("\n\t\t\t\t修改成功!\n"); break; } case 2: { printf("\n\t\t\t\t修改前的姓名:%s\n",curnode->data.name); printf("\t\t\t\t请输入修改后的姓名:");
scanf("%s",curnode->data.name); while((ch = getchar()) != '\n' && ch != EOF);
saveToFile("student.txt",List); printf("\n\t\t\t\t修改成功!\n"); break; } case 3: { printf("\n\t\t\t\t修改前的性别:%s\n",curnode->data.gender); printf("\t\t\t\t请输入修改后的性别:");
scanf("%s",curnode->data.gender); while((ch= getchar()) != '\n' && ch != EOF);
saveToFile("student.txt",List); printf("\n\t\t\t\t修改成功!\n"); break; } case 4: { printf("\n\t\t\t\t修改前的年龄:%d\n",curnode->data.age); printf("\t\t\t\t请输入修改后的年龄:");
scanf("%d",&curnode->data.age); while((ch = getchar()) != '\n' && ch != EOF);
saveToFile("student.txt",List); printf("\n\t\t\t\t修改成功!\n"); break; } case 5: { printf("\n\t\t\t\t修改前的高数成绩:%.1f\n",curnode->data.math); printf("\t\t\t\t请输入修改后的高数成绩:");
scanf("%f",&curnode->data.math); while((ch = getchar()) != '\n' && ch != EOF); //计算总成绩 curnode->data.sumscore=curnode->data.math+curnode->data.english;
saveToFile("student.txt",List); printf("\n\t\t\t\t修改成功!\n"); break; } case 6: { printf("\n\t\t\t\t修改前的英语成绩:%.1f\n",curnode->data.english); printf("\t\t\t\t请输入修改后的英语成绩:");
scanf("%f",&curnode->data.english); while((ch = getchar()) != '\n' && ch != EOF);
curnode->data.sumscore=curnode->data.math+curnode->data.english;
saveToFile("student.txt",List); printf("\n\t\t\t\t修改成功!\n"); break; } default: { printf("\n\t\t\t\t输入错误!请重新输入!\n"); break; } }}
功能五:删除学生信息
方式:1.按学号查找删除
2.按姓名查找删除(缺陷:若有重名者,只能查找其中一个)
调用deleteStudent()函数将在链表中查找到的学生信息进行删除,再重新保存到文件。
//删除学生信息void deleteStudent(struct student tempData){ printf("\n\t\t\t--------------删除学生信息---------------\n"); //调用printList()函数打印全部学生信息 printList(List); printf("\t\t\t\t1.按学号删除\t\t\t\t\n"); printf("\t\t\t\t2.按姓名删除\t\t\t\t\n"); printf("\t\t\t\t请选择功能:");
//获取选择 int choice = 0; scanf("%d",&choice); //清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice) { case 1: { printf("\n\t\t\t请输入要删除的学生的学号:");
scanf("%s",tempData.id); while((ch = getchar()) != '\n' && ch != EOF);
//从链表中删除学生信息 Deletenode_byid(List,tempData.id); //将剩余信息保存到文件 saveToFile("student.txt",List); break; } case 2: { printf("\n\t\t\t请输入要删除的学生的姓名:");
scanf("%s",tempData.name); while((ch = getchar()) != '\n' && ch != EOF);
Deletenode_byname(List,tempData.name); saveToFile("student.txt",List); break; } default: { printf("\n\t\t\t\t输入错误!请重新输入!\n"); break; } }}
功能六:排序学生信息
方式:1.根据学号排序(从低到高)
2.根据数学成绩排序(从高到低)
3.根据英语成绩排序(从高到低)
4.根据总成绩排序(从高到低)
调用sortStudent()函数按照所选项将链表中的学生信息排序,并打印到界面上。
//排序void sortStudent(){ printf("\n\t\t\t---------------排序学生信息--------------\n"); printf("\t\t\t\t1.根据学号排序(从低到高)\n"); printf("\t\t\t\t2.根据数学成绩排序(从高到低)\n"); printf("\t\t\t\t3.根据英语成绩排序(从高到低)\n"); printf("\t\t\t\t4.根据总成绩排序(从高到低)\n"); printf("\t\t\t\t请选择功能(1-4):");
//获取选择 int choice = 0; scanf("%d",&choice); //清除缓冲区 char ch; while((ch = getchar()) != '\n' && ch != EOF);
switch(choice) { case 1: { //按学号从低到高排序链表 sortList_byid(List); //将排序后的信息保存到文件 saveToFile("student.txt",List); //打印链表中的信息 printList(List); break; } case 2: { //按数学成绩从高到低排序链表 sortList_bymath(List); printList(List); break; } case 3: { //按英语成绩从高到低排序链表 sortList_byenglish(List); printList(List); break; } case 4: { //按总成绩从高到低排序链表 sortList_bysumscore(List); printList(List); break; } default: { printf("\n\t\t\t\t输入错误!请重新输入!\n"); break; } }}
功能七:返回上一级
调用menu()函数返回主界面
void function(){ ... case 7: { system("cls"); menu();//返回主界面 break; } ...}
功能八:退出程序
void function(){ ... case 8: { printf("\n\t\t\t\t"); exit(0);//退出系统 } ...}
最后main()函数
//主函数int main(){ //设置控制台标题,颜色,尺寸 system("title 学生信息管理系统"); system("color F0"); system("mode con cols=90 lines=30");
//创造一个链表,存储学生信息 List=creatList();
//读取student.txt文件信息到链表中 //student.txt用于存放链表中的学生信息 readFromFile("student.txt",List); //进入主界面 menu();
return 0;}
以上便是程序的界面部分,相对不难,但仍有些不足,希望对你有所帮助。
作者:瑾年辰良一位热爱生活的快乐青年
"即见君子,云胡不喜?"
语言学生学籍管理系统流程图_基于C语言的学生管理系统(含文件)(一)相关推荐
- java快递驿站管理系统免费_基于jsp的快递物流管理系统-JavaEE实现快递物流管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的快递物流管理系统, 该项目可用各类java课程设计大作业中, 快递物流管理系统的系统架构分为前后台两部分, 最终实 ...
- java酒店入住管理系统代码_基于jsp的酒店入住管理系统-JavaEE实现酒店入住管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的酒店入住管理系统, 该项目可用各类java课程设计大作业中, 酒店入住管理系统的系统架构分为前后台两部分, 最终实 ...
- c语言双重for循环流程图_使用C语言编写程序对数据进行排序
使用C语言编写程序对数据进行排序 C语言是一种强大的编程软件,使用十分广泛,用户众多,也是学习其他语言的基础.我作为一个C语言忠实粉丝,以一些常见的C程序来剖析C语言的格式和结构,希望能够为广大初学者 ...
- 基于python管理系统论文_基于Python语言的实验室管理系统的设计与实现
论文目录 摘要第1-5页 Abstract第5-9页 第1章 绪论第9-13页 1.1 研究背景及意义第9-10页 1.2 国内外研究现状第10-11页 1.2.1 LIMS技术研究现状第10-11页 ...
- java一卡通管理系统实现_基于jsp的校园一卡通管理系统
[实例简介] 校园一卡通管理系统,适合做大作业,课程设计或毕业设计 [实例截图] [核心代码] JSP校园一卡通管理系统. └── studentweb ├── WebRoot │ ├── CSS ...
- c语言双重for循环流程图_【C语言学习笔记系列】C语言编程狼追兔子问题代码解析!...
问题描述 一只兔子躲进了10个环形分布的洞中的一个.狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找:也没有找到,就隔2个洞,到第6个洞去找:以后每次多一个洞去找兔子--这样下去,如果一直找不到 ...
- c语言编写订货系统,学位论文_基于c语言的仓库订货系统的仿真.doc
学位论文_基于c语言的仓库订货系统的仿真 本科毕业论文(设计.创作) 题目: 基于C语言的仓库订货系统的仿真 学生姓名: 学号: 所在系院: 信息与通信技术系 专业: 电子信息工程 入学时间: 201 ...
- 用java写的教职工信息管理系统_基于Java的教师信息管理系统的设计与实现论文.doc...
基于Java的教师信息管理系统的设计与实现论文 职场大变样社区():下载毕业设计成品 全套资料,全部50元以下 毕业设计(论文)任务书 第1页 毕业设计(论文)题目: 基于java的教师信息管理系统的 ...
- java员工请假系统_基于jsp的员工请假管理系统-JavaEE实现员工请假管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的员工请假管理系统, 该项目可用各类java课程设计大作业中, 员工请假管理系统的系统架构分为前后台两部分, 最终实 ...
最新文章
- 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
- 路由器桥接以后怎么找到_2个无线路由器之间怎样做到无缝连接?
- jstack和线程dump分析
- Linux脚本选题背景,shell实例100例《一》
- JZOJ 5639. 【NOI2018模拟4.8】秘密袭击
- 使用Chrome打开http://www.cutv.com/demo/live_test.swf页面时swf文件自动下载问题
- 数据的存储特殊矩阵压缩存储【数据结构F】
- raspberry pi_适用于Linux,Raspberry Pi和开源的游戏:年度热门读物
- 微型计算机技术 论文,微型计算机技术课程设计论文报告微机交通灯控制系统_毕业论文.docx...
- 计算机通过逻辑电路实现运算,计算机组成与体系结构数据表示与运算算法和逻辑电路实现.ppt...
- 《Python机器学习——预测分析核心算法》——2.2 分类问题:用声纳发现未爆炸的水雷...
- C++中char[]转string
- Python基础入门:函数--阿里云天池
- EasyExcel注解方式校验数据行
- c++ 将行列式化为上三角行列式,并求值。
- pitch yaw roll 最直观的解释
- 用科技演绎让“非遗”焕发新生命——由《云裳中国》纪录片想到的
- 基于QT的商场线上购物管理系统之客户端
- 抖音企业号获客系统技术操作手册
- DateUtils 工具类:获取指定月份第一天时间,最后一天时间