| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 690 人关注过本帖
标题:求助 轮转法 ...急...
只看楼主 加入收藏
gbartonlee
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-10-14
收藏
 问题点数:0 回复次数:1 
求助 轮转法 ...急...

一是数组写的
二是链表写的

恳请帮我再如下程序 (一)中加入轮转法, 参照程序二,再看看能不能实现二中的 时间减少 变化
在V C++下编译 程序二见附件


一.
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#include "time.h"
struct pcb /*创建进程控制块*/
{ int pid; /*标志数*/
char name[10]; /*进程名*/
int pro; /*优先数*/
int time; /*时间*/
char state;

};

struct pcb jiuxu[20]; /*就绪队列数组*/

struct pcb zusai[20]; /*阻塞队列数组*/

struct pcb cpu; /*运行队列进程*/

int shumu1=0,shumu2=0,num=0;

void create() /*新建进程*/
{ char c1,c2;
c1=82;
c2=87;
if(num==0)
{
printf("\n这是你第一次输入进程信息,它将直接调入CPU运行");
printf("\n请输入新进程名:\n");
scanf("%s",&cpu.name);
printf("请输入时间(0-1000s):\n");
scanf("%d",&cpu.time);
num++;
cpu.pid=num;
cpu.state=c1;
srand((unsigned)time(0));
cpu.pro=rand()%101; /*随机产生优先数*/
}
else
{
printf("\n请输入新进程名:\n");
scanf("%s",&jiuxu[shumu1].name);
printf("请输入时间(0-1000s):\n");
scanf("%d",&jiuxu[shumu1].time);
num++;
jiuxu[shumu1].state=c2;
jiuxu[shumu1].pid=num;
srand((unsigned)time(0));
jiuxu[shumu1].pro=rand()%101;
shumu1++;
}
}

void run() /*查看运行进程*/
{
printf("\n现在正在运行的进程的资料如下:\n");
printf("标志数 进程名 优先数 剩余时间 状态\n");
printf("%d%15s%12d%13d%13c\n",cpu.pid,cpu.name,cpu.pro,cpu.time,cpu.state);
}

void xianshij() /*查看就绪进程队列*/
{
int i;
printf("\n就绪的进程资料如下:\n") ;
printf("标志数 进程名 优先数 剩余时间 状态\n");
for (i=0;i<shumu1;i++)
printf("%d%15s%12d%13d%13c\n",jiuxu[i].pid,jiuxu[i].name,jiuxu[i].pro,jiuxu[i].time,jiuxu[i].state);
}

void xianshiz() /*查看阻塞进程队列*/
{ int i;
printf("\n阻塞的进程资料如下:\n") ;
printf("标志数 进程名 优先数 剩余时间 状态\n");
for (i=0;i<shumu2;i++)
printf("%d%15s%12d%13d%13c\n",zusai[i].pid,zusai[i].name,zusai[i].pro,zusai[i].time,zusai[i].state);
}


void diaodu1() /*将就绪进程按优先级调入cpu*/
{
int i,p;
p=jiuxu[0].pro;
for(i=0;i<shumu1;i++)
{
if(p>jiuxu[i].pro)
{
p=jiuxu[i].pro;
}
}
for(i=0;i<20;i++)
{
if(p==jiuxu[i].pro)
{ strcpy(cpu.name,jiuxu[i].name);
cpu.pid=jiuxu[i].pid;
cpu.pro=jiuxu[i].pro;
cpu.time=jiuxu[i].time;
break;
}
else continue;
}
for(i;i<shumu1-1;i++)
{
strcpy(jiuxu[i].name,jiuxu[i+1].name);
jiuxu[i].pid=jiuxu[i+1].pid;
jiuxu[i].pro=jiuxu[i+1].pro;
jiuxu[i].time=jiuxu[i+1].time;
}
shumu1--;

}

void diaodu2() /*将就绪进程按先入先出调入cpu*/
{ int i;
strcpy(cpu.name,jiuxu[0].name);
cpu.pid=jiuxu[0].pid;
cpu.pro=jiuxu[0].pro;
for(i=0;i<shumu1;i++)
{ strcpy(jiuxu[i].name,jiuxu[i+1].name);
jiuxu[i].pid=jiuxu[i+1].pid;
jiuxu[i].pro=jiuxu[i+1].pro;
jiuxu[i].time=jiuxu[i+1].time;
}
shumu1--;

}


void block() /*阻塞进程*/
{char b,c3=66;
zusai[shumu2].state=c3;
zusai[shumu2].pid=cpu.pid;
strcpy(zusai[shumu2].name,cpu.name);
zusai[shumu2].pro=cpu.pro;
zusai[shumu2].time=cpu.time;
shumu2++;
printf("\n现在cpu为空闲状态\n");
printf("1.将就绪进程按优先级调入cpu\n");
printf("2.将就绪进程按先入先出调入cpu\n");
printf("请选择;\n");
b=getche();
switch(b)
{
case '1': diaodu1();break;
case '2': diaodu2();break;
default:break;
}

}


void wakeup()
{
int i,p;
printf("\n请输入想要唤醒的进程的标志数:\n在以下中选:");
xianshiz();
scanf("%d",&p);
for(i=0;i<shumu2;i++)
{
if(p==zusai[i].pid)
{
strcpy(jiuxu[shumu1].name,zusai[i].name);
jiuxu[shumu1].pid=zusai[i].pid;
jiuxu[shumu1].pro=zusai[i].pro;
jiuxu[shumu1].time=zusai[i].time;
break;
}
else continue;
}
shumu1++;
for(i;i<shumu2;i++)
{
strcpy(zusai[i].name,zusai[i+1].name);
zusai[i].pid=zusai[i+1].pid;
zusai[i].pro=zusai[i+1].pro;
zusai[i].time=zusai[i+1].time;
}
shumu2--;
}


void delrun() /*撤消正在运行的进程*/
{char b;
printf("\n进程已撤消,现在cpu为空闲状态,请选择\n");
printf("1.将就绪进程按优先级调入cpu\n");
printf("2.将就绪进程按先入先出调入cpu\n");
b=getche();
switch(b)
{
case '1': diaodu1();break;
case '2': diaodu2();break;
default:break;
}

}

void delready()
{int i,d;
xianshij();
printf("\n请输入要撤消的进程的标志数:\n:");
scanf("%d",&d);
for(i=0;i<shumu1;i++)
{
if(d==jiuxu[i].pid)
{
for(i=0;i<shumu1;i++)
{
strcpy(jiuxu[i].name,jiuxu[i+1].name);
jiuxu[i].pid=jiuxu[i+1].pid;
jiuxu[i].pro=jiuxu[i+1].pro;
jiuxu[i].time=jiuxu[i+1].time;
}
shumu1--;
break;
}
else continue;
}
}


void delblock()
{int i,d;
xianshiz();
printf("\n请输入要撤消的进程的标志数:\n");
scanf("%d",&d);
for(i=0;i<shumu2;i++)
{
if(d==zusai[i].pid)
{
for(i=0;i<shumu2;i++)
{
strcpy(zusai[i].name,zusai[i+1].name);
zusai[i].pid=zusai[i+1].pid;
zusai[i].pro=zusai[i+1].pro;
zusai[i].time=zusai[i+1].time;
}
shumu2--;
break;
}
else continue;
}
}


void destroy() /*撤消进程*/
{ char c;
printf("选择撤消哪种状态的进程\n");
printf("1.正在运行的进程\n");
printf("2.就绪的进程\n");
printf("3.阻塞的进程\n");
c=getche();
switch(c)
{
case '1': delrun();break;
case '2': delready();break;
case '3': delblock();break;
default:break;
}
}


void diaodu3() /*将就绪进程按优先级调度*/
{ char m[10];
int i,p,n,t,s;
p=jiuxu[0].pro;
for(i=0;i<shumu1;i++)
{
if(p>jiuxu[i].pro)
{
p=jiuxu[i].pro;
}
}
for(i=0;i<20;i++)
{
if(p==jiuxu[i].pro)
{ strcpy(m,cpu.name);
strcpy(cpu.name,jiuxu[i].name);
n=cpu.pid;
cpu.pid=jiuxu[i].pid;
t=cpu.pro;
cpu.pro=jiuxu[i].pro;
s=cpu.time;
cpu.time=jiuxu[i].time;
break;
}
else continue;
}
for(i;i<shumu1-1;i++)
{
strcpy(jiuxu[i].name,jiuxu[i+1].name);
jiuxu[i].pid=jiuxu[i+1].pid;
jiuxu[i].pro=jiuxu[i+1].pro;
jiuxu[i].time=jiuxu[i+1].time;
}
strcpy(jiuxu[i].name,m);
jiuxu[i].pid=n;
jiuxu[i].pro=t;
jiuxu[i].time=s;
printf("进程运行状况如下:\n");
printf("标志数 进程名 优先数 剩余时间 状态\n");
printf("%d%15s%12d%13d%13c\n",cpu.pid,cpu.name,cpu.pro,cpu.time,cpu.state);
for (i=0;i<shumu1;i++)
printf("%d%15s%12d%13d%13c\n",jiuxu[i].pid,jiuxu[i].name,jiuxu[i].pro,jiuxu[i].time,jiuxu[i].state);
for (i=0;i<shumu2;i++)
printf("%d%15s%12d%13d%13c\n",zusai[i].pid,zusai[i].name,zusai[i].pro,zusai[i].time,zusai[i].state);
getch();


}

void diaodu4() /*将就绪进程按先入先出调度*/
{ char m[10];
int i,n,t,s;
strcpy(m,cpu.name);
strcpy(cpu.name,jiuxu[0].name);
n=cpu.pid;
cpu.pid=jiuxu[0].pid;
t=cpu.pro;
cpu.pro=jiuxu[0].pro;
s=cpu.time;
cpu.time=jiuxu[0].time;

for(i=0;i<shumu1;i++)
{ strcpy(jiuxu[i].name,jiuxu[i+1].name);
jiuxu[i].pid=jiuxu[i+1].pid;
jiuxu[i].pro=jiuxu[i+1].pro;
jiuxu[i].time=jiuxu[i+1].time;
}
strcpy(jiuxu[shumu1-1].name,m);
jiuxu[shumu1-1].pid=n;
jiuxu[shumu1-1].pro=t;
jiuxu[shumu1-1].time=s;
printf("进程运行状况如下:\n");
printf("标志数 进程名 优先数 剩余时间 状态\n");
printf("%d%15s%12d%13d%13c\n",cpu.pid,cpu.name,cpu.pro,cpu.time,cpu.state);
for (i=0;i<shumu1;i++)
printf("%d%15s%12d%13d%13c\n",jiuxu[i].pid,jiuxu[i].name,jiuxu[i].pro,jiuxu[i].time,jiuxu[i].state);
for (i=0;i<shumu2;i++)
printf("%d%15s%12d%13d%13c\n",zusai[i].pid,zusai[i].name,zusai[i].pro,zusai[i].time,zusai[i].state);
getch();

}

void pcbdiaodu() /*进程调度*/
{char f;
printf("\n请选择\n");
printf("1.将就绪进程按优先级调度\n");
printf("2.将就绪进程按先入先出调度\n");
f=getche();
switch(f)
{
case '1': diaodu3();break;
case '2': diaodu4();break;
default:break;
}
}

void pcbkongzhi() /*进程控制的函数*/
{ char a;
printf("请选择需要的控制操作:\n");
printf("1.进程调度\n");
printf("2.阻塞运行的进程\n");
printf("3.唤醒阻塞进程.\n");
printf("4.撤消进程\n");
a=getche();
switch(a)
{case '1': pcbdiaodu();break;
case '2': block();break;
case '3': wakeup();break;
case '4': destroy();break;
default:break;
}
}


main() /*主函数*/
{
int n;
char k;
n=1;
while(n==1)
{
printf("\n ********************************************");
printf("\n * 进程管理 *");
printf("\n * 1.创建新的进程 2.查看运行进程 *");
printf("\n * 3.查看就绪进程 4.查看阻塞进程 *");
printf("\n * 5.进程控制 6.退出 *");
printf("\n ********************************************");
printf("\n请选择(1~6)");
k=getche();
switch(k)
{
case'1':create();break;
case'2':run();break;
case'3':xianshij();break;
case'4':xianshiz();break;
case'5':pcbkongzhi();break;
case'6':exit(0);break;
default:printf("输入有错!\n");break;
}
printf("\n ********************************************");
}
}


6KAufBWt.txt (5.91 KB) 求助 轮转法 ...急...


[此贴子已经被作者于2006-11-3 0:28:17编辑过]

搜索更多相关主题的帖子: 轮转 
2006-11-03 00:27
gbartonlee
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-10-14
收藏
得分:0 

没有人会吗??

2006-11-03 12:26
快速回复:求助 轮转法 ...急...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018407 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved