| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 585 人关注过本帖
标题:请高手帮帮我找出程序中的bug,只知道bug在running函数中。
只看楼主 加入收藏
rustle
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-11-2
收藏
 问题点数:0 回复次数:1 
请高手帮帮我找出程序中的bug,只知道bug在running函数中。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
 int j=0;
int n,i;           //需要输入的作业数量
float T1=0,T2=0;  //初始化周转时间,带权周转时间.
int times=0;      //初始化开始运行时间
int freesa=100,disksa=5;   //预定内存的大小为100k,磁带数量为5个.

struct jcb      //作业控制块
{
 char username[10];   //用户名
 char name[10];  //作业名
 int reachtime;   //作业到达时间
 int starttime;    //作业开始时间
 int runtime;    //已经运行了的时间
 int needtime;       //作业需要运行的时间
 int frees;       //作业要占用的内存
  int disks;    //作业所需磁带
 int finishtime;       //作业完成时间
 float cycletime;       //作业周转时间
 float cltime;           //作业带权周转时间
 char state;            //作业状态
 struct jcb *next;      //结构体指针
}*ready=NULL,*start=NULL,*p,*q,*r,*s,*t;
typedef struct jcb JCB;



void inital()           //建立作业控制块队列,先将其排成先来先服务的模式队列
{
int i;
printf("\n输入作业数:");
scanf("%d",&n);
for(i=0;i<n;i++)
    {
         p=getpch(JCB);
         printf("\n输入用户名:");
        scanf("%s",p->username);
        printf("输入作业名:");
        scanf("%s",p->name);
        getch();
        p->reachtime=i;
        printf("作业默认到达时间:%d",i);
        printf("\n输入作业要运行的时间:");
        scanf("%d",&p->needtime);
        printf("输入作业运行要占用的内存:");
        scanf("%d",&p->frees);
        printf("输入作业运行所需磁带:");
        scanf("%d",&p->disks);
        p->runtime=0;
        p->state='W';
        p->next=NULL;
        if(ready==NULL)  ready=q=p;    //先将其按到达的先后顺序排成后备序列
        else{
            q->next=p;
            q=p;
            }
    }
}

int space()     //计算内存中作业的个数
{
int l=0; JCB* pr=start;
while(pr!=NULL)
{
l++;
pr=pr->next;
}
return(l);
}


void apply()             //把符合条件的作业调用内存,并给他们分配资源,
{
   int len;
  //len=space();
  //  for(i=0,p=ready;i<3-len&&p!=NULL;)
  p=ready;
  while(p!=NULL)
    {

        if(p->frees<=freesa&&p->disks<=disksa)
        {
            freesa-=p->frees;
            disksa-=p->disks;
          //  i++;
            r=p;
            p=p->next;
            
            if(r==ready)          //先将符合条件的作业从队列中分离出来
            {
                ready=r->next;
                r->next=NULL;
            }
            else
            {
                q=ready;
                while(q->next!=r)  q=q->next;
                q->next=r->next;
            }
            if(start==NULL)  start=s=r;        // 将其插到start队列,
            else{
                s->next=r;
                s=r;
                }
        }
        else
        {
            p=p->next;

        }
    }
   len=space();
    printf("\n\t此时有%d道作业在内存\n\n",len);
}


void disp(JCB * pr) /*建立作业显示函数  */

{


printf("|%s\t",pr->username);
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->reachtime);
printf("|%d\t",pr->needtime);
printf("|%d\t",pr->runtime);
 printf("|%d\t",pr->frees);
 printf("|%d\t",pr->disks);
printf("\n");

}





void check()      //显示作业状况
{

  //  JCB *s,*r;
   // printf("当前使用用户:%s\t正在运行的作业是:%s",q->username,q->name);
    printf("\n作业%s于完成%d个作业后运行完毕,其完成后的情况:",q->name,j);
    j++;
    printf("\n用户名****作业名****状态****到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 \n");
    disp(q);
    s=start;
    printf("\n\t\t*********当前进入内存的作业状态*********");
    printf("\n用户名****作业名****状态****到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 \n");
    while(s!=NULL)
   {
     disp(s);
     s=s->next;
   }
   r=ready;
    printf("*\n\n\t\t*********当前后备作业表中作业的状态**********");
    printf("\n用户名****作业名****状态****到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 \n");
    while(r!=NULL)
   {
     disp(r);
     r=r->next;
   }
}

               
               
void running()         //运行作业
{
    for(t=start;t!=NULL;)
    {


        start=t->next;
          q=t;

       q->next=NULL;
        q->state='R';
        
        q->runtime++;
        t=start;
        times++;
        if(q->runtime==q->needtime)
        {
            q->finishtime=times;
            q->starttime=q->finishtime-q->needtime;
            q->cycletime=q->finishtime-q->reachtime;
            q->cltime=(q->cycletime)/(q->needtime);
            T1+=q->cycletime;
            T2+=q->cltime;
            freesa+=q->frees;
            disksa+=q->disks;
            check();     //调用check()显示正在运行的,就绪的以及后备的作业信息
            free(q);    //释放作业
            apply();    //分配作业
            getch();
        }
        else
        {

             for(s=start;s->next!=NULL;) s=s->next;
             s->next=q;
        }
    }
}
            

               
 main()       //初始化界面
{
    int m;
 printf("\n\n\t\t*********************************************\t\t\n");
  printf("\t\t\t\t实验三(2) 多道作业调度\n");
  printf("\t\t*********************************************\t\t\n");
  printf("\n\t\t1.多道作业调度演示.");
  printf("\n\t\t0.退出程序");
  printf("\n\t\t\t选择所要的操作:");
  printf("\n\n\n\t\t\t\t\t计算机学院软件四班\n");
  printf("\t\t\t\t\t蓝小花\n");
  printf("\t\t\t\t\t3204007102\n");
  printf("\t\t\t\t\t完成日期:2006年12月");
  scanf("%d",&m);
  switch(m)
  {
    case 1:
         system("cls");
         inital();
         apply();
         running();
         getch();
         system("cls");
         main();
         break;
    case 0:
         system("cls");
         break;
    default:
         system("cls");
          main();
  }
}
只知道bug在running函数中

[[it] 本帖最后由 rustle 于 2008-12-3 16:11 编辑 [/it]]
搜索更多相关主题的帖子: bug 
2008-12-03 16:09
LI341151
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-12-4
收藏
得分:0 
单步调试。。。
2008-12-04 12:40
快速回复:请高手帮帮我找出程序中的bug,只知道bug在running函数中。
数据加载中...
 
   



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

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