今天课设答辩结束了,可以说是很圆满的成功了,我用了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"); }