dos下用c写电梯的模拟程序??

ggxi 2004-08-17 05:25:16
c语言课程作业
用tc写, 模拟双电梯(8层) , 需要简单的界面.
那位大侠有电梯调度算法, 或者哪里可以找到?
谁做过类似的程序, 传授点经验??
在vc6.0 活vc.net下是不是也可以写dos下的图形界面, 我刚刚试了,在vs.net和dec-c++下,都无法用
graphics.h.怎么用它 ? 或者有什么替代啊?
...全文
608 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
hreoghost 2005-03-24
  • 打赏
  • 举报
回复
做个标记!
hikozl 2004-08-22
  • 打赏
  • 举报
回复
我个人认为 用TC做图形没有什么 这道题主要是要模拟电梯的运行。
做为一个电梯的设计者,(如果是二部电梯的话因为电梯运行时不会倒回去)应该先考虑一个最近及省电原则。也就是说如果A号电梯在10楼,B号电梯在2楼(都是停止的)如果此时有人在8楼呼叫的话那么A号电梯应该响应。而如果同样是A在10楼,B在2楼而B在运行则要看8楼的呼叫是什么,如和B的动行方向一样的话则B到8后动作。而不同方则看B最后要到的目的地后再分析那一个就近来动作。我不知道这是不是你所要的思路。


这个只是某些特殊电梯才有的。
一般的电梯不会考虑那么多
lgdpeter8 2004-08-22
  • 打赏
  • 举报
回复
mark
liushuaiboy 2004-08-21
  • 打赏
  • 举报
回复
mark
ggxi 2004-08-21
  • 打赏
  • 举报
回复
电梯状态:
struct Tlift_con
{
int dir; //方向 1向上 -1向下 0停止
float pos; //位置
int next_pos; //下一个位置
} lift1, lift2;
请求:
struct Tmessage
{
int dir; //请求的方向
int pos; //请求的楼层
}
将消息队列分为上行和下行,若某楼层有请求,则为1,否则为0.
Tmessage up[9];
Tmessage down[9];
进入调度分析函数前,将两队列分别按升序和降序排列.
只有电梯到达某一楼层时才擦除该楼层的消息,

调度分析函数,每次消息数组发生改变或一电梯停止(next_pos == 0)则调用:
attemper( int *up,int *down , Tlift_con lift1_con, Tlift_con lift2_con );
{
if (俩电梯都停止)
{ 离产生消息近的电梯运行; }
else
if ( 一停止 ,一运行 )
{如果有与运行电梯相反方向的请求,则加入停止电梯的next_pos
else if ( 运行电梯方向上有请求且优于当前next_pos )
交换消息
}
else
if (两都运行 )
将在电梯运行方向上离电梯最近的请求楼层与电梯的next_pos对比,将优先放入
}
不全面? 一停止,俩运行时,还是有一些情况没考虑到.在进一步修改.
大家看看有什么不对,还有更好的办法没?? 欢迎修改 .呵呵 谢谢













ftofficer 2004-08-21
  • 打赏
  • 举报
回复
可以使用单向Scan的算法,给所有的请求排一个队,然后让电梯上下移动,只有当电梯移动方向上没有新的请求时才改变方向,算法应该不难。

但是不会在dos下写界面。
hellwolf 2004-08-20
  • 打赏
  • 举报
回复
mk
zhuriri 2004-08-20
  • 打赏
  • 举报
回复
我个人认为 用TC做图形没有什么 这道题主要是要模拟电梯的运行。
做为一个电梯的设计者,(如果是二部电梯的话因为电梯运行时不会倒回去)应该先考虑一个最近及省电原则。也就是说如果A号电梯在10楼,B号电梯在2楼(都是停止的)如果此时有人在8楼呼叫的话那么A号电梯应该响应。而如果同样是A在10楼,B在2楼而B在运行则要看8楼的呼叫是什么,如和B的动行方向一样的话则B到8后动作。而不同方则看B最后要到的目的地后再分析那一个就近来动作。我不知道这是不是你所要的思路。
sekelon 2004-08-20
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#include <time.h>
#include <fcntl.h>

typedef struct lift {

int x, y;
int number;
int floor;

}LIFT;

LIFT lift1, lift2;

void initdraw();
void drawlift( LIFT lifts, int color );
char diff( struct time sec, struct time fir, float tim );

void main() {

int gdriver = DETECT, gmode;
char flag = 1, lift1_flag = 0, lift2_flag = 0;
struct time first, second;

initgraph( &gdriver, &gmode, "" );
lift1.floor = 0;
lift1.number = 0;
lift1.x = 200;
lift1.y = 381;
lift2.floor = 0;
lift2.number = 0;
lift2.x = 390;
lift2.y = 381;
initdraw();

gettime( &first );
while ( flag ) {

gettime( &second );
if ( kbhit() ) {

int key;

key = getch();
switch ( key ) {

case 27://ESC
flag = 0;
continue;
case '1':
lift1_flag = 1;
break;
case '2':
lift2_flag = 1;
break;
case 'q':
if ( lift1_flag )
lift1_flag = 1;
break;
case 'a':
if ( lift1_flag )
lift1_flag = 2;
break;
case 'w':
if ( lift2_flag )
lift2_flag = 1;
break;
case 's':
if ( lift2_flag )
lift2_flag = 2;
break;

}

}
if ( diff( second, first, 0.05 ) ) {

if ( lift1_flag ) {

if ( lift1_flag == 1 ) {

drawlift( lift1, BLACK );
if ( lift1.y != 31 )
lift1.y--;
else
lift1_flag = 0;
drawlift( lift1, WHITE );

}
else if ( lift1_flag == 2 ) {

drawlift( lift1, BLACK );
if ( lift1.y != 381 )
lift1.y++;
else
lift1_flag = 0;
drawlift( lift1, WHITE );

}

}
if ( lift2_flag ) {

if ( lift2_flag == 1 ) {

drawlift( lift2, BLACK );
if ( lift2.y != 31 )
lift2.y--;
else
lift2_flag = 0;
drawlift( lift2, WHITE );

}
else if ( lift2_flag == 2 ) {

drawlift( lift2, BLACK );
if ( lift2.y != 381 )
lift2.y++;
else
lift2_flag = 0;
drawlift( lift2, WHITE );

}

}
first = second;

}

}
closegraph();

}

void drawlift( LIFT lifts, int color ) {

setcolor( color );
rectangle( lifts.x, lifts.y, lifts.x + 50, lifts.y + 49 );

}

void initdraw() {

int i;
int y = 30;

setcolor( WHITE );
rectangle( 50, 10, 590, 30 );
line( 70, 30, 70, 430 );
line( 190, 30, 190, 430 );
line( 260, 30, 260, 430 );
line( 380, 30, 380, 430 );
line( 450, 30, 450, 430 );
line( 570, 30, 570, 430 );
rectangle( 50, 431, 590, 470 );
for ( i = 0; i < 8; i++ ) {

line( 70, y + i * 50, 190, y + i * 50 );
line( 260, y + i * 50, 380, y + i * 50 );
line( 450, y + i * 50, 570, y + i * 50 );

}
drawlift( lift1, WHITE );
drawlift( lift2, WHITE );

}

char diff( struct time sec, struct time fir, float tim ) {

float second, first, cha;

if ( sec.ti_sec < fir.ti_sec )
second = sec.ti_sec + 60 + sec.ti_hund / 100.0;
else
second = sec.ti_sec + sec.ti_hund / 100.0;
first = fir.ti_sec + fir.ti_hund / 100.0;
cha = second - first;
if ( cha > tim )
return 1;
else
return 0;

}

这里的电梯会动了,不过没有写电梯的调度,楼主可以在这个基础上再追加
梁尚君 2004-08-20
  • 打赏
  • 举报
回复
學習學習,這麽多高手,真實好
ggxi 2004-08-20
  • 打赏
  • 举报
回复
强 .我研究研究 . 很感谢 . 写这么多!!值得我学习!!
sekelon 2004-08-20
  • 打赏
  • 举报
回复
按1启动左边的电梯,按2启动右边的电梯,按q左边的电梯上升,a左边的电梯下降,w右边的电梯上升,s右边的电梯下降,按esc退出
demo001 2004-08-18
  • 打赏
  • 举报
回复
拜读拜读qingyuan18(zealot_tang) 的代码

顺便帮楼主顶
ggxi 2004-08-18
  • 打赏
  • 举报
回复
基本功能,用图形模拟电梯的上下(双电梯),可能的话,以后加上鼠标操作.忘了说了,是8层.
比如这样吧, 两个8层的电梯, 每一层旁有两个按钮和一个输入框,分别表示上下和人数.
希望以后加上菜单, 加一些管理的功能, 比如 那些个楼层不停, 暂停外部操作,等等.
现在的问题是, 我想找一些电梯调度算法研究一下,不一定需要源代码, 而且老师不让用c++或者vc什么的,必须是dos下的(郁闷!!).谢谢各位!!
sekelon 2004-08-18
  • 打赏
  • 举报
回复
要用tc,又要图形界面,这不刁难人么?
---------------------------------------
用tc+图形界面是一件很难的事情吗?有什么刁难人的?
qingyuan18 2004-08-18
  • 打赏
  • 举报
回复
用的c++类实现的
qingyuan18 2004-08-18
  • 打赏
  • 举报
回复
要用tc,又要图形界面,这不刁难人么?


这是以前作的课程设计,是一个10层电梯的模拟,供楼主参考吧:

#include <stdio.h>
#include<conio.h>

class liftor
{
public:
int now_flare;
int direction;
int stored_flare[10];
liftor();
void set_flare(int x,int y);
void set_direction(int z);
void moveto(int h);
};

liftor::liftor()
{
int i;
now_flare=0;
for(i=0;i<10;i++)
stored_flare[i]=0;
direction=0;
}

void liftor::set_flare(int x,int y)
{
stored_flare[x]=y;
}

void liftor::set_direction(int x)
{
direction=x;
}

void liftor::moveto(int y)
{
now_flare=y;
printf("电梯到达第%dth楼\n",now_flare);
}

void input1(liftor &myliftor)
{
int input_flare,input_direction;
printf("输入楼层号及上下选择,以-1结束\n");
while(1)
{
printf("楼层是\t");
scanf("%d",&input_flare);
fflush(stdin);
if(input_flare==-1)
break;
else {
printf("上下选择:1-上楼,2-下楼\t");
scanf("%d",&input_direction);
fflush(stdin);
}
myliftor.set_flare(input_flare,input_direction);
}
}


void input2(liftor &myliftor)
{
int inside_flare;
printf("输入该层的乘客想到达的楼层,以-1结束\n");
while(1)
{
scanf("%d",&inside_flare);
fflush(stdin);
if(inside_flare==-1)
break;
else myliftor.set_flare(inside_flare,myliftor.direction);
}
}

void check(liftor &myliftor)
{
int i;
int flag1=0,flag2=0,flag3=0;
for(i=0;i<10;i++)
{
if(myliftor.stored_flare[i]!=0)
flag1=1;
if(myliftor.stored_flare[i]==1)
flag2=1;
if(myliftor.stored_flare[i]==2)
flag3=1;
}
if(!flag1) myliftor.set_direction(0);
else if(!flag2&&flag3) myliftor.set_direction(2);
else if(!flag3&&flag2) myliftor.set_direction(1);
}

int main(int argc, char *argv[])
{
liftor myliftor;
char flag;
int j;
myliftor.direction=1;
printf("**************************************\n");
printf("该程序用于模拟10(0-9)层的电梯控制\n");
printf("先输入按下电梯的层号及上下选\n择(类似电梯外的按钮)\n");
printf("每到一层时,输入乘客要到的楼\n层号(类似电梯内的按钮)\n");
printf("该程序会显示出电梯上下的路线\n");
printf("**************************************\n");
while(1)
{
input1(myliftor);
if(myliftor.direction==1)
{
for(j=0;j<10;j++)
{
if(myliftor.stored_flare[j]==1)
{
if(j>myliftor.now_flare)
{
myliftor.moveto(j);
myliftor.stored_flare[j]=0;
input2(myliftor);
}
}
}
}
check(myliftor);
if(myliftor.direction==0)
{
printf("还要继续么[Y/N]?\n");
scanf("%c",&flag);
fflush(stdin);
if(flag=='N'||flag=='n')
break;
}
if(myliftor.direction==2)
{
for(j=9;j>-1;j--)
{
if(myliftor.stored_flare[j]==2)
{
if(j<myliftor.now_flare)
{
myliftor.moveto(j);
myliftor.stored_flare[j]=0;
input2(myliftor);
}
}
}
}
check(myliftor);
if(myliftor.direction==0)
{
printf("还要继续么[Y/N]?\n");
scanf("%c",&flag);
fflush(stdin);
if(flag=='N'||flag=='n')
break;
}
}
return 0;
}
yelang771 2004-08-18
  • 打赏
  • 举报
回复
up
qiuafa 2004-08-18
  • 打赏
  • 举报
回复
捧场!
sekelon 2004-08-18
  • 打赏
  • 举报
回复
用TC2.0或TC3.0才能用graphics.h,看了你的题目,不过不明白你到底想把程序作成什么样子的?楼主能把要求说的详细一点吗?
加载更多回复(9)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧