| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 895 人关注过本帖
标题:程序执行 -4.客户入住费用统计- 程序会发生崩溃,实在找不到原因了
取消只看楼主 加入收藏
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:6 
程序执行 -4.客户入住费用统计- 程序会发生崩溃,实在找不到原因了
这是咱贴吧一位吧友贴出来的程序,我昨天改了一个晚上,呃,最后没成功。
这是原址:
https://bbs.bccn.net/thread-425445-1-1.html

先贴上改后的程序:
程序代码:
#include<stdio.h>//I/O函数
#include<stdlib.h>//标准库函数
#include<string.h>//字符串函数


//定义数据结构
struct room
{
    char _room[10];
    int _num;
    int on;             //代表房间入住情况,0是没人,1是有人
};
struct room ROOM[10]={           //初始化数组
{"201",110,0},{"202",120,0},{"203",130,0},{"204",140,0},{"205",150,0},
{"206",160,0},{"207",170,0},{"208",180,0},{"209",190,0},{"210",200,0}};



struct customer
{
    char   id[20];         //身份证号
    char   name[20];       //客户姓名
    struct  room NUM;      //入住房间号与价格
    char   date_1[20];     //入住时间
    char   date_2[20];     //退房时间
    int    cost;           //费用
    int    time;           //入住天数
    char   begin_time[10]; //开始统计时间
    char   end_time[10];   //结束统计时间    
    struct customer *next;
};


//新增入住函数
void check_in(char *mem, struct customer *temp)
{
    int i;

    for (i=0; i<10; i++)
    {
        if (!strcmp(mem, ROOM[i]._room))
        {
            ROOM[i].on = 1;
            temp->NUM = ROOM[i];
        }
    }
}
            
//新增输出空房间名字函数
int print_offroom()
{
    int i;
    int flag = 0;

    for (i=0; i<10; i++)
    {
        if (ROOM[i].on == 0)
        {
            flag = 1;
            break;
        }
    }

    if (flag == 0)
    {
        printf("对不起,现在没有空房间。\n");
        return(1);
    }
    else
    {
        printf("现有空房间:\n");
        for (i=0; i<10; i++)
        {
            if (ROOM[i].on == 0)
            {
                printf("%-5s",ROOM[i]._room);
            }
            putchar(10);
        }
        return(0);
    } //end of if

}

//新增输出满房间名字函数
int print_onroom()
{
    int i;
    int flag = 0;

    for (i=0; i<10; i++)
    {
        if (ROOM[i].on == 1)
        {
            flag = 1;
            break;
        }
    }

    if (flag == 0)
    {
        printf("对不起,现在没有顾客入住。\n");
        return(1);
    }
    else
    {
        printf("现有顾客的房间:\n");
        for (i=0; i<10; i++)
        {
            if (ROOM[i].on == 1)
            {
                printf("%-5s",ROOM[i]._room);
            }
            putchar(10);
        }
        return(0);
    } //end of if

}

//新增加清屏函数
void clean()
{
    int i;
    for (i=0; i<14; i++)
    {
        putchar('\n');
    }
}

int Day(char *date) //输出天数
{
    int year;
    int month;
    int day;
    int sum = 0;
    int i = 1;
    int tab[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    
    year = 1000*(date[0]-'0') + 100*(date[1]-'0')
           + 10*(date[2]-'0') + (date[3]-'0');
    month = 10*(date[5]-'0') + (date[6]-'0');
    day = 10*(date[8]-'0') + (date[9]-'0');

    for ( ; i < month; i++)
    {
        sum = sum + tab[i-1];
    }
    sum = sum + day;

    if ((month > 2) && ((year%4 == 0) && (year % 100 != 0) || (year%400 == 0)))
    {
        sum = sum + 1;
    }
    
    return(sum);
}

//比对房间号码
int check(char mem[])
{  
    int i;
    for(i=0; i<10; i++)
    {
        if (strcmp(ROOM[i]._room,mem) == 0)
        {
            return(ROOM[i].on);
        }
    }
    printf("您输入的房间号不正确。\n");
    return(1);
}

//搜寻符合的房间,直接返回房间价格
int check_price(char mem[])
{
    int i;

    for (i=0; i < 10; i++)
    {
        if (!strcmp(mem, ROOM[i]._room))
        {
            return(ROOM[i]._num);
        }
    }

    return(0);    
}

//日期格式合法性判断函数,合法返回1,否则返回0。
int date_legal(char *date)
{
    int leap;
    int year;
    int month;
    int day;
    int flag=1;
    if (strlen(date) == 10)//判断长度
    {
        if ((date[4] == '-') && (date[7] == '-'))//判断格式
        {
            year = 1000*(date[0]-'0') + 100*(date[1]-'0')
                   + 10*(date[2]-'0') + (date[3]-'0');                //转换日期,将字符型转换为整形
            month = 10*(date[5]-'0') + (date[6]-'0');
            day = 10*(date[8]-'0') + (date[9]-'0');

            if (month > 12)
            {
                printf("\n您的输入有误(月份不可超出12)。\n");                              //判断月份是否合法
                flag = 0;
            }    

            
            if (month == 2)
            {
                    leap=((year%4 == 0) && (year%100 != 0) || (year%400 == 0));
                    if ((leap == 1) && (day > 29))
                    {
                        printf("\n您的输入有误(输入的年份属于闰年,二月只有二十九天)。\n");//判断闰年
                        flag = 0;
                    }
                    if ((leap == 0) && (day > 28))
                    {
                        printf("\n您的输入有误(输入的年份属于平年,二月只有二十八天)。\n");//判断平年
                        flag = 0;
                    }
            }

            if ((month == 4) || (month == 6) || (month == 9) || (month == 11))
            {
                    if (day > 30)
                    {
                        printf("\n您的输入有误(输入的月份只有三十天)\n");                  //判断天数
                        flag = 0;
                    }
            }

            if ((month == 1) || (month == 3) || (month == 5)    || (month == 7) 
                || (month == 8) || (month == 10) || (month == 12))
            {
                    if (day > 31)
                    {
                        printf("\n您的输入有误(输入的月份只有三十天)。\n");
                        flag = 0;
                    }
            }
        } 
        else
        {
            printf("\n您的输入有误(日期输入格式错误格式为YYYY-MM-DD)。\n");
            flag = 0;
        }
    }   //end of 格式判断    
    else
    {
        printf("\n您的输入有误(日期输入长度错误格式为YYYY-MM-DD)。\n");
        flag = 0;
    }   //end of 长度判断
    return flag;
}

//计算消费额
int Cost(struct customer *head)
{  
    struct customer *p;
    int a;
    int fee;
    int sum;
    char mem[10];
    
    p = head->next;
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");

    a = print_onroom();                          ////新增满房间号输出函数
    if (a)
    {
        return(0);
    }
    printf("\n请输入需要统计费用的房间号:\n");
    scanf ("%s", mem);
    for ( ; !check(mem); )
    {
        printf("\n您的输入有误。\n");
        print_onroom();
        printf("\n请输入房间号:\n");
        scanf("%s", mem);
    }

    while (!strcmp(mem, p->NUM._room))
    {
        p = p->next;
    }
    
    printf("\n开始统计时间(格式为YYYY-MM-DD):\n");           //退房时间的判断时间的合法性
    scanf("%s", p->begin_time);
    for ( ; !date_legal(p->begin_time); )                     //调用date_legal,判断时间的合法性
    {
        printf("\n您的输入有误。\n");
        printf("\n请重新输入开始统计时间(格式为YYYY-MM-DD):\n");
        scanf("%s", p->begin_time);
    }    
    
    printf("\n结束统计时间(格式为YYYY-MM-DD): \n");
    scanf("%s", p->end_time);
    for ( ; (!date_legal(p->end_time)) 
            || (!strcmp(p->end_time, p->begin_time)); )                     //调用date_legal,判断时间的合法性
    {
        printf("\n您的输入有误。\n");
        printf("\n请重新输入结束统计时间(格式为YYYY-MM-DD并且退房时间要大于入住时间):\n");
        scanf("%s", p->end_time);
    }
    
    //if ((strcmp(p->date_1, p->begin_time) <= 0) && (strcmp(p->date_2, p->end_time) >= 0))
    //{
        sum = Day(p->end_time) - Day(p->begin_time);
        fee = check_price(mem) * sum;
        printf("您的所在房间入住一天的价格为:%5d\n", check_price(mem));
        printf("统计时间内您所在房间入住天数为:%5d\n", sum);
        printf("在统计时间内您的费用为:%d\n", fee);
    //}

    printf("按任意键返回主菜单\n");
    getchar();
    getchar();
    return 0;    
}


//菜单函数
int menu_show()
{
    int c;
    clean();      //system("cls");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("※※※※※※※※..酒..店..与..房..间..登..记..管..理..系..统※※※※※※※※※※");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("※★★★★★★★★★★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★★★★★★★★★※");
    printf("※★※※※※※※※※★☆※※※--1.客户入住信息录入--※※★☆※※※※※※※※★※");
    printf("※★※--欢迎光临--※★☆※※※--2.客户入住信息显示--※※★☆※--欢迎光临--※★※");
    printf("※★☆★☆★☆★☆★★☆※※※--3.客户入住信息查询--※※★☆★☆★☆★☆★☆★※");
    printf("※★※--欢迎光临--※★☆※※※--4.客户入住费用统计--※※★☆※--欢迎光临--※★※");
    printf("※★※※※※※※※※★☆※※※--5.退出客户管理系统--※※★☆※※※※※※※※★※");
    printf("※★★★★★★★★★★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★★★★★★★★★※");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");

    printf("\n");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");    
    printf("请进行菜单选择:");
    scanf("%d", &c);

    for ( ; (c<1)||(c>5); )
    {
        printf("您的输入有误,请重新输入\n");
        printf("请进行菜单选择:");
        scanf("%d", &c);
    }

    return (c);
}





//新住户登记
int Add(struct customer *head)
{
    struct customer *p;
    struct customer *temp;
    char mem[10];
    int a;

    p = head;
    temp = (struct customer*)malloc(sizeof(struct customer));
    temp->next = NULL;

    while (p->next != NULL)
    {
        p = p->next;
    }
    clean();                             //system("cls");
    
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("请输入客户入住信息\n");
    printf("客户姓名:\n");
    scanf("%s", temp->name);

    printf("身份证号(15或18位):\n");
    scanf("%s", temp->id);
    while ((strlen(temp->id) != 15) && (strlen(temp->id) != 18))            //身份证长度判断
    { 
        printf("\n您的输入有误\n请重新输入(15或18位):\n");
        scanf("%s", temp->id);
    }
    
    a = print_offroom();                          //新增空房间号输出函数
    if (a)
    {
        return(0);
    }
    printf("\n请输入房间号:\n");
    scanf("%s", mem);
    for ( ; check(mem); )
    {
        printf("\n您的输入有误。\n");
        print_offroom();
        printf("\n请输入房间号:\n");
        scanf("%s", mem);
    }
    check_in(mem, temp);                              //新增入住函数

    printf("\n开始入住时间(格式为YYYY-MM-DD):\n");           //退房时间的判断时间的合法性
    scanf("%s", temp->date_1);
    for ( ; !date_legal(temp->date_1); )                     //调用date_legal,判断时间的合法性
    {
        printf("\n您的输入有误。\n");
        printf("\n请重新输入开始入住时间(格式为YYYY-MM-DD):\n");
        scanf("%s", temp->date_1);
    }    
    
    printf("\n退房时间(格式为YYYY-MM-DD): \n");
    scanf("%s", temp->date_2);
    for ( ; (!date_legal(temp->date_2)) 
            || (!strcmp(temp->date_2, temp->date_1)); )                     //调用date_legal,判断时间的合法性
    {
        printf("\n您的输入有误。\n");
        printf("\n请重新输入退房时间(格式为YYYY-MM-DD并且退房时间要大于入住时间):\n");
        scanf("%s", temp->date_2);
    }
    
    temp->time = Day(temp->date_2) - Day(temp->date_1);                         //计算入住天数
    temp->cost = temp->time * check_price(mem);                           //计算房间产生的费用

    printf("您输入的信息已经录入成功。\n");
    p->next = temp;
    printf("按任意键返回主菜单。\n");
    getchar();
    getchar();
    return(1);
}



//显示现有住宿情况
void List(struct customer *head)
{
   int i = 0;
   struct customer *p;

   p = head->next;
   if (p == NULL)
   {
       printf("无顾客入住!\n");
       return;
   }

   clean();                   //system("cls");
   printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
   printf("※******************************客户入住信息录入******************************※");
   printf("※姓名     身份证号        房间号  入住时间     退房时间   入住天数   所需费用※");
   printf("※----------------------------------------------------------------------------※");
   while (p!=NULL)
   {
       printf("  %s%21s%6s%13s%13s%6d%10d\n", p->name, p->id, p->NUM._room,
             p->date_1, p->date_2, p->time, p->cost);
       p = p->next;
   }
   printf("※*********************************结束***************************************※");
   printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
   
   printf("按任意键返回主菜单\n");
   getchar();
   getchar();
}
    



//查询房间住宿情况
int Search (struct customer *head)
{
    int a;
    char Num[20];
    struct customer *p;
    int flag = 0;

    p = head->next;

    clean();                //system("cls");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    a = print_onroom();                          
    if (a)
    {
        return(0);
    }    
    printf("请输入待查找的房间号:\n");
    scanf("%s", Num);
    while (p != NULL)
    {
        if (!strcmp(Num, p->NUM._room))
        {
            printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
            printf("※******************************客户入住记录信息******************************※");
            printf("※客户姓名        身份证号     入住时间     退房时间    入住天数    所需费用  ※");
            printf("※============================================================================※");
            printf("※............................................................................※");
            printf("  %s%21s%13s%13s%6d%10d  \n ", p->name, p->id,
                   p->date_1, p->date_2, p->time, p->cost);
            printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
            flag=1;
        }
        p = p->next;      
    }
    if (flag == 0)
    {
        printf("您的输入有误(暂无该房间的顾客入住相关信息)。\n");
    }
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    
    printf("按任意键返回主菜单\n");
    getchar();
    getchar();
    return(1);
}


//函数结束
void End_time()
{
    clean();                  //system("cls");
    printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("※.......................心情愉快.........和气生财............................※");
    printf("※............................................................................※");
    printf("※***★★★******★★★******★★★****★★★*****★★★*******★*****★****★※");
    printf("※*★*****★****★*****★***★*****★**★****★***★****★***★**★***★****★※");
    printf("※★******★***★*******★*★*******★*★*****★**★****★*★******★*★****★※");
    printf("※★***********★*******★*★*******★*★******★*★***★**★******★**★**★*※");
    printf("※★***********★*******★*★*******★*★******★*★★★***★★★★★****★***※");
    printf("※★****★★★*★*******★*★*******★*★******★*★***★**★******★****★***※");
    printf("※★******★★*★*******★*★*******★*★*****★**★****★*★******★****★***※");
    printf("※*★****★*★**★*****★***★*****★**★****★***★****★*★******★****★***※");
    printf("※**★★★**★***★★★*******★★★***★★★*****★★★***★******★****★***※");
    printf("※.......................版权所有.........翻录必究............................※");
    printf("※...................................................Made by zoujun...........※");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※");
    printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
    exit(0);
}

void menu_select(int sel, struct customer *head)
{
    switch(sel)
    {
    case 1: Add(head);
        break;
    case 2: List(head);   
        break;
    case 3: Search(head);   
        break;
    case 4: Cost(head);  
        break;
    case 5: End_time();    
        break;
    }    
}

//主函数
void main()
{ 
    struct customer *head;
    head = (struct customer *)malloc(sizeof(struct customer));
    head->next = NULL;
    clean();              //system("cls");   //清屏

    for ( ; ; )    // 死循环
    {
        menu_select(menu_show(), head);  //调用菜单函数
    }

}
搜索更多相关主题的帖子: 字符串 统计 
2013-12-23 17:42
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
为什么会崩溃啊,,,我都快崩溃了,昨天一宿没睡。。。

未知令人期待!
2013-12-23 17:42
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 3楼 wp231957
昨天调了一个晚上了。。。
搞到今天上午五点,
其实是编译都能过去,

除了Cost函数一调用就错误外,别的应该是没问题了。
就是这个Cost 无语。。

未知令人期待!
2013-12-23 17:56
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 7楼 embed_xuel
  debug 是什么情况。。。
我这个就是根据c语言编程弄的
到现在为止,我只是学了c语言,怎么调试啊,什么的不知道。。(包括断言,断点什么的,正找资料学)

未知令人期待!
2013-12-23 22:16
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 9楼 embed_xuel
我找到了呀。。。。 在这里:
Cost 函数里面:

printf("\n请输入需要统计费用的房间号:\n");
    scanf ("%s", mem);

进行scanf函数的时候 程序会崩溃。。。

未知令人期待!
2013-12-24 14:35
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 11楼 embed_xuel
哦 yes! 万分感谢! 就是这里出问题了
 谢谢

未知令人期待!
2013-12-25 19:21
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 13楼 embed_xuel
大神给说一下呗

未知令人期待!
2013-12-30 12:16
快速回复:程序执行 -4.客户入住费用统计- 程序会发生崩溃,实在找不到原因了
数据加载中...
 
   



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

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