求助!我这个链表做的机房收费管理系统运行有错,请帮忙看一下,谢谢。
刚学的,不太会,请大家指正一下。运行上机这部分时,突然终止,弹出对话框提示已停止工作。
程序代码:
#define NULL 0 #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #include<malloc.h> typedef struct time //时间 { int hour; int minute; int second; }time; struct Student //学生信息 { char num[20]; //学号 char banji[20]; //班级 int flag; //用来标记学生是否上机 char name[20]; //姓名 struct time start,finish; //上机起止时间 }; typedef struct Node { struct Student st; struct Node *pNext; }NODE,*PNODE; Student st[30]; //信息库 struct computer //机器信息 { int f; //用来标记机器是否使用 Student stut; //使用这台机器的学生 }com[30]; //30台机器 int k; //全局变量 int mainmenu() //主菜单 { char c; do { system("cls"); //清屏 printf("\t\t\t****机房收费管理系统****\n"); printf("\t\t\t1.输入学生信息\n"); printf("\t\t\t2.上机\n"); printf("\t\t\t3.下机\n"); printf("\t\t\t4.查询上机时间\n"); printf("\t\t\t5.机器使用情况显示\n"); printf("\t\t\t0.退出系统\n"); printf("\t\t\t************************\n"); printf("\t\t\t请选择菜单(0-5):"); c=getchar(); }while(c<'0'||c>'5'); //判断输入是否合法 return(c-'0'); } /*void save() //建立保存文件函数(见书346) { FILE *fp; //定义文件型指针 int i; if((fp=fopen("Student.txt","wb"))==NULL) //打开输出文件 { printf("不能打开文件!\n"); return; //终止程序 } for(i=0;i<k;i++) //向student文件中写入信息 if(fwrite(&st,sizeof(struct Student),1,fp)!=1) //地址,要读写的字节数,要读写的数据项,FILE类型指针 printf("文件写入错误\n"); fclose(fp); //关闭文件 printf("\n\n\n\n\t\t\t学生信息保存成功!\n"); printf("\n\n\n\n\t\t\t按任意键返回菜单!!"); }*/ void InputStudent(PNODE p) //输入学生信息 { int i=0,len; PNODE pNew; // NODE stu; //学生结构 char sign='0'; PNODE pHead=(PNODE)malloc(sizeof(NODE)); PNODE pTail=pHead; //定义一个指向头指针结点的指针 pTail->pNext =NULL; printf("请输入学生人数"); scanf("%d",&len); for(i=0;i<len;i++) { //getchar(); //保持界面 printf("\t\t学号:"); scanf("%s",&pTail->st.num); printf("\t\t班级:"); scanf("%s",&pTail->st.banji); printf("\t\t姓名:"); scanf("%s",&pTail->st.name); pNew==(PNODE)malloc(sizeof(NODE)); //pNew->st=stu.st; //初始化结点的数据域 pTail->pNext=pNew; pNew->pNext=NULL; pTail=pNew; /*scanf("%c",&sign); {if(sign='N')break;} //判断是否继续输入学生信息 stu.st.flag=0; //初始化为未上机 i++;*/ } } void online(PNODE p) //上机 { char num[20],name[20]; int s; do { printf("\t\t使用姓名按1,使用学号按2:"); scanf("%d",&s); }while(s!=1&&s!=2); getchar(); if(s==1) { printf("\t\t请输入姓名:"); gets(name); while(p!=NULL) //查找信息库中是否有该学生 { if(strcmp(p->st.name,name)==0) break; else p=p->pNext ; } if(p->st.flag==1) { printf("\t\t该生正在上机!\n"); } else { printf("\t\t请输入上机时间(当前时间):"); scanf("%d:%d:%d",&p->st.start.hour,&p->st.start.minute,&p->st.start.second); p->st.flag=1; } } else { printf("\t\t请输入学号:"); gets(num); while(p!=NULL) //查找信息库中是否有该学生 { if(strcmp(p->st.name,name)==0) break; else p=p->pNext ; } if(p->st.flag==1) { printf("\t\t该生正在上机!\n"); } else { printf("\t\t请输入上机时间(当前时间):"); scanf("%d:%d:%d",&p->st.start.hour,&p->st.start.minute,&p->st.start.second); p->st.flag=1; } } /*if(p->st.flag==1) { printf("\t\t该生正在上机!\n"); return; } else { //for(k=0;k<30;k++) if(com[k].f==0) { com[k].f=1; //该台机器标记为使用 printf("\t\t请输入上机时间(当前时间):"); scanf("%d:%d:%d",&p->st.start.hour,&p->st.start.minute,&p->st.start.second); p->st.flag=1; //该生标记为上机 com[k].stut=p->st; //记录使用该台机器的学生信息 break; } if(k==30) printf("\t\t机器全部使用中,请稍后再上机!\n"); }*/ } void calculate(PNODE pHead) //上机时间及费用计算 { int t; NODE stu; PNODE p=pHead->pNext; struct time timet; if(p->st.finish.second<p->st.start.second) { if(p->st.finish.minute==0) { stu.st.finish.hour=stu.st.finish.hour-1; stu.st.finish.minute=59; } else stu.st.finish.minute=stu.st.finish.minute-1; timet.second=stu.st.finish.second+60-stu.st.start.second; } else timet.second=stu.st.finish.second-stu.st.start.second; if(p->st.finish.minute<p->st.start.minute) { stu.st.finish.hour-=1; timet.minute=stu.st.finish.minute+60-stu.st.start.minute; } else timet.minute=stu.st.finish.minute-stu.st.start.minute; timet.hour=stu.st.finish.hour-stu.st.start.hour; if(timet.second==0&&timet.minute==0) t=timet.hour; else t=timet.hour+1; //不满一小时按一小时记 printf("\t\t该生上机用时%d小时,费用为%d元\n",t,t); } void offline(PNODE pHead) //下机 { char num[20],name[20]; int s; PNODE p=pHead->pNext; do { printf("\t\t使用姓名按1,使用学号按2:"); scanf("%d",&s); }while(s!=1&&s!=2); getchar(); if(s==1) { printf("\t\t请输入姓名:"); gets(name); while(NULL!=p) { if(strcmp(p->st.name,name)==0)break; p=p->pNext ; } } else { printf("\t\t请输入学号:"); gets(num); while(NULL!=p) { if(strcmp(p->st.num,num)==0)break; p=p->pNext ; } } if(p->st.flag==0) { printf("\t\t该生未上机或已下机!\n"); return; } else { printf("\t\t请输入下机时间(当前时间):"); scanf("%d:%d:%d",&p->st.finish.hour,&p->st.finish.minute,&p->st.finish.second); calculate (pHead); //计算并输出上机费用 p->st.flag=0; //该生标记为未上机 for(k=0;k<3;k++) //将刚下机学生使用的机器标记为未使用 if(strcmp(com[k].stut.num,p->st.num)==0) { com[k].f=0; //该台机器标记为未使用 break; } } } void search(PNODE p) //上机时间查询 { char num[20],name[20],banji[20]; int s; p=p->pNext; do { printf("\t\t使用姓名按1,使用学号按2,使用班级按3:"); scanf("%d",&s); }while(s!=1&&s!=2&&s!=3); getchar(); if(s==1) { printf("\t\t请输入姓名:"); gets(name); while(NULL!=p) { if(strcmp(p->st.name,name)==0)break; p=p->pNext ; } } if(s==3) { printf("\t\t请输入班级:"); gets(banji); while(NULL!=p) if(strcmp(p->st.banji,banji)==0) printf("\t\t该生正在上机,上机起始时间为%d:%d:%d\n",p->st.start.hour,p->st.start.minute, p->st.start.second); p=p->pNext ; } else { printf("\t\t请输入学号:"); gets(num); while(NULL!=p) { if(strcmp(p->st.num,num)==0)break; p=p->pNext ; } } if(p->st.flag==1) printf("\t\t该生正在上机,上机起始时间为%d:%d:%d\n",p->st.start.hour,p->st.start.minute, p->st.start.second); else printf("\t\t该生未上机或已下机!\n"); } void display() //全部机器使用情况显示 { printf("\t机器号是否使用 使用者学号 班级上机时间\n"); //显示格式,表头 printf("\t----------------------------------------------------------\n"); for(k=0;k<30;k++) { if(com[k].f==0) printf("\t%02d 否--------:--:--\n",k+1); else printf("\t%02d 是%-10s%-10s%2d%02d:%02d:%02d\n",k+1,com[k].stut.name,com[k].stut.num,com[k].stut.banji,com[k].stut.start.hour, com[k].stut.start.minute,com[k].stut.start.second); } printf("\t"); system("pause"); //使刚显示的内容在屏幕上停留一段时间,直到继续操作为止 } int main() //主函数 { int n=0; PNODE h; //定义一个指针 for(k=0;k<30;k++) //全部机器标记为未使用 com[k].f=0; for(;;) { switch(mainmenu()) { case 1: system("cls"); printf("\t\t\t输入学生信息:\n"); InputStudent(h); //save(); break; case 2: system("cls"); printf("\t\t\t学生上机\n"); online(h); printf("\t\t"); system("pause"); break; case 3: system("cls"); printf("\t\t\t学生下机\n"); offline(h); printf("\t\t"); system("pause"); break; case 4: system("cls"); printf("\t\t\t上机时间查询\n"); search(h); printf("\t\t"); system("pause"); break; case 5: system("cls"); printf("\t\t\t机器使用情况显示\n\n"); display(); break; case 6: //save(); break; case0: system("cls"); printf("\n\n\t\t感谢使用机房收费管理系统,欢迎下次使用,再见!\n\n"); printf("\t\t"); getchar(); exit(0); } } return 0; }