#include<stdio.h>
#include<stdlib.h>
#define MAXPROCESS 10 /*定义最大进程数量 */
struct pcb
{
char processID[10]; /*进程标识符 */
char processStatus; /*进程状态 */
int processNumber; /*进程编号 */
int timeArrive; /*进程到达时间 */
int timeService; /*进程服务时间 */
}process[MAXPROCESS];
int Input(void); /*申明输入函数 该函数接受用户输入的进程信息并返回进程的数量 */
void Show(int ); /*显示用户输入的进程信息 */
int main(void)
{
int count;
int time = 0;
int totalTime=0;
int i,j=0,m=0;
int shortestServe,shortestProNum;
int Num[MAXPROCESS];
char state = 'w';
/*输入进程信息 并将输入的进程信息显示出来 */
count = Input();
Show(count);
/*计算完成所有进程所需要的时间 */
for(i=0; i<count; i++)
{
totalTime += process[i].timeService;
}
/*
*****************************************************************************************************
最短进程优先算法
*****************************************************************************************************
*/
while(0 <= totalTime--)
{
/*找出当前时间段进入系统的进程 并将进程号放入Num数组中 */
for(i=0; i<count; i++)
{
if((process[i].timeArrive <= time)&&process[i].processStatus != 'f')
{
Num[j++] = process[i].processNumber;
}
}
/*检测当前时间点是否有进程在执行 若没有则找出下个将要执行的进程 将该进程状态改为r(run) */
for(m=0; m<j; m++)
{
if(process[Num[m]].processStatus == 'r')
{
state = 'r';
}
}
if(state != 'r')
{
shortestServe = 100;
shortestProNum = 100;
for(i=0; i<j; i++)
{
if(process[Num[i]].timeService < shortestServe)
{
shortestServe = process[Num[i]].timeService;
shortestProNum = process[Num[i]].processNumber;
}
}
/*将最短进程的运行状态改为 r(run) */
process[shortestProNum].processStatus = 'r';
printf("\n----------------------------------------------\n");
printf("现在执行进程%s 该进程状态变为r\n",process[shortestProNum].processID);
printf("----------------------------------------------\n");
}
/*
*************************************************************************************************
*每一个时间点显示一次 正在执行的进程信息 和 就绪队列的信息
*************************************************************************************************
*/
printf("********************************************************************************\n");
printf("已运行时间:%d \n",time++);
/*显示正在执行的进程的信息 */
for(i=0; i<j; i++)
{
if(process[Num[i]].processStatus == 'r')
{
printf("正在执行进程:%s\n",process[Num[i]].processID);
printf("\t该进程剩余服务时间为:%d\t程序状态为:%c\n",process[Num[i]].timeService,
process[Num[i]].processStatus);
process[Num[i]].timeService--;
if(process[Num[i]].timeService == 0)
{
process[Num[i]].processStatus = 'f';
state = 'w';
}
}
}
/*显示就绪队列中的进程信息 */
printf("\n--就绪队列中的进程--:\n");
for(i=0; i<j; i++)
{
if(process[Num[i]].processStatus == 'w')
{
printf("\t进程名:%s 服务时间:%d 程序状态:%c\n",process[Num[i]].processID,
process[Num[i]].timeService,process[Num[i]].processStatus);
}
}
j = 0;
getchar();
}
/*程序执行完毕 */
printf("********************************************************************************\n");
printf("所有进程执行完毕!\n");
printf("按任意键退出...\n");
getchar();
return 0;
}
/*输入函数 */
int Input(void)
{
int count;
int i;
/*输入进程的个数 */
printf("请输入进程数:(少于10个)\n");
scanf("%d",&count);
printf("\n********************************************************************************\n");
/*输入各进程的信息 */
if((count>0)&&(count<=10)) /*输入有效性验证 若输入的不是1~10之间的数则要求重新输入 */
{
for(i=0; i<count; i++)
{
printf("请输入第%d进程的进程名:",i+1);
scanf("%s",&process[i].processID);
printf("\n请输入第%d进程的到达时间:",i+1);
scanf("%d",&process[i].timeArrive);
printf("\n请输入第%d进程的服务时间:",i+1);
scanf("%d",&process[i].timeService);
process[i].processNumber = i;
process[i].processStatus = 'w';
//process[i].timeWait = 0;
printf("\n********************************************************************************\n");
}
return count;
}
else
{
printf("进程数输入无效!请重新输入!\n");
Input();
}
}
/*输出函数 */
void Show(int count)
{
int i;
printf("现有进程状态为:\n");
printf("进程编号\t进程名\t进程到达时间\t进程服务时间\t进程状态\n");
for(i=0; i<count; i++)
{
printf("%-16d%-8s%-16d%-16d%c\n",i+1,process[i].processID,process[i].timeArrive,
process[i].timeService,process[i].processStatus);
}
getchar();
}