#include <malloc.h>
#include <stdio.h>
typedef struct table
{
char name[10];//进程名
int id;//进程id
int atime;//到达时间
int stime;//开始时间
int runtime;//运行时间
int ftime;//完成时间
float total;//周转时间
float weight;//带权周转时间
int starttime;
int finishtime;
}PCB;
typedef struct _Node
{
struct _Node* next;
PCB pcb;
}node;
struct node* creat(int count)
{
node* head = malloc(sizeof(node));
head->next = NULL;
node* move = head;
for (int i = 0; i < count; i++)
{
node* fresh = malloc(sizeof(node));
fresh->next = NULL;
move->next = fresh;
printf("请输入第%d个进程的id、到达时间、运行时间:\n", i + 1);
scanf("%d%s%d%d", &fresh->pcb.id, fresh->pcb.name, &fresh->pcb.atime, &fresh->pcb.runtime);
move = fresh;
}
return head;
}
void fcfs(node* head) {
for (node* turn = head->next; turn->next != NULL; turn = turn->next)
{
for (node* move = head->next; move->next != NULL; move = move->next)
{
if (move->pcb.atime > move->next->pcb.atime)
{
PCB temp = move->pcb;
move->pcb = move->next->pcb;
move->next->pcb = temp;
}
}
}
}
void middle(node* head) {
for (node* turn = head->next; turn->next != NULL; turn = turn->next)
{
for (node* move = head->next; move->next != NULL; move = move->next)
{
if (move->pcb.atime == move->next->pcb.atime && move->pcb.runtime > move->next->pcb.runtime) {
PCB temp = move->pcb;
move->pcb = move->next->pcb;
move->next->pcb = temp;
}
}
}
}
void sjf(node* head) {
node* temp = head->next;
node* move = head->next->next;
temp->pcb.starttime = temp->pcb.atime;
temp->pcb.finishtime = temp->pcb.starttime + temp->pcb.runtime;
int num = temp->pcb.finishtime;
while (move->next != NULL) {
temp = temp->next;
move = move->next;
node* tap = move;
while (move != NULL) {
if (temp->pcb.atime <= num && move->pcb.atime <= num && temp->pcb.runtime > move->pcb.runtime) {
PCB map = temp->pcb;
temp->pcb = move->pcb;
move->pcb = map;
move = move->next;
}
else {
break;
}
}
if (temp->pcb.atime < num) {
num = num + temp->pcb.runtime;
}
else {
num = temp->pcb.atime + temp->pcb.runtime;
}
move = tap;
}
}
void running(node* head) {
node* move = head->next;
while (move != NULL) {
printf("%s程序正在运行.....\n", move->pcb.name);
move = move->next;
}
}
void s_f_t_w_time(node* head) {
node* move = head->next->next;
node* first = head->next;
first->pcb.total = first->pcb.runtime;
first->pcb.stime = first->pcb.atime;
first->pcb.ftime = first->pcb.stime + first->pcb.runtime;
first->pcb.weight = first->pcb.total / first->pcb.runtime;
printf("%d %4s %7d %11d %10d %10d %16f %10f\n", first->pcb.id, first->pcb.name, first->pcb.atime, first->pcb.runtime, first->pcb.stime, first->pcb.ftime, first->pcb.total, first->pcb.weight);
while (move != NULL) {
if (first->next->pcb.atime <= first->pcb.ftime) {
first->next->pcb.stime = first->pcb.ftime;
first->next->pcb.ftime = first->next->pcb.stime + first->next->pcb.runtime;
first->next->pcb.total = first->next->pcb.stime + first->next->pcb.runtime - first->next->pcb.atime;
first->next->pcb.weight = first->next->pcb.total / first->next->pcb.runtime;
}
else {
first->next->pcb.stime = first->next->pcb.atime;
first->next->pcb.ftime = first->next->pcb.stime + first->next->pcb.runtime;
first->next->pcb.total = first->next->pcb.stime + first->next->pcb.runtime - first->next->pcb.atime;
first->next->pcb.weight = first->next->pcb.total / first->next->pcb.runtime;
}
printf("%d %4s %7d %11d %10d %10d %16f %10f\n", first->next->pcb.id, first->next->pcb.name, first->next->pcb.atime, first->next->pcb.runtime, first->next->pcb.stime, first->next->pcb.ftime, first->next->pcb.total, first->next->pcb.weight);
first = first->next;
move = move->next;
}
}
int main(void) {
node* p;
printf("请输入进程数量:\n");
int count;
scanf("%d", &count);
p = creat(count);
fcfs(p);
middle(p);
sjf(p);
running(p);
printf(" id 进程名 到达时间 运行时间 开始时间 结束时间 周转时间 带权周转时间\n");
s_f_t_w_time(p);
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
暂无讨论,说说你的看法吧