首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求该程序的开始时间准确计算方法

2012-11-06 
求该程序的开始时间正确计算方法应时间开始时间(时刻)-到达时间到达时间是自己输入的,开始时间不知道怎么

求该程序的开始时间正确计算方法
应时间=开始时间(时刻)-到达时间
到达时间是自己输入的,开始时间不知道怎么计算了。按我自己的输入算出来不会有负数。这程序是关于多级反馈调度的问题。求帮忙改成正确的
[code=C/C++][/code]
test.cpp
#include"stdio.h"
#include "test.h"
void main()
{
printf(" 模拟多级反馈队列调度\n\n");
LinkQueue Q1,Q2,Q3,SAVE;
InitQueue(Q1);//第一队列,优先级最高
InitQueue(Q2);//第二队列,优先级次之
InitQueue(Q3);//第三队列,优先级最低
InitQueue(SAVE);//用于存储运行完的进程,便于程序输出
ElemType e;
int Q1time=2,Q2time=4,Q3time=8;//初始化三个队列时间片为3、6、9
int time,n,t=0,arrivetime;
char JobNum,cmd,chose;
printf("请输入进程的个数:");
scanf("%d",&n);
printf("\n");
int i;
for(i=1;i<=n;i++)//录入进程信息
{
getchar();
printf("请输入第%i个进程的名称:",i);
scanf("%c",&JobNum);
e.JobNum=JobNum;
getchar();

//输入到达时间
printf("请输入第%i个进程的到达时间:",i);
scanf("%d",&arrivetime);
e.ArriveTime=arrivetime;
printf("请输入第%i个进程的运行时间:",i);
scanf("%d",&time);
e.time=time;
EnQueue(Q1,e);
printf("\n");
}
getchar();
printf("进程信息输入完毕,是否开始执行?Y/N\n");
scanf("%c",&cmd);
switch(cmd)
{
case 'Y'://进程执行
for(i=1;i<=50;i++)
{
if(Q1.front!=Q1.rear)
{
DeQueue(Q1,e);
if(e.time>Q1time)//进程未执行完毕
{
e.time-=Q1time;
e.StartTime=e.ArriveTime;//e.StartTime=t
t+=Q1time;
EnQueue(Q2,e);
}
else//进程执行完毕
{
e.StartTime=t;

t+=e.time;
EnQueue(SAVE,e);
}
}
else if(Q1.front==Q1.rear&&Q2.front!=Q2.rear)
{
getchar();
printf("程序将要执行第二个队列中的进程,是否有新的进程加入?Y/N\n");
scanf("%c",&chose);
switch(chose)
{
case 'Y'://当执行第二队列中进程时,有新进程加入,中断
n++;
getchar();
printf("请输入进程的名称:");
scanf("%c",&JobNum);
e.JobNum=JobNum;
getchar();
printf("请输入进程的到达时间:",i);
scanf("%d",&arrivetime);
e.ArriveTime=arrivetime;
printf("请输入进程的运行时间:");
scanf("%d",&time);
e.time=time;
EnQueue(Q1,e);
printf("\n");
break;
case 'N':
DeQueue(Q2,e);
if(e.time>Q2time)//进程未执行完毕
{
e.time-=Q2time;
t+=Q2time;
EnQueue(Q3,e);
}
else//进程执行完毕
{

t+=e.time;
EnQueue(SAVE,e);
}
break;
}
}
else if(Q1.front==Q1.rear&&Q2.front==Q2.rear&&Q3.front!=Q3.rear)
{
getchar();
printf("将要执行第三个队列中的进程,是否有新的进程加入?Y/N\n");
scanf("%c",&chose);
switch(chose)
{
case 'Y'://当执行第三队列中进程时,有新进程加入,中断
n++;
getchar();
printf("请输入进程的名称:");
scanf("%c",&JobNum);
e.JobNum=JobNum;
getchar();
printf("请输入进程的到达时间:",i);
scanf("%d",&arrivetime);
e.ArriveTime=arrivetime;
printf("请输入进程的运行时间:");
scanf("%d",&time);
e.time=time;
EnQueue(Q1,e);
printf("\n");
break;
case 'N':
DeQueue(Q3,e);
if(e.time>Q3time)//进程未执行完毕
{
e.time-=Q3time;
t+=Q3time;
EnQueue(Q3,e);
}
else//进程执行完毕
{

t+=e.time;
EnQueue(SAVE,e);
}
break;
}
}
}
printf("\n进程按照进程完成顺序排列如下:\n\n");



for(i=1;i<=n;i++)//for(int i=1;i<=n;i++)//输出结果
{
DeQueue(SAVE,e);
printf("\n");
printf("进程名:%c\n响应时间:%d\n进程周转时间:%d\n\n",e.JobNum,e.StartTime-e.ArriveTime,e.StartTime-e.ArriveTime+e.time);
}
break;
case 'N':
printf("进程未运行,谢谢适用!\n");
break;
}
}
















test.h
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#include <stdio.h>
#include <stdlib.h>
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef struct ElemType
{
char JobNum; //任务号
int time;
int StartTime; //开始时间
int ArriveTime;//到达时间
int Burst;//运行时间
}ElemType;

typedef struct QNode
{
ElemType date;
  struct QNode *next;
}QNode,*QueuePtr;

typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;


Status InitQueue(LinkQueue &Q)
{//构造一个空队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW); //存储分配失败
Q.front->next=NULL;
return OK;
}
Status EnQueue(LinkQueue &Q,ElemType e)
{//插入元素e为Q的新队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));  
if(!p)exit(OVERFLOW); //存储分配失败
p->date=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Status DeQueue(LinkQueue &Q,ElemType &e)
{//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
 //否则返回ERROR
QueuePtr p;
if(Q.front==Q.rear)return ERROR;
p=Q.front->next;
e=p->date;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return OK;
}

[解决办法]
无符号数和有符号数的scanf和printf的格式问题
无数符号的输入/输出格式 %u
有数符号的输入/输出格式 %d

热点排行