#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 100
typedef struct pcb
{
char name[Max]; //進程名
int priority; //優先級
int arrtime; //到達時間
int needtime; //需要運行時間
int usedtime; //已用時間
char state; //進程狀態
}PCB;
PCB pcb[Max];
int n=1;
int pTime;
char SelectMenu();
void Input();
void Sort();
void Print();
void Attemper();
char SelectMenu()
{
char select;
printf("功能菜單:");
printf("\n 1.增加並調度進程");
printf("\n 2.打印進程");
printf("\n 3.退出");
printf("\n請輸入你的選擇(1--3):");
do{
select=getchar();
}while(select!='1'&&select!='2'&&select!='3');
return select;
}
void main()
{
int choice;
n=1;
printf(" \n");
printf("\t\t歡迎使用進程調度模擬\n\n");
choice=SelectMenu();
do{
if(choice=='1')
{
printf("\n");
printf("請設置時間片的大小:");
scanf("%d",&pTime);
Input();
Print();
Attemper();
}
if(choice=='2')
{
Print();
}
if(choice=='3')
{
return;
}
choice=SelectMenu();
}while(1);
}
void Input()
{
printf("輸入要創建進程的數目:\n");
int m;
scanf("%d",&m);
do{
printf("\n---請輸入第%d個進程進程---\n",n);
printf("\n進程名:");
scanf("%s",pcb[n].name);
printf("進程優先級:");
scanf("%d",&pcb[n].priority);
printf("進程需要的時間:");
scanf("%d",&pcb[n].needtime);
pcb[n].arrtime=n;
pcb[n].usedtime=0;
pcb[n].state='W';
n++;
}while(n<=m);
}
void Sort()
{
int i,j;
PCB temp;
for(i=0;i<n-1;i++) //按照到達時間排序
{
for(j=n-2;j>=i;j--)
{
if(pcb[j+1].arrtime<pcb[j].arrtime)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
for(i=0;i<n-1;i++) //按照優先級排序
{
for(j=n-2;j>=i;j--)
{
if(pcb[j+1].priority>pcb[j].priority)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
if(pcb[0].state!='F')
{
pcb[0].state='R';
}
}
void Print()
{
int i;
Sort();
printf("\n 進程名 優先級 到達時間 需要時間 已用時間 進程狀態 \n");
for(i=0;i<n;i++)
{
printf("%8s%8d %8d %10d %10d %10c\n",pcb[i].name,pcb[i].priority,pcb[i].arrtime,pcb[i].needtime,pcb[i].usedtime,pcb[i].state);
}
}
void Attemper()
{
do{
if((pcb[0].needtime-pcb[0].usedtime)>pTime) //判斷進程剩餘的運行時間是否大於時間片
{
pcb[0].usedtime+=pTime;
pcb[0].priority--;
pcb[0].state='W';
}
else //已完成的進程
{
pcb[0].usedtime=pcb[0].needtime;
pcb[0].priority=-1;
pcb[0].state='F';
}
Print();
}while(pcb[0].state!='F');
}