北京理工大学软件工程 2023-11-13 18:16 采纳率: 66.7%
浏览 8
已结题

停车场管理系统付费输出结果不对


#include <iostream>
using namespace std;

const int carnumber = 3;  //栈容量
const int dayprice = 10;  //每日停车费
struct Car
{
    string license; // 汽车牌照
    int pushtime;   // 进栈时间
    int poptime;    //出栈时间
    string state;   // 状态
};

typedef struct  //栈
{
    struct Car cars[carnumber];
    int top;
} Sqstack;

typedef struct qnode   //链队列结点
{
    Car car;
    struct qnode* next;
}qnode, * quene;

typedef struct  //链队列
{
    quene front, rear;
}LinkQuene;

bool isEmpty(Sqstack* stack)
{
    return stack->top == -1;
}

bool initquene(LinkQuene* Q)
{
    Q->front = Q->rear = new qnode;
    Q->front->next = NULL;
    return true;
}

bool EnQuene(LinkQuene* Q, Car newcar)  //进入队列
{
    quene p = new qnode;
    p->car = newcar;
    p->next = NULL;

    Q->rear->next = p;
    Q->rear = p;
    cout << "进入队列车的车牌号和时间" << endl;
    cout << newcar.license << endl;
    cout << newcar.pushtime << endl << endl;

    return true;
}

bool DeQuene(LinkQuene* Q, Car& newcar)  //离开队列
{
    if (Q->front == Q->rear) // 队列为空
    {
        return false;
    }
    quene p;
    p = Q->front->next;

    newcar = p->car;
    Q->front->next = p->next;

    delete p;

    return true;
}


bool initstack(Sqstack* stack)
{
    stack->top = -1;
    return true;
}

bool visitstack(Sqstack* stack)
{
    cout << "遍历现有栈" << endl;
    for (int i = 0; i <= stack->top; i++)
    {        
        cout << stack->cars[i].license<<endl;
    }
    return true;
}

void pushstack(Sqstack* stack, LinkQuene* Q, struct Car newCar)
{
    if (stack->top < carnumber - 1)
    {
        // 检查车辆是否已经在栈中
        for (int i = 0; i <= stack->top; i++)
        {
            if (stack->cars[i].license == newCar.license)
            {
                cout << "该车辆已经在栈中。" << endl;
                return;
            }
        }

        int i = stack->top;

        if (i >= 0 && stack->cars[i].pushtime > newCar.pushtime) //栈顶车进栈时间和要新进车的进栈时间相比
        {
            cout << "时间错误" << endl;
            return;
        }

        stack->top++;
        stack->cars[stack->top] = newCar;
        cout << "车进栈.";
        cout << "汽车牌照:" << newCar.license << endl;
        cout << "进栈时间:" << newCar.pushtime << endl;
        cout << "排在第 " << stack->top + 1 << " 位" << endl;
        cout << endl;
    }
    else
    {
        cout << "栈已满,无法入栈,准备进入队列" << endl;
        EnQuene(Q, newCar);
    }
}

void popstack(Sqstack* stack, LinkQuene* Q, struct Car *newCar) //只能出栈尾元素,不能想出哪个出哪个
{
    if (stack->top >= 0)
    {
        *newCar = stack->cars[stack->top];
        stack->top--;

        cout << "出栈一个车" << (*newCar).license << endl;
        cout << "stack.top = "<<stack->top<<endl;
    }
    else
    {
        cout << "栈是空的,无法弹出车辆。" << endl;
    }
}



bool enterinformation(Car* car)
{
    cout << "输入汽车状态(到达或离开): ";
    cin >> car->state;
    cout << "输入汽车牌照: ";
    cin >> car->license;


    if (car->state == "到达")
    {
        cout << "输入汽车到达时间: ";
        cin >> car->pushtime;
    }
    else if (car->state == "离开")
    {
        cout << "输入汽车离开时间: ";
        cin >> car->poptime;
        cout << endl;
    }
    return true;
}

bool operate(Sqstack* stack, Sqstack* supstack, LinkQuene* Q, Car* car)
{
    enterinformation(car);

    if (car->license.empty())  //  || car->pushtime < 0
    {
        cout << "输入错误" << endl;
        return false;
    }

    if (car->state == "到达")
    {
        pushstack(stack, Q, *car);
    }
    else if (car->state == "离开")
    {
        bool found = false;
        int time = car->poptime - car->pushtime + 1;
        int price = time * dayprice;
        int i = 0;

        for (; i <= stack->top; i++)
        {
            if (stack->cars[i].license == car->license && stack->cars[i].pushtime < car->poptime)
            {
                found = true;

                // 将目标车辆和其他车辆全部退出栈,并将其他车辆进入辅助栈
                for (int j = stack->top; j >= i; j--)
                {
                    Car tempCar;
                    popstack(stack, Q, &tempCar);

                    if (j > i)
                    {
                        cout << "存入辅助栈" << endl;
                        pushstack(supstack, Q, tempCar); // 辅助栈暂存其他车辆                        
                    }
                    else
                        cout << "离开的车辆牌照:" << tempCar.license << endl; // 输出离开的目标车辆信息
                }

                cout << "离开的时间:" << car->poptime << endl;
                cout << "需付费:" << price << endl<<endl;

                // 将辅助栈中的车辆重新进入原停车场栈
                while (!isEmpty(supstack))
                {
                    Car tempCar;
                    cout << "辅助栈车准备出辅助栈" << endl;
                    popstack(supstack, Q, &tempCar);
                    cout << "辅助栈车准备进栈" << endl;                    
                    pushstack(stack, Q, tempCar);
                }
                break;
            }
        }

        if (found == false)
        {
            cout << "找不到"<<endl;
            return false;
        }


        if (Q->front != Q->rear)    //检查队列是否为空
        {
            Car queueCar = Q->front->next->car; // 获取队首车辆
            DeQuene(Q, queueCar); // 从队列中删除队首车辆
            cout << "队列首位车准备进栈" << endl;
            pushstack(stack, Q, queueCar); // 将队首车辆放入停车场
        }
        else
        {
            cout << "队列为空" << endl;
        }
        //cout << stack->cars[i].license<<endl;        
    }
    else
    {
        cout << "输入错误" << endl;
        return false;
    }
    return true;
}

int main()
{
    Sqstack stack;
    Sqstack supstack;
    LinkQuene quene;
    Car car1, car2, car3, car4, car5, car6, car7, car8, car9, car10;
    Car cars[] = { car1, car2, car3, car4, car5 };
    initstack(&stack);    // stack->top = -1
    initstack(&supstack);
    initquene(&quene);
    int numCars = sizeof(cars) / sizeof(cars[0]);

    for (int i = 0; i < numCars; i++)
    {
        operate(&stack, &supstack, &quene, &cars[i]);
    }

    visitstack(&stack);
    return 0;
}

我输入的是
到达 1 1 d达 2 2 dd 3 3 到d 4 4 离开 2 5 (提问禁止重复输入同样的词汇或符号,很无奈)

输出的付费结果是68,但理应为4 * 10 = 40

  • 写回答

1条回答 默认 最新

  • 柯本 2023-11-14 13:25
    关注
     int time = car->poptime - car->pushtime + 1;
    

    你的这个car不是当时输入的car,
    这样才可以

       else
                        {
                            cout << "离开的车辆牌照:" << tempCar.license << endl; // 输出离开的目标车辆信息
                            time = car->poptime - tempCar.pushtime + 1; //你的离开/进入时间在不同的变量中
                            price= time * dayprice;
                            }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 创建了问题 11月13日

悬赏问题

  • ¥100 文本摘要任务泄露问题
  • ¥15 js调用对象时报错,但是我看是有这个对象的,是不是调用方法不对
  • ¥15 希沃零度软件界面按钮传参分析
  • ¥15 可任意设置即使长度的倒计时器电路设计
  • ¥15 MusePose 部署安装问题,安装后无法启动
  • ¥15 Psexec获得电脑system权限该怎么操作,有偿
  • ¥50 python+flask实现流式api接口的问题
  • ¥20 关于#vue.js#的问题:后端返回的代码如下,根据后端返回的数据在页面上重新展示
  • ¥15 visual studio 社区版离线激活失败了
  • ¥15 Flask应用部署到阿里云服务器失败,无法访问网页,问题出在哪里?