#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct pcb
{
int processID; /*定义进程序号 */
char processName[10]; /*定义进程名 */
char processState; /*定义进程状态 */
float R; /*定义响应比 */
float serveTime; /*定义进程服务时间 */
float waitTime; /*定义等待时间 */
struct pcb * next;
};
void Input(struct pcb * head,struct pcb * prev,struct pcb * current);
void Output(struct pcb * head,struct pcb * current);
void Hrrn(struct pcb * head,struct pcb * current,struct pcb * p,struct pcb * q);
void Free(struct pcb * head,struct pcb * current);
int main(void)
{
struct pcb * head = NULL;
struct pcb * prev=NULL,* current=NULL,*p=NULL,*q=NULL;
Input(&(*head),&(*prev),&(*current));
Output(&(*head),&(*current));
Hrrn(&(*head),&(*current),&(*p),&(*q));
Free(&(*head),&(*current));
printf("程序执行完毕!\n按任意键退出...\n");
getchar();
return 0;
}
void Input(struct pcb * head,struct pcb * prev,struct pcb * current)
{
int i=0;
char input[10];
printf("请输入第%d个进程名:",i+1);
while (gets(input) != NULL && input[0] != '\0')
{
current = (struct pcb*)malloc(sizeof(struct pcb));
if(head == NULL)
head = current;
else
prev->next = current;
current->next = NULL;
strcpy(current->processName,input);
printf("请输入进程的服务时间:");
scanf("%f",¤t->serveTime);
if(0 == i)
{
current->processState = 'r';
}
else
{
current->processState = 'w';
}
current->processID = i;
current->R = 1;
current->waitTime = 0;
i++;
while(getchar() != '\n')
continue;
printf("\n请输入第%d个进程名: ",i+1);
prev = current;
}
}
void Output(struct pcb * head,struct pcb * current)
{
if(head == NULL)
printf("无进程信息\n");
else
{
printf("现有进程如下:\n");
printf("进程名 \t 进程状态\t响应比\t进程所需时间\t进程等待时间\n");
}
current = head;
while(current != NULL)
{
printf("%-10s%-14c%-8.2f%-16.2f%-10.2f\n",current->processName,current->processState,
current->R,current->serveTime,current->waitTime);
current = current->next;
}
}
void Hrrn(struct pcb * head,struct pcb * current,struct pcb * p,struct pcb * q)
{
float temp =0;
current = head;
p = current;
while(p->next != NULL)
{
for(current=head; current!=NULL; current=current->next)
{
if(current->processState == 'r')
{
printf("现在执行进程 %s\n",current->processName);
printf("该进程将执行 %.2f个时间片\n",current->serveTime);
current->processState = 'f';
for(q=head; q!=NULL; q=q->next)
{
if(q->processState == 'w')
{
q->waitTime += current->serveTime;
}
}
}
}
//计算响应比
for(current=head; current!=NULL; current=current->next)
{
if(current->processState == 'w')
{
current->R = (current->waitTime + current->serveTime)/current->serveTime;
}
}
//将响应比最高的进程状态改为 r
q = head;
for(current=head; current!=NULL; current=current->next)
{
if(current->processState != 'f')
{
if((current->R) > temp)
{
temp = current->R;
q = current;
}
}
}
q->processState = 'r';
temp =0;
printf("上一进程执行完后,余下进程的状态如下:\n");
printf("进程名 \t 进程状态\t响应比\t进程所需时间\t进程等待时间\n");
for(current=head; current!=NULL; current=current->next)
{
if(current->processState != 'f')
{
printf("%-10s%-14c%-8.2f%-16.2f%-10.2f%\n",current->processName,current->processState,
current->R,current->serveTime,current->waitTime);
}
}
p = p->next;
getchar();
}
}
void Free(struct pcb * head,struct pcb * current)
{
struct pcb * p;
current = head;
while(current != NULL)
{
p = current->next;
free(current);
current = p;
}
printf("程序执行完毕!\n按任意键退出...\n");
}