回复 19楼 azzbcc
对哈,那难道是小于等于?
2013-04-10 23:05
2013-04-10 23:08
2013-04-10 23:16

2013-04-10 23:22
2013-04-10 23:24
2013-04-10 23:49
2013-04-11 04:37
2013-04-11 06:03
程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Data
{
char name[10];
// int prio; 没用到、、、
int round;
int cputime;
int needtime;
int gettime;
// int count;
char state; //添加了一个未到达的状态:'N'
}Data;
typedef struct Node
{
int data[100];
int front, rear;
}QueueLink;
int N, need; //N为进程总数, need为时间片
int Time = 0; //一共要用的时间
Data all[10];
QueueLink run;
/*
把所有的进程存入all数组,按到达时间排序
队列中存入的是该进程在all数组中对应的下标
再依据时间推进,将已到达的进程入队列,再将未执行完的进程入队列
另外round和cputime分别指什么?他们的值完全一样,或许我理解错了吧
*/
int cmp(const void *a, const void *b)
{
Data *m = (Data *)a;
Data *n = (Data *)b;
return m->gettime - n->gettime;
}
void Output(int time)
{
int i;
getchar();
if (time >= 0) printf("\n当前时间为:%dms\n", time);
puts("进程名 到达的时间 占用cpu时间 到完成还要得时间 轮转时间片 状态");
for (i = 0;i < N;++i)
{
printf(" %s %d %d %d %d %c\n",
all[i].name, all[i].gettime, all[i].cputime, all[i].needtime, all[i].round, all[i].state);
}
printf("\n");
}
void init()
{
int i;
memset(all, 0, sizeof(all));
printf("输入进程的个数:");
scanf("%d", &N);
for (i = 0;i < N;++i)
{
puts("输入进程名,到达时间及其需要运行的时间:");
scanf("%s%d%d", all[i].name, &all[i].gettime, &all[i].needtime);
Time += all[i].needtime;
all[i].state = 'N';
}
qsort(all, N, sizeof(Data), cmp);
Output(-1);
printf("请输入时间片长度:");
scanf("%d", &need);
printf("输入时间片长度为: %d\n", need);
}
void DeQueue(int *a)
{ //出队列
*a = run.data[run.front++];
}
void EnQueue(int a)
{ //入队列
run.data[run.rear++] = a;
}
void fun()
{
int i, time = 0, now = 0;
while (time < Time)
{
//将未执行进程入队列
for (i = 0;i < N;++i)
{
if (all[i].gettime <= time && all[i].state == 'N')
{
EnQueue(i);
all[i].state = 'W';
}
}
//将未完成的进程入队列
for (i = 0;i < run.front;++i)
{
if (all[i].state != 'F')
{
EnQueue(run.data[i]);
}
}
//出队列
DeQueue(&now);
if (all[now].state == 'F')
{ //已经完成进程
continue;
}
all[now].state = 'R'; //将当前设定为运行态
Output(time);
if (all[now].needtime > need)
{
all[now].needtime -= need;
all[now].round += need;
all[now].cputime += need;
all[now].state = 'W';
time += need;
}
else
{
time += all[now].needtime;
all[now].round += all[now].needtime;
all[now].cputime += all[now].needtime;
all[now].needtime = 0;
all[now].state = 'F';
}
}
Output(time);
}
int main( void )
{
init();
fun();
return 0;
}

2013-04-11 06:04
2013-04-11 06:16