#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define n 20
typedef struct
{
char id[20]; //进程名
int atime; //进程到达时间
int runtime; //进程运行时间
char state; //进程状态
}pcb;
void main()
{
lp: int num,i,j,q,k=0,x=1,w=0;
char Num[n];
int time=1,flag=1;
char c;
int x1[n],ttime[n]; //ttime周转时间
float attime[n],timeaverage=0,qttime=0;
pcb f[n],t;
printf("请输入要创建的进程数目:\n");
scanf("%s",Num);
int i1=atoi(Num);
char temp[n];
itoa(i1,temp,10);
if (strcmp(Num,temp)!=0)
{
printf("输入有误,请重新输入!\n");
scanf("%s",Num);
}
num=atoi(Num);
printf("请输入进程名,进程到达时间,进程运行时间:\n");
// char *tempid[n];
for(i=0;i<num;i++)
{
scanf("%s%d%d",&f[i].id,&f[i].atime,&f[i].runtime);
// tempid[i]=f[i].id;
// for (j=0;j<i;j++)
// {
// for (q=1;q<i-j;q++)
// {
// if (strcmp(tempid[j],tempid[q])==0)
// {
// printf("进程名重复,请重新输入!\n");
// scanf("%s%d%d",&f[i].id,&f[i].atime,&f[i].runtime);
// }
// }
//
// }
}
// for (i=0;i<num;i++) //如果进程名重复则报错,程序不能继续运行
// {
// for (q=1;q<num-i;q++)
// {
// if (strcmp(f[i].id,f[q].id)==0)
// {
// printf("输入有误,进程名不能重复!\n");
// // flag=0;
// break;
// }
// }
// break;
// }
// if (flag) //进程名输入正确则开始
// {
for (i=0;i<num;i++)
{
x1[i]=0; //运行时间初始化为0
}
for (i=0;i<num;i++)
{
f[i].state='R'; //进程状态初始化为R
}
for (i=0;i<num;i++) //原始就绪进程按照到达时间排序(先来先服务)
{
for (q=0;q<num-i-1;q++)
{
if (f[q+1].atime<f[q].atime)
{
t=f[q];
f[q]=f[q+1];
f[q+1]=t;
}
}
}
printf("就绪队列为:\n");
for (i=0;i<num;i++)
{
printf("%s %d %d %c\n",f[i].id,f[i].atime,f[i].runtime,f[i].state);
}
printf("开始运行:(Enter键触发)\n");
fflush(stdin); //清除输入缓存
for (i=0;i<num;i++)
{
while (time<f[i].atime) //进程到达时间未到,则提示空闲
{
// getchar(); //控制人为输入,如果想让系统自动运行可将此行注释
printf("空闲中........\n");
time++;
}
for(j=0;j<f[i].runtime;j++)
{
if(x1[i]!=f[i].runtime) //如果运行时间未到 则打印正在运行的程序
{
// getchar(); //同上
x1[i]++;
printf("正在运行的进程:%s 已运行时间:%d 剩余时间:%d\n",f[i].id,x1[i],f[i].runtime-x1[i]);
}
if (x1[i]==f[i].runtime) //进程运行完则将进程状态转换为C,并计算该进程的周转时间
{
f[i].state='C';
ttime[w]=time-f[i].atime;
w++;
}
printf("就绪队列的进程:\n");
for (q=0;q<num;q++)
{
if(x1[q]==f[q].runtime) continue;//如果运行完则不用输出(跳出循环)
printf("%s %d %d %c\n",f[q].id,f[q].atime,f[q].runtime,f[q].state);
}
printf("\n");
time++;
}
}
for (i=0;i<num;i++) //计算带权周转时间
{
attime[i]=(float)((float)ttime[i]/(float)f[i].runtime);
}
printf("进程运行结束!\n");
for (i=0;i<num;i++) //输出执行完的进程信息
{
printf("%s %d %d %c\n",f[i].id,f[i].atime,f[i].runtime,f[i].state);
}
for (i=0;i<num;i++)
{
printf("%s的周转时间为:%-3d 系统开始服务时间:%d 带权周转时间为:%.4f\n",f[i].id,ttime[i],f[i].atime,attime[i]);
}
for (i=0;i<num;i++) //计算平均周转时间和带权平均周转时间
{
timeaverage+=(float)ttime[i];
qttime+=(float)attime[i];
}
timeaverage/=num;
qttime/=num;
printf("平均周转时间:%.3f 带权平均周转时间%.3f\n",timeaverage,qttime);
printf("本次模拟结束,是否继续:Y or N\n");
fflush(stdin);
c=getchar();
if (c=='Y'||c=='y')
{
goto lp;
}
else if (c=='N'||c=='n')
{
printf("模拟结束!\n");
}
//}
}