关于网友提出的“ 一个先来先服务的算法,运行不下去,经常报错”问题疑问,本网通过在网上对“ 一个先来先服务的算法,运行不下去,经常报错”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 一个先来先服务的算法,运行不下去,经常报错
描述: #include
#include
#include
#define getpch(type)(type*)malloc(sizeof(type))
struct worktime{
float Tb; //作业运行时刻
float Tf; //作业完成时刻
float Ti; //周转时间
float Wi; //带权周转时间
};
struct jcb{ /*定义作业控制块JCB */
int resource; //所需资源
char state; //作业状态
char name[10]; //作业名
float subtime; //作业提交时间
float runtime; //作业所需的运行时间
float Rp; //后备作业响应比
struct jcb *next; //链指针
struct worktime wt; //时间
}*jcb_ready = NULL,*j;
typedef struct jcb JCB;
int num = 0;
float T = 0;
sort() /* 建立对作业进行提交时间排列函数*/
{
JCB *first, *second;
int insert=0;
if((jcb_ready == NULL) || ((j->subtime) < (jcb_ready->subtime))) {/*作业提交时间最短的,插入队首*/
j->next = jcb_ready;
jcb_ready = j;
j->Rp = 1;
}
else { /* 作业比较提交时间,插入适当的位置中*/
first = jcb_ready;
second = first->next;
while(second != NULL){
if((j->subtime) < (second->subtime)){ /*若插入作业比当前作业提交时间短,插入到当前作业前面*/
j->next = second;
first->next = j;
second = NULL;
insert = 1;
}
else { /* 插入作业优先数最低,则插入到队尾*/
first = first->next;
second = second->next;
}
}
if (insert == 0)
first->next = j;
}
}
input() { /* 建立作业控制块函数*/
int i;
for(i = 0;i < num;i++)
{
printf("\n 作业号No.%d:\n",i);
j=getpch(JCB);
printf("\n 输入作业名:");
scanf("%s",j->name);
printf("\n 输入作业提交时刻:");
scanf("%f",&j->subtime);
printf("\n 输入作业运行时间:");
scanf("%f",&j->runtime);
printf("\n 输入作业运行所需的资源数:");
scanf("%d",&j->resource);
printf("\n");
j->state = 'f';
j->next = NULL;
sort(); /* 调用sort函数*/
}
return num;
}
copy(){
;
}
FSFC(JCB *p) {
float sumTi = 0,sumWi = 0;
int i;
T = jcb_ready->subtime + jcb_ready->runtime;
jcb_ready->wt.Ti = jcb_ready->runtime;
jcb_ready->wt.Wi = 1;
jcb_ready->wt.Tb = jcb_ready->subtime;
p->wt.Tf = T;
printf(" name state stime rtime resource betime fitime tutime attime\n");
for(i = 0; i < num; i++){
printf(" %s ",p->name);
printf(" %c ",p->state);
printf(" %0.1f ",p->subtime );
printf(" %0.1f ",p->runtime);
printf(" %d ",p->resource);
printf(" %0.1f ",p->wt.Tb);
printf(" %0.1f ",p->wt.Tf);
printf(" %0.1f ",p->wt.Ti);
printf(" %0.1f ",p->wt.Wi);
printf("\n");
sumTi = sumTi + p->wt.Ti;
sumWi = sumWi + p->wt.Wi;
p = p->next;
if(jcb_ready != NULL){ / /测试说是这里有问题,不过老是找不出来,求大侠帮忙
if (T >= p->subtime)
p->wt.Tb = T;
else
p->wt.Tb = p->subtime;
}printf("adf");
p->wt.Tf = p->wt.Tb + p->runtime;
p->wt.Ti = p->wt.Tf - p->subtime;
p->wt.Wi = p->wt.Ti / p->runtime;
T = p->wt.Tf;
}
printf("\n The Average turnover time is %0.2f",sumTi/num);
printf("\n The Weighted average turnover time is %0.2f",sumWi/num);
}
dis(JCB *jcb_ready){
int i = 0;
printf("The JCB is:\n");
for (i = 0; i < num; i++){
printf(" name state subtime runtime resource \n");
printf(" %s ",jcb_ready->name);
printf(" %c ",jcb_ready->state);
printf(" %0.1f ",jcb_ready->subtime);
printf(" %0.1f ",jcb_ready->runtime);
printf(" %.0d ",jcb_ready->resource);
jcb_ready = jcb_ready->next;
printf("\n");
}
}
main(){
float sumTi = 0,sumWi = 0;
int i;
printf("\n 请输入所要运行的作业的数目:");
scanf("%d",&num);
input();
printf("\n 按任一键继续......\n");
getch();
while(jcb_ready != NULL){
printf("\n The first algorithm is FCFS!\n");
FSFC(jcb_ready);}
}
之前是可以运行的,但后来不知道为啥,突然断掉了
解决方案1: jcb_ready->wt.Wi = 1;
...
if(jcb_ready != NULL){ / /测试说是这里有问题,不过老是找不出来,求大侠帮忙
看你代码,jcb_ready不会是NULL,不然上面赋值出就出问题了。
单步调试下
以上介绍了“ 一个先来先服务的算法,运行不下去,经常报错”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2743813.html