| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 435 人关注过本帖
标题:c语言新手来帮我看看错误在哪里吧
只看楼主 加入收藏
暗夜精灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-7-3
收藏
 问题点数:0 回复次数:5 
c语言新手来帮我看看错误在哪里吧
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "constant.h"
#include "car.h"
#include "SqStack.h"
#include "LinkQueue.h"

void printtitle(){                                    //先清空屏幕再打印标题
    system("cls");                                    //Visual c++(头文件stdlib.h)
                                                    //clrscr(); Turboc(头文件conio.h)
    printf("\n\t\t\t/********************************\\");
    printf("\n\t\t\t<*\t\t\t\t*>");
    printf("\n\t\t\t<*");
    printf("\t  停车场管理系统\t*>");
    printf("\n\n\n                              欢迎使用停车场管理系统");
    printf("\n\t\t\t<*\t\t\t\t*>");
    printf("\n\t\t\t\\********************************/");
}

void printhead(int n,float fee){
                                          //先清空屏幕再打印标题、停车场大小和费用
    printf("\n\n\t\t=================================================");
    printf("\n\t\t||          停车场能停汽车的最大数量n: %d       ||",n);
    //printf("\n\t\t||---------------------------------------------||");
    printf("\n\t\t||        每辆车每小时的停车费用fee: %.2f$     ||",fee);
    printf("\n\t\t=================================================\n\n");

}
void printsave(SqStack *S,LinkQueue *Q){            //打印停放车辆的信息
    int i;
    SElemType *e=S->base;                            //开始时e指向栈底
    QueuePtr q;
    printf("\n\t-----------------------------------------------------------------");
    for(i=1;i<=SqStackLength(*S);i++,e++){            //若栈不空打印栈中各元素信息
        printf("\n\t|\t  车牌号: %-3d  停放位置: 停车场%-2d号  进场时刻: %-5d\t|",e->number,i,e->time);
        printf("\n\t-----------------------------------------------------------------");
    }
    q=Q->front->next;                                //开始时q指向首元结点
    for(i=1;i<=LinkQueueLength(*Q);i++,q=q->next){  //若队列不空打印队列中各元素信息
        printf("\n\t|\t  车牌号: %-3d  停放位置: 便道上%-2d号  进道时刻: %-5d\t|",q->data.number,i,q->data.time);
        printf("\n\t-----------------------------------------------------------------");
    }
}
void printsave2(SqStack *S){                        //只打印栈中停放车辆的信息
    int i;
    SElemType *e=S->top-1;                            //开始时e指向栈底
    for(i=SqStackLength(*S);i>=1;i--,e--){            //若栈不空打印栈中各元素信息
        printf("\n\t|\t  车牌号: %-3d  停放位置: 停车场%-2d号  进场时刻: %-5d\t|",e->number,S->stacksize-i+1,e->time);
        printf("\n\t-----------------------------------------------------------------");
    }
    /*q=Q->front->next;                                //开始时q指向首元结点
    for(i=1;i<=LinkQueueLength(*Q);i++,q=q->next){  //若队列不空打印队列中各元素信息
        printf("\n\t|\t  车牌号: %-3d  停放位置: 便道上%-2d号  进道时刻: %-5d\t|",q->data.number,i,q->data.time);
        printf("\n\t-----------------------------------------------------------------");
    }*/
}
void arrive(SqStack *S,LinkQueue *Q,SElemType car,float fee){                    //有车辆到达时调用
    if(SqStackFull(*S))                                //栈满时入队
        EnQueue(Q,car);
    else                                            //栈不满时进栈
        Push(S,car);
    printhead(S->stacksize,fee);                    //刷新屏幕
    printsave(S,Q);
}
void departure(SqStack *S1,SqStack *S2,LinkQueue *Q,SElemType car,float fee){    //有车辆离开时调用
    SElemType e1;
    if(SqStackEmpty(*S1)){                            //停车场内为空时
        printhead(S1->stacksize,fee);
        printf("\n\n\t\t\t     停车场内没有停放任何车辆!\n");
    }
    while(!SqStackEmpty(*S1)){                        //若栈S1不空逐个出栈(若遇break结束循环)
        
        Pop(S1,&e1);
        if(e1.number==car.number)
        {                    //与出栈的元素比较 相匹配时刷新屏幕
            printhead(S1->stacksize,fee);
            if(car.time>e1.time){
                printf("\n\t     -------------------------------------------------------");
                printf("\n\t     |    车牌号: %-3d停车场内停放时段: %d--%-5d费用: %.2f  |",car.number,e1.time,car.time,fee*(car.time-e1.time));
                printf("\n\t     -------------------------------------------------------");
                if(LinkQueueEmpty(*Q)){
                    printsave(S1,Q);
                    printsave2(S2);
                }
                break;        
            }
            else{
                printf("\n\t\t\t 输入错误! 出场时刻应大于入场时刻!\n");
                Push(S1,e1);                        //时刻不正确时不应出栈    故将元素放回
                printsave(S1,Q);
                printsave2(S2);
                break;
            }
        }
        Push(S2,e1);                                //将出栈元素逐个放入S2中
        if(SqStackEmpty(*S1)){                        //S1中元素全部出栈但没有匹配成功时
            printhead(S1->stacksize,fee);
            printf("\n\t-----------------------------------------------------------------");
            printsave2(S2);
            printsave(S1,Q);
            printf("\n\n\t\t\t    停车场内没有车牌号为%d的车辆!\n",car.number);
        }
    }
    while(!SqStackEmpty(*S2)){                        //S2中元素逐个出栈并放回S1中
        Pop(S2,&e1);
        Push(S1,e1);
    }
    if(SqStackLength(*S1)==(*S1).stacksize-1&&!LinkQueueEmpty(*Q)){                //满栈有元素出栈并且队列非空时 出队的元素进栈
        printf("\n\t     |    车牌号: %-3d的车从便道驶入停车场%-2d号\t\t   |",Q->front->next->data.number,(*S1).stacksize);
        printf("\n\t     -------------------------------------------------------\n");
        DeQueue(Q,&e1);
        e1.time=car.time;                            //记录进栈时刻
        Push(S1,e1);
        printsave(S1,Q);                            //刷新屏幕
    }   
}


void main(){



    float fee;
    char abc;
    SElemType car;
    SqStack S1,S2;
    LinkQueue Q;
   
                           
                    do{
                        printtitle();
                        printf("\n\n\n\t\t\t请输入停车场能停汽车的最大数量: n=");
                        scanf("%d",&S1.stacksize);
                        S2.stacksize=S1.stacksize;
                        printf("\t\t\t请输入每辆车每小时的停车费用: fee=");
                        scanf("%f",&fee);
                        if(S1.stacksize<=0||fee<=0){                                //输入不正确时输出
                        
                            printf("\n\n\n\n\t\t 输入错误!n应为大于0的整数,fee应为大于0的浮点数!\n\n");
                            printf("\n                                  请重新输入!");
                            getch();
                        }
                    }while(S1.stacksize<=0||fee<=0);                //若输入不正确则重新输入
                    printhead(S1.stacksize,fee);

                    InitSqStack(&S1);                                //建立S1,S2,Q
                    InitSqStack(&S2);
                    InitLinkQueue(&Q);
                    do{
                        printf("\n\n\t\t\t 请输入 A/D 车牌号 到达或离开时刻:");
                        fflush(stdin);
                        scanf("%c,%d,%d",&abc,&car.number,&car.time);
                        //getchar();                          读回回车符
                        if(abc=='A'||abc=='a')
                            arrive(&S1,&Q,car,fee);
                        if(abc=='D'||abc=='d')
                            departure(&S1,&S2,&Q,car,fee);
                    }while(abc!='E'&&abc!='e');                        //输入e或E结束循环
                    DestroySqStack(&S1);                            //销毁S1,S2,Q
                    DestroySqStack(&S2);
                    DestroyLinkQueue(&Q);
                    exit(OK);                                        //退出系统
                }
        
        

这是模拟停车场管理系统,在输入d时候出栈车辆打印错误,错误在printsave2中S->stacksize-i+1,请教如何修改打印也正确?

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

1,2号车的位置不对了
搜索更多相关主题的帖子: c语言 
2010-07-04 08:54
pbreak
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:83
专家分:558
注 册:2007-5-10
收藏
得分:0 
#include "constant.h"
#include "car.h"
#include "SqStack.h"
#include "LinkQueue.h"
这几个头文件在哪里??
2010-07-04 13:32
暗夜精灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-7-3
收藏
得分:0 
car.h

typedef struct{
    int number;                            //车牌号
    int time;
}SElemType,QElemType;


constant.h
#define TRUE 1
#define OK 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0


LinkQueue.h

typedef int Status;
/*链队列的存储结构*/
typedef struct QNode{
    QElemType data;                        //数据域
    struct QNode *next;                    //指针域
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;                        //队头指针
    QueuePtr rear;                        //队尾指针
}LinkQueue;
Status InitLinkQueue(LinkQueue *Q){        //建立带有头结点的空队列
    Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q->front)
        exit(OVERFLOW);
    Q->front->next=NULL;
    return OK;
}
Status DestroyLinkQueue(LinkQueue *Q){    //销毁队列
    while(Q->front){
        Q->rear=Q->front->next;
        free(Q->front);                    //利用循环释放结点
        Q->front=Q->rear;
    }
    return OK;
}
int LinkQueueLength(LinkQueue Q){        //返回队列长度
    QueuePtr p=Q.front;
    int i=0;
    while(p!=Q.rear){
        i++;                            //计数器自加1
        p=p->next;                        //移动指针到下一个位置
    }
    return i;
}
Status LinkQueueEmpty(LinkQueue Q){        //判队空
    if(LinkQueueLength(Q))
        return FALSE;
    return TRUE;
}
Status EnQueue(LinkQueue *Q,QElemType e){        //入队 插入e为新的队尾元素
    QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)
        exit(OVERFLOW);                            //存储分配失败
    p->data=e;                                    //把e赋值p的数据域
    p->next=NULL;
    /*p->next=Q->rear->next;*/
    Q->rear->next=p;                            //移动队尾指针
    Q->rear=p;
    return OK;
}
Status DeQueue(LinkQueue *Q,QElemType *e){        //出队 队不空时删除队头元素并用e返回其值
    QueuePtr p;
    if(LinkQueueEmpty(*Q))
        return ERROR;
    p=Q->front->next;                            //删除首元结点
    *e=p->data;
    Q->front->next=p->next;
    if(p==Q->rear)                                //队列中最后一个元素被删除时对队尾指针重新赋值
        Q->rear=Q->front;
    free(p);
    return OK;
}




SqStack.h
typedef int Status;
/*顺序栈的存储结构*/
typedef struct{
    SElemType *top;                        //栈顶指针
    SElemType *base;                    //栈底指针 栈构造前和销毁后base值为NULL
    int stacksize;                        //栈的大小
}SqStack;
Status InitSqStack(SqStack *S){            //根据栈的大小建立一个空栈
    S->base=(SElemType *)malloc(S->stacksize*sizeof(SqStack));
    if(!S->base)
        exit(OVERFLOW);                    //存储分配失败
    S->top=S->base;
    return OK;
}
Status DestroySqStack(SqStack *S){        //销毁栈   
    free(S->base);                        //释放空间
    S->base=NULL;                        //赋空值
    S=NULL;
    return OK;
}
Status SqStackEmpty(SqStack S){            //判栈空(top==base时为空)
    if(S.top==S.base)
        return TRUE;
    return FALSE;
}
int SqStackLength(SqStack S){            //返回栈中元素的个数
    return S.top-S.base;
}
Status SqStackFull(SqStack S){            //判栈满(top-base为栈大小时为满)
    if(S.top-S.base==S.stacksize)
        return TRUE;
    return FALSE;
}
Status Push(SqStack *S,SElemType e){    //进栈 插入元素e为新栈顶元素
    *(S->top)=e;                        //将要进栈的元素赋值给变量
    ++(S->top);                            //栈顶指针上移

    return OK;
}
Status Pop(SqStack *S,SElemType *e){    //出栈 若栈不空则删除栈顶元素并用e返回值
    if(SqStackEmpty(*S))
        return ERROR;
     S->top=S->top-1;                    //栈顶指针下移
    *e=*(S->top);                        //取出栈顶元素
    return OK;
}
2010-07-04 14:23
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
#include "constant.h"
#include "car.h"
#include "SqStack.h"
#include "LinkQueue.h"


这几个是LZ自己的吧。。。。

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2010-07-04 15:19
暗夜精灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-7-3
收藏
得分:0 
没人帮忙么?
2010-07-04 15:33
暗夜精灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-7-3
收藏
得分:0 
S2是临时栈 S1是停车场栈

倒序打印S2临时栈错误到底怎么改呢?
2010-07-04 15:38
快速回复:c语言新手来帮我看看错误在哪里吧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.079711 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved