搜索
您的当前位置:首页正文

停车场模拟

来源:六九路网


#include #include #include #include #include

typedef struct car // 车辆信息 {

char ch[64]; // 车牌号 char dt[16]; // 到达时间

char jt[16]; // 进入停车场(开始计费)时间 char lt[16]; // 离开时间 } TCAR, *LPT;

typedef struct carstack {

LPT lpCar; // 车辆信息 int nTop; // 栈顶元素下标 int M; // 栈容量 } TSTACK, *LPTSTACK;

// 初始化栈 CS, 将其容量设置为 Size

void StackInit( LPTSTACK &CS, int Size ) {

CS = ( LPTSTACK ) malloc( sizeof ( TSTACK ) ); CS->lpCar = ( LPT ) malloc(Size * sizeof ( TCAR )); CS->nTop = -1; CS->M = Size; }

// 车辆信息 cx 入栈 CS

void Push( LPTSTACK &CS, TCAR cx ) {

CS->nTop++;

CS->lpCar[CS->nTop] = cx; }

// 车辆信息从栈 CS 中弹出并存入 cx void Pop( LPTSTACK &CS, TCAR &cx) {

cx = CS->lpCar[CS->nTop]; CS->nTop--; }

// 若栈 CS 空,返回 TRUE;否则,返回 FALSE BOOL IsStackEmpty( LPTSTACK CS ) {

return CS->nTop == -1; }

// 若栈 lpStackFull 满,返回 TRUE;否则,返回 FALSE BOOL IsStackFull( LPTSTACK CS ) {

return CS->nTop == ( CS->M - 1 ); }

// 销毁栈 CS,将指针 CS 置为 NULL void DestroyStack( LPTSTACK &CS ) {

free( CS->lpCar ); free( CS ); CS = NULL; }

typedef struct carnode // 链队结点信息 {

TCAR cx; // 车辆信息

struct carnode *Next; // 指向下一个元素的指针 } TNODE, *LPTNODE;

typedef struct carqueue // 链队

{

LPTNODE Head; // 头结点

LPTNODE Rear; // 指向当前队尾的指针 int size; // 当前队中元素个数 } TQUEUE, *LPTQUEUE;

// 初始化链队 CQ

void InitQueue( LPTQUEUE &CQ ) {

CQ = ( LPTQUEUE ) malloc( sizeof( TQUEUE ) ); //生成头结点 CQ->Head = ( LPTNODE) malloc( sizeof( TNODE ) ); CQ->Head->Next = NULL; CQ->Rear = CQ->Head; CQ->size = 0;

}

// 车辆信息 cx 入队 CQ

void AddQueue( LPTQUEUE &CQ, TCAR cx )

{

LPTNODE CN = ( LPTNODE ) malloc( sizeof(carnode) ); //生成新结点,并有CN指向它 CN->cx = cx;

CN->Next = NULL; CQ->Rear->Next = CN; CQ->Rear = CQ->Rear->Next; CQ->size++; }

// 队头元素从链队 CQ 中出队并存入 cx void DeQueue( LPTQUEUE &CQ, TCAR &cx ) {

LPTNODE t = CQ->Head->Next; cx = t->cx;

CQ->Head->Next = t->Next; free( t ); CQ->size--; }

// 若链队 CQ 为空,返回 TRUE;否则,返回 FALSE BOOL IsQueueEmpty( LPTQUEUE CQ ) {

return CQ->size == 0; }

// 销毁链队 CQ

void DestroyQueue( LPTQUEUE &CQ ) {

LPTNODE NextCN= NULL; //空结点

for ( LPTNODE CN = CQ->Head; CN != NULL; CN = NextCN ) {

NextCN = CN->Next; free( CN ); }

free( CQ ); CQ = NULL;

}

// 将字符串时间格式转换为数字(分钟)格式,例如 12:36 将被转换为 756 ( 12 * 60 + 36 ) int TFormat( char *Time ) {

int Hour = 0; int Minute = 0;

sscanf( Time, \"%d:%d\

return Hour * 60 + Minute; }

// 根据在停车场内的停留时间 times (分钟)计算费用 double Expense( int times ) {

return times * ( 5.0 / 60 ); }

int main( void ) {

int MAX = 0; // 停车场容量 putchar( '\\n' );

printf(\"\\===========欢迎你进入停车场管理系统===========\\n\"); printf( \"请输入停车场容量:\" );

scanf( \"%d\

LPTSTACK CS= NULL; // 停车场,用栈模拟 StackInit( CS, MAX );

LPTQUEUE CQ = NULL; // 便道,用链队模拟 InitQueue( CQ );

char CType = NULL; // 命令类型 char Input[200] = { NULL }; // 用户输入 do

{

system( \"cls\" );//清空当前屏幕

puts( \"--------------------\" );

puts( \"[命令类型]\\nA - 车辆到达\\nD - 车辆离开\\nE - 停止输入\" ); puts( \"O - 显示当前停车场和便道使用情况\\n\" ); printf( \"请输入命令:\" ); scanf( \"%s\

puts( \"--------------------\" ); char Car[200] = { NULL };

sscanf( Input, // 将命令类型与车辆信息分开存放 \"%c,%s\

&CType, // 用户输入的前半部分,即命令类型 &Car // 用户输入的后半部分,即车辆信息 );

char *D = NULL; // 车辆信息字符串中的逗号位置 for ( D = Car; *D != '\\0'; D++ )

{

if ( *D == ',' ) { break;} }*D = '\\0';

TCAR cx = { NULL }; // 存储本次用户输入的车辆信息 strcpy( cx.ch, Car ); if ( CType == 'A' ) {

strcpy( cx.dt, D + 1 );

if ( FALSE == IsStackFull( CS ) ) {

strcpy( cx.jt, cx.dt ); Push( CS, cx );

printf( \"已进入停车场第 %d 个车位\\n\ printf( \"车牌号:\\%s\\n\ printf( \"进入时间:\%s\\n\ puts( \"是否收费:\是\" ); } else {

AddQueue( CQ, cx );

printf( \"停车场已满,已停放在便道的第 %d 个车位\\n\printf( \"车牌号:\\%s\\n\printf( \"停放时间:\%s\\n\

puts( \"是否收费:\否\" ); }

}

else if ( CType == 'D' ) {

strcpy( cx.lt, D + 1 );

LPTSTACK tCS = NULL; StackInit( tCS, MAX ); TCAR cxOut = { NULL };

BOOL IsCarFound = FALSE;

while ( FALSE == IsStackEmpty( CS) ) {

Pop( CS, cxOut );

if ( 0 != strcmp( cxOut.ch, cx.ch ) ) {

Push( tCS, cxOut ); } else {

IsCarFound = TRUE; break; } }

while ( FALSE == IsStackEmpty( tCS ) ) {

TCAR tcx = { NULL }; Pop( tCS, tcx ); Push( CS, tcx ); }

if ( FALSE == IsCarFound ) {

printf( \"车牌号为 %s 的车未进入停车场.\\n\

printf( \"--------------------\\n按任意键输入下一条信息...\\n\" );getch(); continue; }

strcpy( cxOut.lt, cx.lt );

int njt = TFormat( cxOut.jt ); int nlt = TFormat( cxOut.lt );

int times = nlt - njt;

printf( \"计费时段:\%s - %s (共 %d 分钟)\\n\ double rExpense = Expense( times );

printf( \"应交纳的费用:\%.1lf 元\\n\ if ( FALSE == IsQueueEmpty( CQ ) ) {

TCAR tcx = { NULL }; DeQueue( CQ, tcx );

strcpy( tcx.jt, cxOut.lt ); Push( CS, tcx );

puts( \"--------------------\\n\" );

printf( \"停放在便道的第 1 个车位,车牌号为 %s 的车已进入停车场\\n\ }

}

else if ( CType == 'E' )

{

puts( \"=====谢谢使用,欢迎下次再来!=====\" ); break;

}

else if ( CType == 'O' )

{

system( \"cls\" ); //清空当前屏幕

puts( \"[停车场使用情况]\\n\" );

puts( \"[车位]\[车牌号]\[到达时间]\[进入(开始计费)时间]\\n\"); for ( int i = 0; i <= CS->nTop; i++ )

{

printf( \"%d\%s\\%s\\%s\\n\\n\ }

//putchar( '' );

puts( \"[便道使用情况]\\n\" );

puts( \"[车位]\[车牌号]\[到达时间]\[进入(开始计费)时间]\\n\"); int nNum = 0;

for ( LPTNODE CN = CQ->Head->Next;CN != NULL; CN =CN->Next ) { nNum++;

printf( \"%d\%s\\%s\\%s\\n\ }

putchar( '\\n' ); }

else {

puts( \"输入信息有误.第一个字符只能为 'A' 或 'D' 或 'E' 或 'O' (区分大小写).\" ); }

printf( \"--------------------\\n按任意键输入下一条信息...\\n\" ); getch(); } while ( TRUE );

DestroyStack( CS ); DestroyQueue( CQ );

printf( \"\\n按任意键退出程序...\\n\"); getch(); return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容

Top