Untitled

mail@pastecode.io avatar
unknown
c_cpp
7 months ago
4.7 kB
7
Indexable
Never
#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>  // 包含排序函數
using namespace std;
/*
測資
P1
10
0
4
P2
2
1
1
P3
4
3
3
P4
1
4
2
P5
5
2
5

*/
int p_number=5;
class P {
private:
    string name;
    int arriveTime, CPUTime, priority,finishTime, waitTime, returnTime;
    bool check;
public:
    P() {
        arriveTime = 0;
        CPUTime = 0;
        name = "";
        priority = 0;
        finishTime = 0;
        waitTime = 0;
        returnTime = 0;
        check=0;
    }
    void setP(string a3, int a1, int a2, int a4) {
        arriveTime = a1;
        CPUTime = a2;
        name = a3;
        priority = a4;
        finishTime = 0;
        waitTime = 0;
        returnTime = 0;
    }
    void show(){
		cout<<"名稱:"<<name<<endl;
		cout<<"CPU時間:"<<CPUTime<<endl;
    	cout<<"到達時間:"<<arriveTime<<endl;
		cout<<"優先權:"<<priority<<endl;
		cout<<"已完成時間:"<<finishTime<<endl; 
		cout<<"等待時間:"<<waitTime<<endl;
		cout<<"回覆時間:"<<returnTime<<endl;
		cout<<endl;
	}
	string getname(){//回傳名稱 
		return name;
	}
	int getCPUTime(){//回傳CPU時間 
		return CPUTime;
	}
	void setCPUTime(int a){//設定CPU時間 
		CPUTime=a;
	}
	int getarriveTime(){//回傳到達時間 
		return arriveTime;
	}
	int getpriority(){//回傳優先權 
		return priority;
	}
	int getfinishTime(){//回傳已完成時間 
		return finishTime;
	}
	void setfinishTime(int a){//設定已完成時間 
		finishTime=a;
	}
    int getWaitTime() {//回傳等待時間
        return waitTime;
    }
    void setWaitTime(int a) {//回傳等待時間
        waitTime = a;
    }
    int getreturnTime() {//回傳回覆時間
        return returnTime;
    }
    void setreturnTime(int a) { //設定回覆時間
        returnTime = a;
    }
    bool getcheck() {//回傳是否完成 
        return check;
    }
    void setcheck(bool a) {//設定是否完成
        check = a;
    }
};
int priority(P p1,P p2,P p3,P p4,P p5){
	P p[p_number]={p1,p2,p3,p4,p5};
	int order[p_number]={};
	int ordernum=0,x=0,time=0;//time用到 
	for(int i=0;i<p_number;i++){//將所有P的優先權值塞進order陣列裡 
		order[i]=p[i].getpriority();
		time=time+p[i].getCPUTime();//將所有的CPU時間累加後放入時間 
	}
	string thread[time]={};//將所有時間上的名稱記錄下來 
	for(int i=0;i<time;i++){
		thread[time]="";
	}
	//time=22
	for(int i=0;i<time;i++){
		for(int j=0;j<p_number;j++){
			for(int k=0;k<p_number;k++){
				order[k]=0;
			}
			for(int k=0;k<p_number;k++){//求時間已經到的地方,且還沒做完的P的優先級 
				if(p[k].getcheck()==0&&i>=p[k].getarriveTime()){
					order[k]=p[k].getpriority();
//					cout<<p[k].getname()<<"  優先級 "<<p[k].getpriority()<<endl;
				}
			}
			if(*max_element(order,order+p_number)==p[j].getpriority()&&p[j].getcheck()==0){//取得最大優先權,且確認還沒做完的執行 
				p[j].setfinishTime(p[j].getfinishTime()+1);
				thread[time]=p[j].getname();//*******************************************************
//				cout<<thread[time]<<endl;
//				cout<<p[j].getname()<<"  finshtime:"<<p[j].getfinishTime()<<"  CPUTtime:"<<p[j].getCPUTime()<<endl;
			}
			if(p[j].getfinishTime()==p[j].getCPUTime()&&p[j].getcheck()==0){//cpu時間等於已執行時間,且尚未確認的(為了效能)更改確認為已完成 
				p[j].setcheck(1);
//				cout<<p[j].getname()<<"完成--------------------------------------"<<endl;
			}
		} 
		
	}
	
	
//	cout<<x<<endl;



	//計算回復時間、等待時間
	for(int i=0;i<time;i++){
		cout<<i<<"  "<<thread[i]<<"  -"<<endl;//******************************************************
	} 
	for(int i=0;i<p_number;i++){
//		p[i].show();
	}
	
}

int main() {
    P pp[p_number];
    //arriveTime到達時間
	//CPUTime需要執行時間
	//name名稱
	//waitTime等待時間
	//returnTime回覆時間 
	//priority優先權 
    for (int i = 0; i < p_number; i++) {
        int a1, a2, a4;
        string a3;
        cout << "請輸入第" << i + 1 << "個的名稱name:"; // 修正索引
        cin >> a3;
        cout << "請輸入第" << i + 1 << "個的CPU時間CPUTime:"; // 修正索引
        cin >> a2;
        cout << "請輸入第" << i + 1 << "個的到達時間arriveTime:"; // 修正索引
        cin >> a1;
        cout << "請輸入第" << i + 1 << "個的優先權priority:"; // 修正索引
        cin >> a4;
        pp[i].setP(a3, a1, a2, a4);
    }
//    for (int i = 0; i < p_number; i++) {
//    	pp[i].show();
//    }
//    fcfs(pp[0],pp[1],pp[2],pp[3],pp[4]);
//    sjf(pp[0],pp[1],pp[2],pp[3],pp[4]);
    priority(pp[0],pp[1],pp[2],pp[3],pp[4]);
//    rr(pp[0],pp[1],pp[2],pp[3],pp[4]);
    
    return 0;
}