程序执行 -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); //调用菜单函数 } }