飞机订票系统设计 c语言

飞机订票系统设计
功能:本飞机共有80个坐位,分20排,每排4个位子。编号为A,B,C,D。如10D
表示10排D座。A和D靠窗,19到20排为吸烟区。本系统可让乘客自己选座号和区域,直到乘客满意为止,无法满足的话,只能改乘另一个航班。定上票的乘客需给出姓名和身份证号,最后要打印出乘客清单。

(已修改,请用最新的代码)代码说明:

1级菜单:选择购买的航班号,并显示对应座位状态。

(我只做测试,所以初始化initFlight函数中我只初始了2个航班,需要自己按照我的代码添)

(注意:实际开发软件,链表数据是从数据库中读取的,需要实时同步,如果要多次调用initFlight函数,记得自己写一个释放内存的函数,把所有链表“SINFO和FLINFO”节点都释放掉,释放函数我没写,需要你自己写!!!)

2级菜单:选择购买对应座位号,完成购买,并实时显示购买结果。

位置编号、座位最大排数、舱室类型、折扣等参数均由常量参数空值,需要修改自行改常量。

注意:舱室类型(我默认3个类型头等舱、公务舱、经济舱)对应折扣参数:tDiscount二维数组。如要如要添加新的舱室类型,必须将参数常量TYPESIZE、typeName、types、tDiscount这4个同时修改,具体看代码备注!!

座位票价=基础票价*类型折扣*时段折扣。

因为飞机不让吸烟,所以我没做吸烟区(笑),如果你需要,可以作为类型自行添加!

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
//-----------------------相关参数,想改变,在这里修改!!!!!!!-----------------------------
const float timeDiscount=1;//时段折扣,影响所有航班最终价格,默认1
const char cID[5]="ABCD";//位置编号
const int maxRow=20;//位置最大排号
//注意:如果修改类型数量,types和tDiscount必须同时修改!!!
#define TYPESIZE 3//类型数量
const char typeName[TYPESIZE][10]={"头等舱","公务舱","经济舱"};
const int types[TYPESIZE][2]={{1,2},{3,4},{5,20}};//排号对应类型。1~2排头等舱,3~4排公务舱,5~20排经济舱
const float tDiscount[TYPESIZE]={1.5,1.3,1};//类型折扣。头等舱1.5倍,公务舱1.3倍,经济舱1倍

//-------------------------------------------------------------------------------
typedef struct seatInfo//座位信息,一条链表对应一个航班信息,链表顺序从第一排左边第一个开始往后A1~D1,A2~D2。。。
{
    char cloID;//位置编号A、B、C、D
    int row;//位置排号
    int type;//座位所属类型:0:头等舱、1:公务舱、2:经济舱,不同类型对应不同的类型折扣tDiscount
    int sell;//出售状态,0:未出售;1:已出售
    struct seatInfo *next;
}SINFO;
typedef struct flightInfo//航班信息
{
    char fid[10];//航班号
    time_t tfTime;//起飞时间
    time_t ldTime;//降落时间
    char toCity[20];//抵达城市
    float tPrice;//基础票价,不同位置具有不同折扣,座位票价=基础票价*类型折扣*时段折扣
    struct flightInfo *next;
    struct seatInfo *sHead;//对应座位链表的头节点
}FLINFO;
void meError(void *p);
SINFO *getSINFO();//获取座位链表
//addFLINFO:添加航班信息链表的节点flinfoHead:头节点(第一次传NULL会自动生成),flinfoTail:尾节点,fNew:要添加的结构信息(成员指针无需赋值)
FLINFO *addFLINFO(FLINFO **ffHead,FLINFO *flinfoTail,FLINFO fNew);//返回尾节点
time_t getTime_tfromStr(char *sTime);//将YYYY-MM-DD hh:mm:ss格式的时间字符串转换成time_t型数值
FLINFO *initFlight();//初始化航班信息,返回航班链表头节点,如果想手动输入,请在这里添加!!!正常软件开发,这一步应该是从数据库读取!
char *getTString(struct tm *tm0);//通过tm获取时间字符串
void showSinfo(FLINFO *flinfo);//显示航班对应座位信息
void printfFlinfo(FLINFO * flinfoHead);
FLINFO *selectFlinfo(FLINFO *flinfoHead,char *fid);//选择航班号,返回节点
void showSinfo(FLINFO *flinfo);//显示航班对应座位信息
SINFO *selectSinfo(FLINFO *flinfo,char *sid);//选择座位,返回节点
int main()
{
    FLINFO *flinfoHead=initFlight(),*ffSelect=NULL;
    SINFO *sfSelect=NULL;
    char fid[10]={0},sid[10]={10};
    while(1)
    {
        ffSelect=NULL;
        sfSelect=NULL;
        memset(fid,0,10);
        memset(sid,0,10);
        printfFlinfo(flinfoHead);
        printf("请输入要购买的航班号:");
        scanf("%s",fid);
        ffSelect=selectFlinfo(flinfoHead,fid);
        if(!ffSelect)
        {
            printf("未找到对应航班,按任意键继续-----\n");
            getch();
            system("cls");
            continue;
        }
        system("cls");
        printf("航班号:%s 座位信息如下:\n",ffSelect->fid);

        showSinfo(ffSelect);
        printf("请输入要购买的座位编号(输入0返回主菜单):");
        scanf("%s",sid);
        if(!strcmp(sid,"0"))
        {
            system("cls");
            continue;
        }
        else
        {
            sfSelect=selectSinfo(ffSelect,sid);
            if(!sfSelect||sfSelect->sell)
            {
                printf("未找到对应座位或该座位已出售,请重新输入!按任意键继续-----\n");
                getch();
                system("cls");
                continue;
            }
            printf("购买成功!按任意键继续-----");
            sfSelect->sell=1;
            getch();
            system("cls");
        }

    }
    return 0;
}
SINFO *selectSinfo(FLINFO *flinfo,char *sid)//选择座位,返回节点
{
    SINFO *sinfoHead=flinfo->sHead;
    while(sinfoHead->next)
    {
        if(sinfoHead->next->cloID==sid[0] && sinfoHead->next->row==atoi(sid+1))
            return sinfoHead->next;
        sinfoHead=sinfoHead->next;
    }
    return NULL;
}
void showSinfo(FLINFO *flinfo)//显示航班对应座位信息
{
    SINFO *sinfoHead=flinfo->sHead,*sfp=NULL;
    int i,j,k,row=maxRow,clo=strlen(cID);
    char typeStr[10]={0};
    for(i=0;i<row;i++)
    {
        //---------读取座位所属舱室------------
        memset(typeStr,0,10);
        for(k=0;k<TYPESIZE;k++)
            if(i+1>=types[k][0] && i+1<=types[k][1])
                strcpy(typeStr,typeName[k]);
        //--------------------------------------
        printf("\n");
        for(j=0;j<clo;j++)
            printf("------------- ");
        printf("\n");
        sfp=sinfoHead;

        for(j=0;j<clo;j++)
        {
            printf("|    %c%02d    | ",sfp->next->cloID,sfp->next->row);
            sfp=sfp->next;
        }
        printf("\n");
        sfp=sinfoHead;
        for(j=0;j<clo;j++)
        {
            printf("|     %c     | ",sfp->next->sell?2:1);
            sfp=sfp->next;
        }
        printf("\n");
        sfp=sinfoHead;
        for(j=0;j<clo;j++)
        {
            printf("|%6s:%4.0f| ",typeStr,flinfo->tPrice*tDiscount[sfp->next->type]*timeDiscount);
            sfp=sfp->next;
        }
        printf("\n");
        sinfoHead=sfp;
    }
    for(j=0;i<clo;j++)
            printf("------- ");
    printf("\n");

}
FLINFO *selectFlinfo(FLINFO *flinfoHead,char *fid)//选择航班号,返回节点
{
    while(flinfoHead->next)
    {
        if(!strcmp(flinfoHead->next->fid,fid))
            return flinfoHead->next;
        flinfoHead=flinfoHead->next;
    }
    return NULL;
}
void printfFlinfo(FLINFO * flinfoHead)
{
    while(flinfoHead->next)
    {
        printf("目的地:%s,航班号:%s\n----起飞时间:%s,抵达时间:%s\n\n",flinfoHead->next->toCity,flinfoHead->next->fid,getTString(localtime(&flinfoHead->next->tfTime)),getTString(localtime(&flinfoHead->next->ldTime)));
        flinfoHead=flinfoHead->next;
    }
}
char *getTString(struct tm *tm0)//通过tm获取时间字符串
{
    char *str=(char *)malloc(sizeof(char)*20),num[5]={0};
    meError(str);
    memset(str,0,20);
    sprintf(num,"%4d",tm0->tm_year+1900);
    strcat(str,num);
    strcat(str,"-");

    memset(num,0,5);
    sprintf(num,"%02d",tm0->tm_mon);
    strcat(str,num);
    strcat(str,"-");

    memset(num,0,5);
    sprintf(num,"%02d",tm0->tm_mday);
    strcat(str,num);
    strcat(str," ");

    memset(num,0,5);
    sprintf(num,"%02d",tm0->tm_hour);
    strcat(str,num);
    strcat(str,":");

    memset(num,0,5);
    sprintf(num,"%02d",tm0->tm_min);
    strcat(str,num);
    strcat(str,":");

    memset(num,0,5);
    sprintf(num,"%02d",tm0->tm_sec);
    strcat(str,num);
    return str;
}
time_t getTime_tfromStr(char *sTime)//将YYYY-MM-DD hh:mm:ss格式的时间字符串转换成time_t型数值
{
    time_t rt;
    struct tm *tm1=NULL;
    rt=time(NULL);
    tm1=localtime(&rt);
    sscanf(sTime,("%4d-%2d-%2d %2d:%2d:%2d"),&tm1->tm_year,&tm1->tm_mon,&tm1->tm_mday,&tm1->tm_hour,&tm1->tm_min,&tm1->tm_sec);
    tm1->tm_year-=1900;
    tm1->tm_mon--;
    rt=mktime(tm1);

    return rt;

}
FLINFO *initFlight()//初始化航班信息,返回航班链表头节点,如果想手动输入,请在这里添加!!!正常软件开发,这一步应该是从数据库读取!
{
    FLINFO *ffHead=NULL,*flinfoTail=NULL,fNew;
    //--------添加一个航班信息----需要增加按照我下面调用方式写--------------------------------
    strcpy(fNew.fid,"CI502");
    fNew.tfTime=getTime_tfromStr("2019-02-20 03:30:30");
    fNew.ldTime=getTime_tfromStr("2019-02-20 05:20:30");
    strcpy(fNew.toCity,"台北");
    fNew.tPrice=1000;
    fNew.next=NULL;
    flinfoTail=addFLINFO(&ffHead,flinfoTail,fNew);
    //--------------------------------------------------------------------------------------------
    strcpy(fNew.fid,"9C8921");
    fNew.tfTime=getTime_tfromStr("2019-02-20 14:30:30");
    fNew.ldTime=getTime_tfromStr("2019-02-20 16:40:30");
    strcpy(fNew.toCity,"香港");
    fNew.tPrice=500;
    fNew.next=NULL;
    flinfoTail=addFLINFO(&ffHead,flinfoTail,fNew);
    return ffHead;
}
FLINFO *addFLINFO(FLINFO **ffHead,FLINFO *flinfoTail,FLINFO fNew)//返回尾节点
//添加航班信息链表的节点flinfoHead:头节点(第一次传NULL会自动生成),flinfoTail:尾节点,fNew:要添加的结构信息(成员指针无需赋值)
{
    FLINFO *flinfoHead=*ffHead;
    if(flinfoHead==NULL)
    {
        *ffHead=(FLINFO *)malloc(sizeof(FLINFO));
        flinfoHead=*ffHead;
        meError(flinfoHead);
        flinfoHead->next=NULL;
    }
    FLINFO *flinfoNew=(FLINFO *)malloc(sizeof(FLINFO));
    meError(flinfoNew);
    flinfoNew->next=NULL;
    flinfoNew->fid[0]=0;
    strcpy(flinfoNew->fid,fNew.fid);
    flinfoNew->ldTime=fNew.ldTime;
    flinfoNew->tfTime=fNew.tfTime;
    flinfoNew->toCity[0]=0;
    strcpy(flinfoNew->toCity,fNew.toCity);
    flinfoNew->tPrice=fNew.tPrice;
    flinfoNew->sHead=getSINFO();
    if(flinfoHead->next==NULL)
        flinfoHead->next=flinfoNew;
    else
        flinfoTail->next=flinfoNew;
    flinfoTail=flinfoNew;
    return flinfoTail;
}
SINFO *getSINFO()//获取座位链表
{
    int maxClo=strlen(cID),cnt=maxClo*maxRow,clo=0,row=1,i;
    SINFO *sinfoHead=(SINFO *)malloc(sizeof(SINFO)),*sinfoTail=NULL;
    meError(sinfoHead);
    sinfoHead->next=NULL;
    SINFO *sinfoNew=NULL;
    while(cnt--)//按顺序生成对应数量的座位链表
    {
        if(clo==maxClo)
            clo=0,row++;
        if(row==maxRow+1)
            row=1;

        sinfoNew=(SINFO *)malloc(sizeof(SINFO));
        meError(sinfoNew);
        sinfoNew->cloID=cID[clo];
        sinfoNew->row=row;
        for(i=0;i<TYPESIZE;i++)
            if(row>=types[i][0] && row<=types[i][1])
            {
                sinfoNew->type=i;
                break;
            }
        sinfoNew->sell=0;
        sinfoNew->next=NULL;
        if(sinfoHead->next==NULL)
            sinfoHead->next=sinfoNew;
        else
            sinfoTail->next=sinfoNew;
        sinfoTail=sinfoNew;
        clo++;
    }
    return sinfoHead;
}
void meError(void *p)//内存申请失败
{
    if(p==NULL)
    {
        printf("\n异常:内存申请失败!回车结束程序!\n");
        while(getch()!='\r');
        exit(0);
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-25
实话实说,你的这个编程要求是不可能有任何人满足你的。因为编写系统程序首先本身就是一件非常艰苦的脑力劳动,其次编写程序源代码除了编写代码本身之外,还需要对它进行不断地调试等。
故从软件的总体设计、详细设计、以及软件编程代码实现、软件测试、直到软件能够运行出正确结果,都需要花费大量的时间进行一系列的调试。故你的要求肯定是不可行的。
第2个回答  2019-02-25
可帮写 could help
look at my profile photo
第3个回答  2019-02-25
这个可帮写哦
第4个回答  2019-02-25
不明白

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网