현재 위치 - 중국 분류 정보 발표 플랫폼 - 생활 서비스 정보 - C 언어로 된 비행기 예약 시스템 설계

C 언어로 된 비행기 예약 시스템 설계

(수정됨, 최신 코드를 사용해주세요) 코드 설명:

1단계 메뉴: 구매한 항공편 번호를 선택하고 해당 좌석 상태를 표시합니다.

(테스트만 하므로 initFlight 함수에서 플라이트 2개만 초기화했고, 내 코드에 따라 추가해야 합니다.)

(참고: 실제 개발 소프트웨어, 링크됨) 목록 데이터 데이터베이스에서 읽혀지며 실시간 동기화가 필요합니다. initFlight 함수를 여러 번 호출하려면 메모리를 직접 해제하고 연결된 목록의 모든 "SINFO 및 FLINFO" 노드를 해제하는 함수를 작성해야 합니다. .출시기능은 작성하지 않았습니다. 직접 작성해주세요!! )

2단계 메뉴 : 해당좌석번호를 선택하시면 구매결과가 실시간으로 나옵니다! 시간.

위치 번호, 최대 좌석 행 수, 객실 유형, 할인 등의 매개 변수는 모두 null 값을 갖는 상수 매개 변수이며 상수를 직접 변경하려면 수정해야 합니다.

참고: 객실 유형(기본적으로 3가지 유형: 일등석, 비즈니스석, 이코노미석)은 할인 매개변수인 tDiscount 2차원 배열에 해당합니다. 새로운 캐빈 유형을 추가하려면 TYPESIZE, typeName, type 및 tDiscount 매개변수 상수 4개를 동시에 수정해야 합니다. 자세한 내용은 코드 노트를 참조하세요. !

좌석요금 = 기본요금 * 종류할인 * 기간할인.

기내에서는 흡연이 금지되어 있어서 흡연구역을 따로 만들지 않았습니다(웃음). 필요하시면 유형으로 추가하시면 됩니다! #include

#include

#include

#include< /p>

#include

#include

//------------- - --------관련 매개변수를 변경하려면 여기에서 수정하세요! ! ! ! ! ! ! -------------

const?float?timeDiscount=1;//기간 할인, 영향 최종 가격 모든 항공편 중 기본값 1

const?char?cID[5]="ABCD";//위치 번호

const?int?maxRow=20;//최대 위치 번호 매기기

//참고: 유형 개수를 수정하는 경우 유형과 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};//Type 할인. 퍼스트 클래스 1.5배, 비즈니스 클래스 1.3배, 이코노미 클래스 1배

//---------------------------- - ------------------------------------------------- - -

typedef?struct?seatInfo//좌석 정보, 연결 목록은 하나의 항공편 정보에 해당하며 연결 ​​목록의 순서는 첫 번째 행의 왼쪽 첫 번째부터 A1~D1까지, A2~D2. . .

{

char?cloID;//위치 번호 A, B, C, D

int?row;//위치 번호

< p>int?type;//좌석 유형: 0: 일등석, 1: 비즈니스석, 2: 이코노미석, 다양한 유형은 다양한 할인 유형에 해당합니다. tDiscount

int?sell;//판매 상태 , 0: 판매되지 않음, 1: 판매됨

struct?seatInfo?*next;

}SINFO;

typedef?struct?flightInfo//항공편 정보< /p>

{

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);//항공편 번호를 선택하고 return Node

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)

p>

{

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"))

{

< p>system("cls");

계속;

}

else

{

sfSelect =selectSinfo(ffSelect,sid);< /p>

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)

{< /p>

if(sinfoHead->next->cloID==sid[ 0]?&&?sinfoHead->next->row==atoi(sid+1))

return?sinfoHead ->다음;

sinfoHead=sinfoHead->다음;< /p>

}

return?NULL;

}

< p>void?showSinfo(FLINFO?*flinfo)//항공편에 해당하는 좌석 정보 표시< /p>

{

SINFO?*sinfoHead=flinfo->sHead,*sfp=NULL ;

int?i,j,k,row=maxRow,clo= strlen(cID);

char?typeStr[10]={0};

< p>for(i=0;i

{

//---------좌석이 속한 객실 읽기-- ----------

memset(typeStr,0,10) ;

fo

r(k=0;k

if(i+1>=types[k][0]?&&?i+1<=types[k][1])< /p>

strcpy(typeStr,typeName[k]);

//------------------------- - ------------

printf("\n");

for(j=0;j

printf("------------?");

printf("\n");

sfp=sinfoHead < /p>

for(j=0;j

{

printf("|%c%02d|?",sfp->다음 - >cloID,sfp->다음->행);

sfp=sfp->다음;

}

printf("\n") < /p>

sfp=sinfoHead;

for(j=0;j

{

printf("|? % c?|?",sfp->next->sell?2:1);

sfp=sfp->next;

}

printf ( "\n");

sfp=sinfoHead;

for(j=0;j

{

printf("|%6s:%4.0f|?",typeStr,flinfo->tPrice*tDiscount[sfp->next->type]*timeDiscount);

sfp=sfp->next ;

}

printf("\n");

sinfoHead=sfp;

}

for (j=0;i

printf("-------?");

printf("\n");

p>

}

FLINFO?*selectFlinfo(FLINFO?*flinfoHead,char?*fid)//항공편 번호를 선택하고 노드로 돌아갑니다

{

while(flinfoHead->다음)

{

if(!strcmp(flinfoHead->next->fid,fid))

return?flinfoHead->다음;

flinfoHead=flinfoHead->다음;

}

return?NULL;

}

void?printfFlinfo(FLINFO?*?flinfoHead)

{

while(flinfoHead->next)

{

< p>printf( "목적지: %s, 항공편 번호: %s\n----출발 시간: %s, 도착 시간: %s\n\n",flinfoHead->next->toCity,flinfoHead->next ->fid ,getTString(localtime(&flinfoHead->next->tfTime)),getTString(localtime(&fl

infoHead->next->ldTime)));

flinfoHead=flinfoHead->다음;

}

}

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,":");

p> p>

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);

p >

return?rt;

}

FLINFO?*initFlight()//항공편 정보를 초기화하고 항공편 목록의 헤드 노드를 반환합니다. 수동으로 입력하려면 여기에 추가하세요! ! ! 일반적인 소프트웨어 개발에서 이 단계는 데이터베이스에서 읽어야 합니다!

{

FLINFO?*ffHead=NULL,*flinfoTail=NULL,f

New;

//---------항공편 정보 추가----추가해야 하는 경우 아래 전화 방법을 따르세요------------ --- -----

strcpy(fNew.fid,"CI502");

fNew.tfTime= getTime_tfromStr("2019 -02-20?03:30:30");

fNew.ldTime=getTime_tfromStr("2019-02-20?05:20:30");

< p>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)// tail 노드로 돌아가기

// 항공편 정보 연결 리스트의 노드 추가 flinfoHead: 헤드 노드(처음 NULL 이 전달되면 자동으로 생성됨), flinfoTail: tail 노드, fNew: 추가할 구조 정보(멤버 포인터는 할당할 필요가 없음)

{

FLINFO?*flinfoHead=*ffHead;

if( flinfoHead==NULL)

{

*ffHead=(FLINFO?*)malloc (sizeof(FLINFO));

flinfoHead=*ffHead;

meError(flinfoHead);

flinfoHead->next=NULL;

< p>}

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,f

New.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;< /p>

p>

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;

p>

for(i=0;i

if(row>=types[i][0]?&&?row <=types[i][1])

{

sinfoNew->type=i;

break;

}< /p>

sinfoNew->sell =0;

sinfoNew->next=NULL;

if(sinfoHead->next==NULL)

sinfoHead->next=sinfoNew;

p>

else

sinfoTail->next=sinfoNew;

sinfoTail=sinfoNew;

clo++;

}

return?sinfoHead;

}

void?meError(void?*p)//메모리 적용 실패

{

if(p==NULL)

{

printf("\n예외: 메모리 적용에 실패했습니다! Enter를 눌러 프로그램을 종료하세요! \n");

while(getch()!='\r');

exit(0);

}

< 피>}