(수정됨, 최신 코드를 사용해주세요) 코드 설명:
1단계 메뉴: 구매한 항공편 번호를 선택하고 해당 좌석 상태를 표시합니다.
(테스트만 하므로 initFlight 함수에서 플라이트 2개만 초기화했고, 내 코드에 따라 추가해야 합니다.)
(참고: 실제 개발 소프트웨어, 링크됨) 목록 데이터 데이터베이스에서 읽혀지며 실시간 동기화가 필요합니다. initFlight 함수를 여러 번 호출하려면 메모리를 직접 해제하고 연결된 목록의 모든 "SINFO 및 FLINFO" 노드를 해제하는 함수를 작성해야 합니다. .출시기능은 작성하지 않았습니다. 직접 작성해주세요!! )
2단계 메뉴 : 해당좌석번호를 선택하시면 구매결과가 실시간으로 나옵니다! 시간.
위치 번호, 최대 좌석 행 수, 객실 유형, 할인 등의 매개 변수는 모두 null 값을 갖는 상수 매개 변수이며 상수를 직접 변경하려면 수정해야 합니다.
참고: 객실 유형(기본적으로 3가지 유형: 일등석, 비즈니스석, 이코노미석)은 할인 매개변수인 tDiscount 2차원 배열에 해당합니다. 새로운 캐빈 유형을 추가하려면 TYPESIZE, typeName, type 및 tDiscount 매개변수 상수 4개를 동시에 수정해야 합니다. 자세한 내용은 코드 노트를 참조하세요. !
좌석요금 = 기본요금 * 종류할인 * 기간할인.
기내에서는 흡연이 금지되어 있어서 흡연구역을 따로 만들지 않았습니다(웃음). 필요하시면 유형으로 추가하시면 됩니다! #include
#include
#include
#include #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;//위치 번호
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"); } FLINFO?*selectFlinfo(FLINFO?*flinfoHead,char?*fid)//항공편 번호를 선택하고 노드로 돌아갑니다 { p> while(flinfoHead->다음) { if(!strcmp(flinfoHead->next->fid,fid)) return?flinfoHead->다음; flinfoHead=flinfoHead->다음; } return?NULL; } p> void?printfFlinfo(FLINFO?*?flinfoHead) { while(flinfoHead->next) { 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,":"); 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,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"); 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; p> 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,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; 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; else sinfoTail->next=sinfoNew; sinfoTail=sinfoNew; clo++; } p> return?sinfoHead; } void?meError(void?*p)//메모리 적용 실패 { if(p==NULL) { printf("\n예외: 메모리 적용에 실패했습니다! Enter를 눌러 프로그램을 종료하세요! \n"); while(getch()!='\r'); exit(0); }