❶ 請問誰有C語言的電梯模擬演算法
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <winbase.h>
#include <string.h>
#include "egg.h"
#include "elevator.h"
#define START 0//定義初始狀態
#define UP 1//上行初始
#define DOWN 2//下行初始
#define PAUSE 3
#define N 100//記錄數組的容量
void getInput(void);//
void getInput0(void);//
void Status_trans(void);//顯示當前的狀態
void control(void);//控制主要的電梯過程
void control0(void);//在暫停後的控制
void time_count(void);
void Uper(void); //上行
void Downer(void); //下行
int Call[N]={0};
int Callup[10]={0}; //存放向上呼叫的整型數組
int Callin[10]={0}; //存放內部呼叫的整型數組
int Calldown[10]={0};//存放向下呼叫的整型數組
int time=0,state=0,prestate=0,flag=1,x=0;
int aimLayer=0,currentLayer=1;
float cl1=0.0,cl2=0.0;
main()
{
int service;
elevator();
system("color 3f");
printf("EVA 電梯竭誠為您服務,祝乘坐愉快\n");
printf("請選擇服務策略(1為先來先服務,2為順便服務):\n");
scanf("%d",&service);
if(service==1) {
DWORD ThreadID1 = 1;
HANDLE hRead1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput0,NULL,0,&ThreadID1);
}
else {
DWORD ThreadID2 = 1;
HANDLE hRead2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID2);
}
while (1){
if(service==1)
control0();
else
control();
Status_trans(); /*確定電梯此刻的狀態,包括運行方向、所在樓層等*/
}
system("pause");
return 0;
}
void Status_trans(void)//yang
{
int i;
switch (state) {
case START:
if(aimLayer>currentLayer)
state=UP;
if(aimLayer==currentLayer)
state=PAUSE,prestate=START;
if(aimLayer==0)
state=START;
break;
case UP:
flag=1;
Uper();
currentLayer++;
drawCurrentLayer1(currentLayer);
drawCurrentLayer2(currentLayer);
printf("當前電梯樓層 %d\n", currentLayer);
if(currentLayer==aimLayer) {
state=PAUSE,x=1,prestate=UP;
printf("當前電梯樓層 %d\n", currentLayer);
}
if(currentLayer<aimLayer)
state=UP,flag=1;
if(currentLayer>aimLayer)
state=DOWN,flag=-1;
break;
case DOWN:
flag=-1;
Downer();
currentLayer--;//?
drawCurrentLayer1(currentLayer);
drawCurrentLayer2(currentLayer);
printf("當前電梯樓層 %d\n", currentLayer);
if(currentLayer==aimLayer) {
state=PAUSE,x=1,prestate=DOWN;
printf("當前電梯樓層 %d\n", currentLayer);
}
if(currentLayer<aimLayer)
state=UP,flag=1;
if(currentLayer>aimLayer)
state=DOWN,flag=-1;//flag?
break;
case PAUSE:
drawCurrentLayer1(currentLayer);
drawCurrentLayer2(currentLayer);
for(i=1;i<=4;i++)
WaitFor(100);
if(aimLayer<currentLayer)
state=DOWN;
if(aimLayer>currentLayer)
state=UP;
if(aimLayer==0)
state=PAUSE,prestate=PAUSE;
break;
}
}
void control(void)
{
int i,mark=0,m=0;
if(flag==1) {
if(state==PAUSE && prestate!=PAUSE) {//上行中確定目標樓層
Callin[currentLayer]=Callup[currentLayer]=0;
for(i=currentLayer+1;i<=9;i++)
if(Callup[i]==1 || Callin[i]==1 || Calldown[i]==1)
m=1;
if(m!=1)//無上行需求直接將下行此樓層處理
Calldown[currentLayer]=0;
}
for(i=currentLayer;i<=9;i++)
if(Callup[i]==1 || Callin[i]==1) {
mark=i;
aimLayer=i;
break;
}//有上行需求 ,目標樓層被確定
if(mark==0)//無上行需求
for(i=9;i>=1;i--)
if(Calldown[i]==1 || Callin[i]==1) {
aimLayer=i;
mark=i;
break;
}//確定下行目標樓層
if(mark==0)
for(i=1;i<=8;i++)
if(Callup[i]==1) {
aimLayer=i;
mark=i;
break;
}
if(mark==0)
aimLayer=0;
}//無目標樓層
else if(flag==-1) {
if(state==PAUSE && prestate!=PAUSE) {//電梯運行中
Calldown[currentLayer]=Callin[currentLayer]=0;//此層已處理過
for(i=currentLayer-1;i>=1;i--)
if(Callup[i]==1 || Callin[i]==1 || Calldown[i]==1)
m=1;
if(m!=1)
Callup[currentLayer]=0;//無目標樓層暫時停靠 m??
}
for(i=currentLayer-1;i>=1;i--)
if(Calldown[i]==1 || Callin[i]==1) {
mark=i;
aimLayer=i;
break;
}//確定下行目標樓層
//???為何要向上運行開始呢?
if(mark==0) //順便無要求,開始新的一樓起的上升需求掃描
for(i=1;i<=9;i++)
if(Callup[i]==1 || Callin[i]==1) {
aimLayer=i;
mark=i;
break;
}
if(mark==0)
for(i=9;i>=2;i--)
if(Calldown[i]==1) {
aimLayer=i;
mark=i;
break;
}
if(mark==0)
aimLayer=0;
}
}
void control0(void)//yang
{
int i;
for(i=0;i<=N-1;i++) {
if(Call[i]!=0) {
aimLayer=Call[i];
if(state==PAUSE && prestate!=PAUSE)
Call[i]=0;
break;
}
}
}
void getInput(void)
{
char ch;
while(1){
ch=getchar();
switch(ch) {
case'I':
Callup[1]=1;
break;
case'U':
Callup[2]=1;
break;
case'Y':
Callup[3]=1;
break;
case'T':
Callup[4]=1;
break;
case'R':
Callup[5]=1;
break;
case'E':
Callup[6]=1;
break;
case'W':
Callup[7]=1;
break;
case'Q':
Callup[8]=1;
break;
case'K':
Calldown[2]=1;
break;
case'J':
Calldown[3]=1;
break;
case'H':
Calldown[4]=1;
break;
case'G':
Calldown[5]=1;
break;
case'F':
Calldown[6]=1;
break;
case'D':
Calldown[7]=1;
break;
case'S':
Calldown[8]=1;
break;
case'A':
Calldown[9]=1;
break;
case '1':
Callin[1]=1;
break;
case '2':
Callin[2]=1;
break;
case '3':
Callin[3]=1;
break;
case '4':
Callin[4]=1;
break;
case '5':
Callin[5]=1;
break;
case '6':
Callin[6]=1;
break;
case '7':
Callin[7]=1;
break;
case '8':
Callin[8]=1;
break;
case '9':
Callin[9]=1;
break;
}
fflush(stdin);//使回車不被讀取
}
}
void getInput0(void)//yangnan
{
int i=0;
char ch;
while(1){
ch=getchar();
switch(ch) {
case'I':
Call[i]=1;
break;
case'U':
Call[i]=2;
break;
case'Y':
Call[i]=3;
break;
case'T':
Call[i]=4;
break;
case'R':
Call[i]=5;
break;
case'E':
Call[i]=6;
break;
case'W':
Call[i]=7;
break;
case'Q':
Call[i]=8;
break;
case'K':
Call[i]=2;
break;
case'J':
Call[i]=3;
break;
case'H':
Call[i]=4;
break;
case'G':
Call[i]=5;
break;
case'F':
Call[i]=6;
break;
case'D':
Call[i]=7;
break;
case'S':
Call[i]=8;
break;
case'A':
Call[i]=9;
break;
case '1':
Call[i]=1;
break;
case '2':
Call[i]=2;
break;
case '3':
Call[i]=3;
break;
case '4':
Call[i]=4;
break;
case '5':
Call[i]=5;
break;
case '6':
Call[i]=6;
break;
case '7':
Call[i]=7;
break;
case '8':
Call[i]=8;
break;
case '9':
Call[i]=9;
break;
}
i++;
fflush(stdin);//使回車不被讀取
}
}
void Uper(void)
{
int step;
for(step=1;step<=20;step++){
WaitFor(50);/*等待50毫秒*/
move(0.075);
}
}
void Downer(void)
{
int step;
for(step=1;step<=20;step++){
WaitFor(50);/*等待50毫秒*/
move(-0.075);
}
}
但是這個演算法可能會有點小問題,你研究一下看看,多多少少有幫助的
❷ 操作系統模擬電梯調度演算法C語言程序
多級反饋隊列調度演算法 多級反饋隊列調度演算法是一種CPU處理機調度演算法,UNIX操作系統採取的便是這種調度演算法。 多級反饋隊列調度演算法即能使高優先順序的作業得到響應又能使短作業(進程)迅速完成。(對比一下FCFS與高優先響應比調度演算法的缺陷)。 多級(假設為N級)反饋隊列調度演算法可以如下原理: 1、設有N個隊列(Q1,Q2....QN),其中各個隊列對於處理機的優先順序是不一樣的,也就是說位於各個隊列中的作業(進程)的優先順序也是不一樣的。一般來說,優先順序Priority(Q1) > Priority(Q2) > ... > Priority(QN)。怎麼講,位於Q1中的任何一個作業(進程)都要比Q2中的任何一個作業(進程)相對於CPU的優先順序要高(也就是說,Q1中的作業一定要比Q2中的作業先被處理機調度),依次類推其它的隊列。 2、對於某個特定的隊列來說,裡面是遵循時間片輪轉法。也就是說,位於隊列Q2中有N個作業,它們的運行時間是通過Q2這個隊列所設定的時間片來確定的(為了便於理解,我們也可以認為特定隊列中的作業的優先順序是按照FCFS來調度的)。 3、各個隊列的時間片是一樣的嗎?不一樣,這就是該演算法設計的精妙之處。各個隊列的時間片是隨著優先順序的增加而減少的,也就是說,優先順序越高的隊列中它的時間片就越短。同時,為了便於那些超大作業的完成,最後一個隊列QN(優先順序最高的隊列)的時間片一般很大(不需要考慮這個問題)。 多級反饋隊列調度演算法描述: 1、進程在進入待調度的隊列等待時,首先進入優先順序最高的Q1等待。 2、首先調度優先順序高的隊列中的進程。若高優先順序中隊列中已沒有調度的進程,則調度次優先順序隊列中的進程。例如:Q1,Q2,Q3三個隊列,只有在Q1中沒有進程等待時才去調度Q2,同理,只有Q1,Q2都為空時才會去調度Q3。 3、對於同一個隊列中的各個進程,按照時間片輪轉法調度。比如Q1隊列的時間片為N,那麼Q1中的作業在經歷了N個時間片後若還沒有完成,則進入Q2隊列等待,若Q2的時間片用完後作業還不能完成,一直進入下一級隊列,直至完成。 4、在低優先順序的隊列中的進程在運行時,又有新到達的作業,那麼在運行完這個時間片後,CPU馬上分配給新到達的作業(搶占式)。 我們來看一下該演算法是如何運作的: 假設系統中有3個反饋隊列Q1,Q2,Q3,時間片分別為2,4,8。 現在有3個作業J1,J2,J3分別在時間 0 ,1,3時刻到達。而它們所需要的CPU時間分別是3,2,1個時間片。 1、時刻0 J1到達。於是進入到隊列1 , 運行1個時間片 , 時間片還未到,此時J2到達。 2、時刻1 J2到達。 由於時間片仍然由J1掌控,於是等待。 J1在運行了1個時間片後,已經完成了在Q1中的 2個時間片的限制,於是J1置於Q2等待被調度。現在處理機分配給J2。 3、時刻2 J1進入Q2等待調度,J2獲得CPU開始運行。 4、時刻3 J3到達,由於J2的時間片未到,故J3在Q1等待調度,J1也在Q2等待調度。 5、時刻4 J2處理完成,由於J3,J1都在等待調度,但是J3所在的隊列比J1所在的隊列的優先順序要高,於是J3被調度,J1繼續在Q2等待。 6、時刻5 J3經過1個時間片,完成。 7、時刻6 由於Q1已經空閑,於是開始調度Q2中的作業,則J1得到處理器開始運行。 8、時刻7 J1再經過一個時間片,完成了任務。於是整個調度過程結束。
❸ 用C語言設計多電梯的控製程序
......
提問嘛?
知道為什麼三電梯或者多電梯要比單電梯貴很多,就是因為這種控製程序
看一下petri網(英文名可能錯了)的實現吧
軟體工程中的一種,從電梯演算法中引出的一種設計方法
❹ 數據結構 用C語言設計一個模擬電梯工作過程的圖形演示系統,
「用c語言完成簡單代碼的編寫」可以實現電梯對按鈕響應的運算過程,但你說的「圖形演示系統」我就不是很理解了,是用c語言編個電梯圖形出來么?
❺ 模擬電梯程序 用c語言寫(數據結構)
要不要用到單片機
❻ 求個C語言的電梯程序設計
這種作業就自己做唄, 鞏固基礎最好的方式啊。。。
指針,鏈表, 文件操作這么基礎的你都不自己寫, 你是放棄c的節奏? 你是學軟體的么, 不是的哈c就隨便糊弄了, 是的話你就草蛋了。。。
❼ c語言設定電梯程序
#include
void main()
{
int i,n,largeNum=0,smallNum=0,a[100];
scanf("%d%d",&n,&a[0]);
for(i=1;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>a[0]) largeNum++;
else if(a[i]<a[0]) smallNum++;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\nlargeNmu=%d,smallNum=%d",largeNum,smallNum);
}
❽ C語言實現電梯模擬(呼喚牛人)
我的QQ353841,你加我,註明C語言實現電梯模擬,我把遍好的直接發給你,但是你得給我15個Q幣~
同意的考慮下~
❾ 用C語言編寫一個關於電梯的程序
這是以前作的課程設計,是一個10層電梯的模擬,供樓主參考吧:
printf("上下選擇:1-上樓,2-下樓\t");
scanf("%d",&input_direction);
fflush(stdin);
printf("輸入該層的乘客想到達的樓層,以-1結束\n");
void check(liftor &myliftor) 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");