今天课设答辩结束了,可以说是很圆满的成功了,我用了3天时间在我们班第一个完成答辩。
做的是简单的学生上机系统,在此之前,我从来不敢想象我可以做到,并完成得那么好。
记得刚拿到题目时就懵了,一时不知该怎么办。但是后来沉下心去,系统功能一个一个地实现,写完一部分就编译一次
第一天就实现了信息录入和保存功能,后面的越来越顺利,遇到的逻辑问题也一个一个的慢慢解决了。
最后终于完成了270多行的代码。
就连我自己都不相信我能独立完成,看到别人的课设都是借其他人或是上届学生的课设,我可以大声地说:“我的课设完全是自己写的。”
这次课设让我更加深刻的了解链表和熟悉了关于时间函数的操作,更大的收获是我明白了一个道理,写程序是不能急的,一步步来,一步步编译,一步步找错
一步步的解决逻辑问题,很快就能完成。
以下是代码,我想这值得我自己收藏。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#define NAME_LEN 50
#define NUMBER_LEN 15
struct Student
{
char number[NUMBER_LEN]; //学号
char name[NAME_LEN]; //姓名
char department[20]; //院系
int time_left; //剩余机时,以分钟为单位
struct Student* pNext; //指向下一个结构
time_t machine_time; //记录学生的上机时间
int type; //记录学生的上机类型(1为课内上机,2为自由上机)
int machine_number; //记录学生的上机号
};
struct Student* first=NULL;
struct Student* Get_Student();
struct Student* enter(); //录入学生信息
void save(); //保存学生信息
struct Student* on_machine(struct Student*); //上机签到
void exit(struct Student*first,struct Student *current);//下机处理
void teacher_menu();
void student_menu();
void main()
{
int choice=0;
int count=0;
struct Student* current=NULL;
//老师的操作
for(;;)
{
teacher_menu();
printf("请输入你要执行的操作: ");
scanf(" %d",&choice);
if((choice==2)&&(count!=0)) //第一次选择保存操作视为非法输入
{
save();
break;
}
else if(choice==1)
{
first=enter();
count++;
}
else
printf("非法输入!\n");
}
fflush(stdin);
//学生的操作
student_menu();
for(;;)
{
printf("请输入你要执行的操作: ");
scanf(" %d",&choice);
if(choice==2)
{
printf("你没有上机!\n");
}
else if(choice==1)
{
current=on_machine(first);
break;
}
else
{
printf("非法输入!\n");
}
}
fflush(stdin);
for(;;)
{
printf("请输入你要执行的操作: ");
scanf(" %d",&choice);
if(choice==1)
{
printf("你已经上过机了!\n");
}
else if(choice==2)
{
exit(first,current);
break;
}
else
{
printf("非法输入!");
}
}
}
struct Student* Get_Student()
{
struct Student *pStudent;
//为结构体声明内存
pStudent=(struct Student*)malloc(sizeof(struct Student));
printf("-------学号-------姓名----系别--剩余机时----\n");
scanf("%s%s%s%d",pStudent->number,pStudent->name,pStudent->department,&pStudent->time_left);
fflush(stdin);
pStudent->machine_time=0; //对未输入项进行初始化
pStudent->type=0;
pStudent->machine_number=0;
pStudent->pNext=NULL;
return pStudent;
}
struct Student *enter()
{
struct Student *first=NULL; //指向第一个学生的指针
struct Student *current=NULL; //指向当前学生的指针
struct Student *last=NULL; //指向前一个学生的指针
struct Student *pcurrent=NULL; //检验学号是否相同时用到
char more='\0';
do
{
current=Get_Student();
if(NULL==first) //第一次录入信息时
{
first=current; //指向第一个学生
last=current;
}
else
{
pcurrent=first;
while(pcurrent!=NULL)
{
if(strcmp(pcurrent->number,current->number)==0)
{
printf("你输入了同样的学号!\n");
exit(0);
}
pcurrent=pcurrent->pNext;
}
last->pNext=current; //问题是如何保证学号唯一?
last=current;
}
printf("你想再录入另一个学生的信息吗?(y or n) ");
scanf(" %c",&more);
fflush(stdin);
}while(tolower(more)=='y');
return first;
}
void save() //保存函数还存在问题
{
struct Student *current=first;
FILE *pfile=NULL;
int i=0;
if((pfile=fopen("student.txt","wt"))==NULL)
{
printf("无法打开文件student.txt,程序终止!");
exit(1);
}
printf("\nSaving file\n");
while(current!=NULL)
{
fprintf(pfile,"%-20s%-20s%-20s%-8d\n",current->number,current->name,current->department,
current->time_left);
current=current->pNext;
}
fclose(pfile);
printf("*****************save sucess****************\n");
}
struct Student *on_machine(struct Student * first)
{
char number[NUMBER_LEN];
char name[NAME_LEN];
struct Student *current=NULL;
printf("********************欢迎来到机房**********************\n");
printf("请输入你的学号: ");
scanf(" %s",number);
fflush(stdin);
printf("请输入你的姓名: ");
scanf(" %s",name);
fflush(stdin);
current=first;
while(current!=NULL)
{
if(strcmp(number,current->number)==0)
{
break;
}
current=current->pNext;
}
if(current==NULL)
{
printf("没有你的学号,很抱歉你不能上机!\n");
exit(0);
}
else
{
if(strcmp(name,current->name)==0)
{
printf("请输入你的上机类型:(1是课内上机,2是自由上机) ");
scanf("%d",¤t->type);
current->machine_time=time(NULL);
printf("上机时间:%s\n",ctime(¤t->machine_time));
printf("上机类别:%s\n",(current->type==1)?"课内上机":"自由上机");
srand((int)current->machine_time); //初始化随机序列
current->machine_number=rand()%300+1; //随机生成1~300的机器号
printf("上机号码:%d\n",current->machine_number);
printf("剩余机时:%d分钟\n",current->time_left);
return current;
}
else
{
printf("你输入的学号与姓名不符,很抱歉你不能上机!\n");
exit(0);
}
}
}
void exit(struct Student *first,struct Student *current)
{
char answer='\0';
struct Student *pStudent=NULL;
struct Student *plast=NULL;
printf("你确定要下机(y or n)? ");
scanf(" %c",&answer);
if(tolower(answer)=='y')
{
if(current->type==1)
{
current->type=0;
current->machine_time=0;
printf("您还有%d分钟剩余机时\n",current->time_left);
while(pStudent!=NULL) //释放内存
{
plast=pStudent;
pStudent=pStudent->pNext;
free(plast);
}
}
else
{
current->time_left-=(int)difftime(time(NULL),current->machine_time)/60;
current->type=0;
current->machine_time=0;
printf("您还有%d分钟剩余机时\n",current->time_left);
while(pStudent!=NULL) //释放内存
{
plast=pStudent;
pStudent=pStudent->pNext;
free(plast);
}
}
}
}
void teacher_menu()
{
printf("*************************************************\n");
printf("* 1、录入学生信息 *\n");
printf("* 2、保存学生信息 *\n");
printf("*************************************************\n");
}
void student_menu()
{
printf("*************************************************\n");
printf("* 1、上机签到 *\n");
printf("* 2、下机 *\n");
printf("*************************************************\n");
}