标题:求助!我这个链表做的机房收费管理系统运行有错,请帮忙看一下,谢谢。
取消只看楼主
y1299245219
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-12-19
 问题点数:0 回复次数:0 
求助!我这个链表做的机房收费管理系统运行有错,请帮忙看一下,谢谢。
刚学的,不太会,请大家指正一下。运行上机这部分时,突然终止,弹出对话框提示已停止工作。
程序代码:
#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; 
}




搜索更多相关主题的帖子: 管理系统 对话框 color 
2016-12-19 17:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-472604-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.969632 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved