❶ 操作系統模擬電梯調度演算法c語言程序
這是數學建模的題目,太難了。
只能給點提示,希望有用。一,用到隨機函數。二,調度演算法為FIFO和電梯調度。參考操作系統。三,文件io用到#include
<fstream>頭文件
❷ c語言電梯調度
為什麼沒人來回答呢??
❸ C語言一道編程題,關於電梯調度運行的。
這個問題主要還是一個物理題,相信都坐電梯,但沒有仔細研究,它的運行過程就是一個需求:
1、按下X樓層,並記錄按下的時間順序;1.1、當前電梯不在此樓層;1.2、電梯在此樓層;
2、若電梯不在此樓層,先運行至此樓層開門,否則直接開門,消除請求信息;
3、電梯先加速,再勻速,再減速至X樓層;
4、如果去X樓層的途中,遇到有同向的樓層按下,則先停靠在該樓層,然後再進行步驟3;
5、運行至X樓層後,消除當前請求X樓層信息,如果有其他樓層已經按下,則轉到最先按下的樓層的方向(中途有其他的請求,順便帶上),如果沒有請求,則停止在X樓,等待!
6、兩部電梯的話,主要考慮哪個有空閑,只要空閑就優先執行重復以上1~5步驟。
數據結構的話主要有:電梯當前所在樓層,目標樓層X,中途請求系列,是否已完成;
問題是屬於比較復雜的那種,還是要自己多思考思考怎麼寫文檔才是,越詳細越好,想清楚了,實現應該是比較簡單的!
❹ 20分!求助大神,幫忙編個小程序。。。電梯調度演算法模擬(用c語言編寫)
沒那麼簡單
❺ 求C++版電梯調度演算法源程序
http://www.pudn.com/downloads119/sourcecode/os/detail508607.html
❻ 有c語言模擬調度演算法嗎
/*本c程序為按優先數的進程調度*/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct pcb)
struct pcb
{ int pid;
struct pcb *next;
int time;
int priority;
char status;
};
int n,m;
struct pcb *head,*runpcb;
main()
{ struct pcb *pcbi;
char str;
struct pcb *cshlist();
void insertproc(struct pcb *insproc);
void pintlist(struct pcb *L);
void execproc();
void delproc();
m=0;
head=cshlist();
printf("first linelist is:\n");
pintlist(head);
while(head!=NULL)
{ scanf("%c",&str);
runpcb=head;
head=runpcb->next;
runpcb->status='Z';
printf("output linelist is:\n");
printf("%d\n",m);
printf("%2d %5d %5d %3c\n",runpcb->pid,runpcb->time,runpcb->priority,runpcb->status);
pintlist(head);
printf("\n");
printf("\n");
execproc();
m=m+1;
if(runpcb->time==0)
delproc();
else insertproc(runpcb);
}
}
void pintlist(struct pcb *L)
{
struct pcb *p;
int i;
p=L;
if(L!=NULL)
do
{ printf("%2d %5d %5d %3c\n",p->pid,p->time,p->priority,p->status);
p=p->next;
}while (p!=NULL);
}
struct pcb *cshlist()
{
struct pcb *ql;
n=0;
ql=(struct pcb *)malloc(LEN);
ql->pid=n+1;
ql->status='R';
printf("enter time and priority:\n");
scanf("%ld,%d",&ql->time,&ql->priority);
head=NULL;
while(ql->time!=0)
{
n=n+1;
insertproc(ql);
ql=(struct pcb *)malloc(LEN);
printf("enter timeand priority:\n");
ql->pid=n+1;
ql->status='R';
}
return(head);
}
void insertproc(struct pcb *insproc)
{
struct pcb *p0,*p1,*p2;
int pri;
p1=head;
p0=insproc;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
pri=p0->priority;
if(p1->priority<=pri)
{
p0->next=head;
head=insproc;
}
else
{
while((p1->next!=NULL)&&(p1->priority>pri))
{ p2=p1;
p1=p1->next;
}
if((p1->next!=NULL)||(p1->priority<=pri))
{
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
}
}
void execproc()
{
runpcb->time=runpcb->time-1;
runpcb->priority=runpcb->priority-1;
}
void delproc()
{
struct pcb *p;
p=runpcb;
p->status='E';
printf("process P");
printf("%d",p->pid);
printf(" is finish\n");
printf("\n");
free(runpcb);
}
優先數調度演算法方面和時間片輪轉調度演算法(再給你個c++的)
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
int n;
class PCB
{
public:
int pri;//進程優先數
int runtime;//進程運行CPU時間
int pieceOftime;//輪轉時間片
string procname;//進程名
string state;//進程狀態
int needOftime;//還需要時間
int Counter;
PCB * next;
};
PCB * run = NULL;
PCB * ready = NULL;
PCB * finish = NULL;
PCB * tial = ready;
void Dtime(int t);
void Prinft(int a)
{
if(a==1)
{
cout<<"進程名稱"<<"\t"<<"優先數"<<"\t"<<"還需要時間"<<"\ t"<<"已運行時間"<<"\t"<<"狀態:"<<endl;
}
else
cout<<"進程名稱"<<"\t"<<"已運行時間"<<"\t"<<"還需要時間"<< "\t"<<"計數器"<<"\t"<<"時間片"<<"\t"<<"狀態"<<endl;
}
void Prinft(int b,PCB * p)
{
if(b==1)
{
cout<<p->procname<<"\t\t"<<p->pri<<"\t"<<p->needOftime<<"\t\t"<<p->runtime<<"\t\t"<<p->state<<endl;
}
else
cout<<p->procname<<"\t\t"<<p->runtime<<"\t\t"<<p->needOftime<<"\t\t"<<p->Counter<<"\t"<<p->pieceOftime<<"\t"<<p->state<<endl;
}
void display(int c)
{
PCB *p;
if(run!=NULL) /*如果運行指針不空*/
Prinft(c,run); /*輸出當前正在運行的PCB*/
//Dtime(2);
p=ready; /*輸出就緒隊列PCB*/
while(p!=NULL)
{
Prinft(c,p);
p=p->next;
}
//Dtime(2);
p=finish; /*輸出完成隊列的PCB*/
while(p!=NULL)
{
Prinft(c,p);
p=p->next;
}
}
void insert(PCB *p)//插入就緒隊列按Pri大小
{
PCB *S1,*S2;
if(ready==NULL)
{
p->next = NULL;
ready = p;
}
else
{
S1 = ready;
S2 = S1;
while(S1!=NULL)
{
if(S1->pri >= p->pri)
{
S2 = S1;
S1 = S1->next;
}
else
break;
}
if(S2->pri >= p->pri)
{
S2->next = p;
p->next = S1;
}
else
{
p->next = ready;
ready = p;
}
}
}
bool CTProcessOfPri()
{
PCB * Node;
cout <<"輸入創建進程的數目:"<<endl;
cin >>n;
for(int j = 0;j < n; j++)
{
Node = new PCB;
if(Node==NULL)
return false;
else
{
cout <<"輸入進程的名稱,進程需CPU時間:"<<endl;
cin >>Node->procname>>Node->needOftime;
Node->runtime = 0;
Node->state ="就緒";
Node->pri =Node->needOftime;
cout <<"進程"<<Node->procname<<"創建完畢!"<<endl;
}
insert(Node);
}
return true;
}
void priority(int i)
{
run = ready;
ready = ready->next;
run->state = "運行";
Prinft(i);
while(run!=NULL) /*當運行隊列不空時,有進程正在運行*/
{
run->runtime=run->runtime+1;
run->needOftime=run->needOftime-1;
run->pri=run->pri-1; /*每運行一次優先數降低1個單位*/
if(run->needOftime==0) /*如所需時間為0將其插入完成隊列*/
{
run->state = "完成";
run->next = finish;
finish = run;
run=NULL; /*運行隊列頭指針為空*/
if(ready!=NULL) /*如就緒隊列不空*/
{
run = ready;
run->state = "運行";
ready = ready->next;
}
}
else if((ready!=NULL)&&(run->pri<ready->pri))
{
run->state="就緒";
insert(run);
run = ready;
run->state = "運行";
ready = ready->next;
}
display(i); /*輸出進程PCB信息*/
}
}
void queue(PCB *p)
{
if(ready==NULL)
{
p->next = NULL;
ready = p;
tial = p;
}
else
{
tial->next = p;
tial = p;
p->next = NULL;
}
}
bool CTProcessOfRuntime()
{
PCB * Node;
int m;
cout <<"輸入創建進程的數目:"<<endl;
cin >>n;
cout <<"輸入時間片:"<<endl;
cin >>m;
for(int j = 0;j < n; j++)
{
Node = new PCB;
if(Node==NULL)
return false;
else
{
cout <<"輸入進程的名稱,進程需CPU時間:"<<endl;
cin >>Node->procname>>Node->needOftime;
Node->runtime = 0;
Node->state ="就緒";
Node->Counter = 0;
Node->pieceOftime = m;
cout <<"進程"<<Node->procname<<"創建完畢!"<<endl;
}
queue(Node);
}
return true;
}
void Runtime(int c)
{
run = ready;
ready = ready->next;
run->state = "運行";
Prinft(c);
while(run!=NULL)
{
run->runtime=run->runtime+1;
run->needOftime=run->needOftime-1;
run->Counter = run->Counter + 1;
if(run->needOftime==0)
{
run->state = "完成";
run->next = finish;
finish = run;
run = NULL;
if(ready!=NULL)
{
run = ready;
ready = ready->next;
}
}
else if(run->Counter == run->pieceOftime)
{
run->Counter = 0;
run->state = "就緒";
queue(run);
run=NULL;
if(ready!=NULL)
{
run = ready;
run->state = "運行";
ready = ready->next;
}
}
display(c);
}
}
int main()
{
int i;
cout <<"*******************************************"<<endl;
cout <<"* 1 優先數調度演算法 2 循環時間片輪轉演算法*"<<endl;
cout <<"*************** 0 退出 *******************"<<endl;
cin >>i;
switch(i)
{
case 1:
CTProcessOfPri();
priority(i);
break;
case 2:
CTProcessOfRuntime();
Runtime(i);
break;
default:
break;
}
return 0;
{
time(& current_time);
}while((current_time-start_time)<t);
}
}
void Dtime(int t)
{
time_t current_time;
time_t start_time;
time(&start_time);
do
❼ 求電梯控制c語言程序
原地址帶圖片 : http://www.elevator.salebinfo.com/bbs/Dispbbs.asp?ID=253743 1 前言 電梯的電氣系統由拖動系統和控制系統兩部分組成。傳統的電氣控制系統採用的繼電器邏輯控制由於觸點多、故障率高、可靠性差、體積大等缺點,正逐漸被淘汰。目前電梯設計使用可編程式控制制器(PLC),要求功能變化靈活,編程簡單,故障少,噪音低。維修保養方便,節能省工,抗干擾能力強,控制箱佔地面積少。當乘員進入電梯,按下樓層按鈕,電梯門自動關閉後.控制系統進行下列運作:根據轎廂所處位置及乘員所處層數.判定轎廂運行方向,保證轎廂平層時減速。將轎廂停在選定的樓層上;同時,根據樓層的呼叫,順路停車,自動開關門。另外在轎廂內外均要有信號燈顯示電梯運行方向及樓層數。 MCGS(Monitor and Control Generated System,通用監控系統)是一套用於快速構造和生成計算機監控系統的組態軟體,能夠在Windows平台上運行。通過對現場數據的採集處理。以動畫顯示、報警處理、流程式控制制、實時曲線、歷史曲線和報表輸出等多種方式。向用戶提供解決實際工程問題的方案。充分利用windows圖形功能完備、界面一致性好、易學易用的特點。比以往使用專用機開發的工業控制系統更具通用性.在自動化領域有著更廣泛的應用。本文利用MCGS組態軟體檢驗電梯PLC控制系統的運行情況。 2 電梯PLC控制系統 S7-200可編程式控制制器是德國西門子公司研製的一種新型可編程式控制制器。它工作可靠,功能強,存儲容量大,編程方便,輸出端可直接驅動2A的繼電器或接觸器的線圈,抗干擾能力強。因此,能夠滿足電梯對電氣控制系統的要求。S7-200系列小型PLC(Micro PLC)可應用於各種自動化系統。緊湊的結構。低廉的成本12.b~功能強大的指令集使得S7-200 PLC成為各種小型控制任務理想的解決方案。利用西門子S7-200可編程序控制器編寫一個四層電梯的控制系統。分別完成轎內指令、廳外召喚指令、樓層位置指示、平層換速控制、開門控制等控制任務。 STEP 7-Micro/WIN 32是S7-200系列的PLC的編程軟體.可以對S7-200的所有功能進行編程。該軟體在WindOW8平台上運行。基本操作與omce等標准WindOWS軟體相類似,簡單、易學。其基本功能是協助用戶完成應用軟體任務。例如創建用戶程序、修改和編輯過程中編輯器具有簡單語法檢查功能。還可以直接用軟體設置PLC的工作方式、參數和運行監控。 2.1 電氣控制系統 圖l為本系統的組成框圖。 圖中。輸出為:l、電動機;2、上下行接觸器;3、快慢速接觸器;4、位置指示;5、門鎖。輸入為:6、轎內指令;7、廳外指令;8、門區感應;9、手動開關門;10、樓層感應。 2.2 PLC系統部分 完成所設定的控制任務所需要的PLC規模主要取決於控制系統對輸入,{禽出點的需求量和控制過程的難易程度。 (1)I/O點的估算: 系統的輸入點有:門廳召喚按鈕6個輸入點;轎內指令按鈕4個點;樓層感應器4個點;門區感應l點;手動開門l點:共計輸入點16點。而輸出點有:快慢速接觸器2點;上下行接觸器2點;樓層指示燈4點;門鎖1個點;共計輸出點9點。總計I/O點數為16/9; (2)可編程式控制制器S7-200的CPU226輸入,輸出點數為24/16。足以滿足要求。 3 電梯PLC控制系統設計 因篇幅有限。僅將電梯指示及上下行程序列出說明。 3.1樓層狀態指示設計 當電梯運行至某層有指令發出時.指示位置及指令。以二層為例: 3.2電梯下行程序設計 以電梯在三層下行情況為例。當電梯的一或二層有指令時,將三層下行位置1,同時無上行,驅動電梯下行。程序說明如下: 3.3電梯上行程序設計 以電梯在二層上行情況為例。程序說明如下: 3.4電梯到達時程序設計 電梯到達某層時。將已完成的指令信號復位。以電梯到達三層為例。程序ig明如下: 4 組態軟體模擬電梯PLC控制系統顯示設計 MCGsm態軟體具有全中文、面向窗口的可視化操作界面。實時性強,有良好的並行處理性能和豐富生動的多媒體畫面。MCGSm態軟體的開放式結構擁有廣泛的數據獲取和強大的數據處理功能。同時。提供良好的安全機制,為多個不同級別用戶設定不同的操作許可權。MCGS組態軟體支持多種硬體設備,實現"設備無關",用戶不必因外部設備的局部改動,而影響整個系統。MCGS組態軟體由"MCGS組態環境"和"MCGS運行環境"兩個系統組成。兩部分互相獨立。又緊密相關。 本文利用MCGS組態軟體設計。在設備組態窗口中選擇適當的串口通訊設備.添加西門子S7-200PLC。正確設置其屬性。正確設置組態軟體中數據變數設備通道的連接,即可實現PLC與組態軟體的通訊。將PLC中的串口驅動程序與組態軟體的需求響應相結合,使電腦對PLC發出的信號有響應。在MCGS組態軟體的用戶窗口中,製作一個動畫界面。在界面上設置各個控制項的屬性,使設置的控制項按照真實的情況動作,檢驗和測試電梯PLC控制系統對電梯的運行狀態的控制效果。MCGS用主控窗口、設備窗口和用戶窗口來構成一個應用系統的人機交互圖形界面.組態配置各種不同類型和功能的對象或構構。可以對實時數據進行可視化處理。組態過程如圖2所示: 5 結語 針對這個四層電梯的控制系統.本文採用西門子S7-200可編程式控制制器設-H-電梯的控制系統完成電梯的轎內指令、廳外召喚指令、樓層位置指示、平層換速控制、開門控制等控制任務。利用MCGS組態軟減設計模擬電梯PLC控制系統的運行。將PLC中的串口驅動程序與組態軟體的需求響應相結合,載入驅動。使設置的控制項能夠按照真實的情況動作。檢驗和測試電梯PLC控制系統對電梯的運行狀態的控制效果。實踐證明。將PLC可編程式控制制器和MCGS組態軟體結合可以非常好地模擬電梯控制系統的測試運行.有利於PLC控制系統的設-H-、檢測,具有良好的應用價值。
❽ 用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");
❾ 操作系統模擬電梯調度演算法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再經過一個時間片,完成了任務。於是整個調度過程結束。