主题:哪位帮我调试一下程序?
以下是在vc++6.0上编的代码 但运行后出现sy1.cpp(4) : fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory 意思是没找到'stdafx.h'这个头文件是吧 我在百度上搜索了一个解决办法 “打开菜单Project-> Setting-> C/C++,再选择Category-> Procomplied Hearders 选择No Using Procomplied Hearders” 我试了这个方法 不管用
这是一个进程调度模拟程序:假设有10个进程需要在CPU上执行,分别用:
先进先出调度算法;
基于优先数的调度算法;
最短执行时间调度算法
确定这10个进程在CPU上的执行过程。要求每次进程调度时在屏幕上显示:
当前执行进程;
就绪队列;
等待队列
我把编码贴在下面了 哪位高手帮我放在vc里调试一吧(另外运行的时候需要一个process.txt文件) 谁帮帮我呀 感激不尽!!
// sy1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//#include<iostream.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
//#include "fstream.h"
//#include <iomanip.h>
#define Max 10
typedef struct process{
char name[10];//进程名
int NeedTime;//需要执行时间
int OverTime;//已执行时间
int Status;//进程状态,0表示等待,1表示就绪,2表示正在执行
int priority; // 数字越小优先级越高
struct process *next;//队列指针
}PCB;
typedef struct Queue{
PCB* head;
PCB* rear;
}Queue;
Queue ready,wait,run;//定义就绪队列、等待队列、运行队列
void Create(Queue &Q)//构造一个队列
{ Q.head=Q.rear=(PCB*)malloc(sizeof(PCB));
if(!Q.head) exit(1);
Q.rear->next=NULL;
}
void EnQueue(Queue &Q,PCB *s)//入队函数
{
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
PCB* DeQueue(Queue &Q,PCB *s)//出队函数
{
//if(Q.head==Q.rear) return 0;//此处不用判断,因为每次调用该函数前会判断
s=Q.head->next;
Q.head->next=s->next;
if(Q.rear==s) Q.rear=Q.head;
return s;
}
void Print(Queue wait,Queue ready,Queue run)
{
PCB *p;
cout<<setw(10)<<"Name"<<setw(12)<<"NeedTime"<<setw(12)<<"OverTime"<<setw(12)<<"Priority"<<setw(8)<<"Status"<<endl;
//输出各进程的信息及状态
if(run.head!=run.rear)
{
cout<<setw(10)<<run.rear->name<<setw(12)<<run.rear->NeedTime<<setw(12)<<run.rear->OverTime<<setw(12)<<run.rear->priority<<setw(8)<<run.rear->Status<<endl;
}
for(p=ready.head;p!=ready.rear;) //输出就绪队列里的进程
{ p=p->next;
cout<<setw(10)<<p->name<<setw(12)<<p->NeedTime<<setw(12)<<p->OverTime<<setw(12)<<p->priority<<setw(8)<<p->Status<<endl;
}
for(p=wait.head;p!=wait.rear;) //输出等待队列中的进程
{ p=p->next;
cout<<setw(10)<<p->name<<setw(12)<<p->NeedTime<<setw(12)<<p->OverTime<<setw(12)<<p->priority<<setw(8)<<p->Status<<endl;
}
}
void initial(Queue &wait,Queue &ready,ifstream Input)//进程初始化
{
int i,j;
wait.rear=wait.head;ready.rear=ready.head;//xiugai2
for(i=1;i<=Max;i++)
{
PCB *s;
s=(PCB *)malloc(sizeof(PCB));
if(!s) exit(1);
Input>>s->name>>s->NeedTime>>s->priority;
s->OverTime=0;//已执行时间初始为0
s->next=NULL;
// srand(time(NULL));
j=rand()%2; //产生一个0-1的随机数
if(j==0)
{
EnQueue(wait,s);
s->Status=0;
}
else
{EnQueue(ready,s);
s->Status=1;
}
}
cout<<"初始进程队列如下:"<<endl;
Print(wait,ready,run);
}
void FCFS(Queue &wait,Queue &ready,Queue &run)//先进先出调度算法
{ PCB *p;
if(ready.head==ready.rear&&wait.head!=wait.rear)//如果初始的就绪队列为空等待队列不空,则将等待队列的第一个进程转换到就绪队列中
{ p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
for(;ready.head!=ready.rear;) //每次循环从就绪队列中选择一个进程执行
{
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
for(int i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行了1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
cout<<"所有进程执行结束!"<<endl;
}
void Priority(Queue wait,Queue ready,Queue run)//基于优先数的调度算法
{
int i,m,n;
PCB *p,*q;
if(ready.head==ready.rear&&wait.head!=wait.rear)//如果初始的就绪队列为空,则将等待队列的第一个进程转换到就绪队列中
{ p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;}
for(;ready.head->next!=NULL;) //每次循环从就绪队列中选择一个进程执行
{
if(ready.head->next==ready.rear)//如果就绪队列中只有一个进程,则每次就绪队列中都只有一个进程,则同先进先出算法
{
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行了1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
else
{
for(n=i=1,p=ready.head->next,m=p->priority;p!=ready.rear;i++)
{//遍历就绪队列,找到具有最小优先数的进程
//n=i;
p=p->next;
if(m>p->priority)
{
m=p->priority;//m记录最小的优先数
n=i+1; //n记录具有最小优先数的进程在链队中的逻辑位置(第几个)
}
}
if(n==1)
{//如果优先级最高的是第一个,则直接就绪队列第一个进程出队
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
}
else
{
for(i=1,q=ready.head;i<n;i++)
{//找到就绪队列中第n-1个进程的地址
q=q->next;
}
p=q->next; //p表示就绪队列中的第n个进程的地址
q->next=p->next;
if(p==ready.rear)//如果p是最后一个元素
{ready.rear=q;}
EnQueue(run,p);
run.rear->Status=2;
}
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行时间+1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
}
cout<<"所有进程执行结束!"<<endl;
}
void Shortage(Queue wait,Queue ready,Queue run)//最短执行时间调度算法
{
int i,m,n;
PCB *p,*q;
if(ready.head==ready.rear&&wait.head!=wait.rear)//如果初始的就绪队列为空,且等待队列不空,则将等待队列的第一个进程转换到就绪队列中
{ p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;}
for(;ready.head!=ready.rear;) //每次循环从就绪队列中选择一个进程执行
{
if(ready.head->next==ready.rear)//如果就绪队列中只有一个进程,则以后的每次就绪队列中都只有一个进程,则同先进先出算法
{
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行了1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
else
{
for(n=i=1,p=ready.head->next,m=p->NeedTime;p!=ready.rear;i++)//xiugai1
{//遍历就绪队列,找到所需执行时间最短的进程
//n=i;
p=p->next;
if(m>p->NeedTime)
{
m=p->NeedTime;//m记录最短的执行时间
n=i+1; //n记录具有最短执行时间的进程在链队中的逻辑位置(第几个)
}
}
if(n==1)
{//如果执行时间最短的是第一个,则就绪队列第一个进程出队
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
}
else
{
for(i=1,q=ready.head;i<n;i++)
{//找到就绪队列中第n-1个进程的地址
q=q->next;
}
p=q->next; //p表示就绪队列中的第n个进程的地址
q->next=p->next; //p->next=NULL;
if(p==ready.rear)//如果p是最后一个元素
{ready.rear=q;}
EnQueue(run,p);
run.rear->Status=2;
}
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行时间+1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
}
cout<<"所有进程执行结束!"<<endl;
}
void main()
{
char choose[20]; //接收输入的选择,便于判断是否输错
char c;
c='Y';
Create(ready);Create(wait);Create(run);//创建初始三个队列
for(;c=='Y'||c=='y';)
{
system("cls");
ifstream Input("process.txt");
initial(wait,ready,Input);
cout<<"您可用以下三种算法调度进程:"<<endl;
cout<<"1.先进先出调度算法"<<endl;
cout<<"2.基于优先数的调度算法"<<endl;
cout<<"3.最短执行时间调度算法"<<endl;
cout<<"请选择:";
cin>>choose;
switch(choose[0])
{case '1':FCFS(wait,ready,run);break;
case '2':Priority(wait,ready,run);break;
case '3':Shortage(wait,ready,run);break;
default:cout<<"输入错误!";break;
}
Input.close();
cout<<"继续操作?Y or N";
cin>>c;
}
//程序结束前,释放所有队列所占的空间
free(ready.head);free(wait.head);
free(run.head);
return;
}
这是一个进程调度模拟程序:假设有10个进程需要在CPU上执行,分别用:
先进先出调度算法;
基于优先数的调度算法;
最短执行时间调度算法
确定这10个进程在CPU上的执行过程。要求每次进程调度时在屏幕上显示:
当前执行进程;
就绪队列;
等待队列
我把编码贴在下面了 哪位高手帮我放在vc里调试一吧(另外运行的时候需要一个process.txt文件) 谁帮帮我呀 感激不尽!!
// sy1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//#include<iostream.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
//#include "fstream.h"
//#include <iomanip.h>
#define Max 10
typedef struct process{
char name[10];//进程名
int NeedTime;//需要执行时间
int OverTime;//已执行时间
int Status;//进程状态,0表示等待,1表示就绪,2表示正在执行
int priority; // 数字越小优先级越高
struct process *next;//队列指针
}PCB;
typedef struct Queue{
PCB* head;
PCB* rear;
}Queue;
Queue ready,wait,run;//定义就绪队列、等待队列、运行队列
void Create(Queue &Q)//构造一个队列
{ Q.head=Q.rear=(PCB*)malloc(sizeof(PCB));
if(!Q.head) exit(1);
Q.rear->next=NULL;
}
void EnQueue(Queue &Q,PCB *s)//入队函数
{
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
PCB* DeQueue(Queue &Q,PCB *s)//出队函数
{
//if(Q.head==Q.rear) return 0;//此处不用判断,因为每次调用该函数前会判断
s=Q.head->next;
Q.head->next=s->next;
if(Q.rear==s) Q.rear=Q.head;
return s;
}
void Print(Queue wait,Queue ready,Queue run)
{
PCB *p;
cout<<setw(10)<<"Name"<<setw(12)<<"NeedTime"<<setw(12)<<"OverTime"<<setw(12)<<"Priority"<<setw(8)<<"Status"<<endl;
//输出各进程的信息及状态
if(run.head!=run.rear)
{
cout<<setw(10)<<run.rear->name<<setw(12)<<run.rear->NeedTime<<setw(12)<<run.rear->OverTime<<setw(12)<<run.rear->priority<<setw(8)<<run.rear->Status<<endl;
}
for(p=ready.head;p!=ready.rear;) //输出就绪队列里的进程
{ p=p->next;
cout<<setw(10)<<p->name<<setw(12)<<p->NeedTime<<setw(12)<<p->OverTime<<setw(12)<<p->priority<<setw(8)<<p->Status<<endl;
}
for(p=wait.head;p!=wait.rear;) //输出等待队列中的进程
{ p=p->next;
cout<<setw(10)<<p->name<<setw(12)<<p->NeedTime<<setw(12)<<p->OverTime<<setw(12)<<p->priority<<setw(8)<<p->Status<<endl;
}
}
void initial(Queue &wait,Queue &ready,ifstream Input)//进程初始化
{
int i,j;
wait.rear=wait.head;ready.rear=ready.head;//xiugai2
for(i=1;i<=Max;i++)
{
PCB *s;
s=(PCB *)malloc(sizeof(PCB));
if(!s) exit(1);
Input>>s->name>>s->NeedTime>>s->priority;
s->OverTime=0;//已执行时间初始为0
s->next=NULL;
// srand(time(NULL));
j=rand()%2; //产生一个0-1的随机数
if(j==0)
{
EnQueue(wait,s);
s->Status=0;
}
else
{EnQueue(ready,s);
s->Status=1;
}
}
cout<<"初始进程队列如下:"<<endl;
Print(wait,ready,run);
}
void FCFS(Queue &wait,Queue &ready,Queue &run)//先进先出调度算法
{ PCB *p;
if(ready.head==ready.rear&&wait.head!=wait.rear)//如果初始的就绪队列为空等待队列不空,则将等待队列的第一个进程转换到就绪队列中
{ p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
for(;ready.head!=ready.rear;) //每次循环从就绪队列中选择一个进程执行
{
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
for(int i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行了1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
cout<<"所有进程执行结束!"<<endl;
}
void Priority(Queue wait,Queue ready,Queue run)//基于优先数的调度算法
{
int i,m,n;
PCB *p,*q;
if(ready.head==ready.rear&&wait.head!=wait.rear)//如果初始的就绪队列为空,则将等待队列的第一个进程转换到就绪队列中
{ p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;}
for(;ready.head->next!=NULL;) //每次循环从就绪队列中选择一个进程执行
{
if(ready.head->next==ready.rear)//如果就绪队列中只有一个进程,则每次就绪队列中都只有一个进程,则同先进先出算法
{
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行了1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
else
{
for(n=i=1,p=ready.head->next,m=p->priority;p!=ready.rear;i++)
{//遍历就绪队列,找到具有最小优先数的进程
//n=i;
p=p->next;
if(m>p->priority)
{
m=p->priority;//m记录最小的优先数
n=i+1; //n记录具有最小优先数的进程在链队中的逻辑位置(第几个)
}
}
if(n==1)
{//如果优先级最高的是第一个,则直接就绪队列第一个进程出队
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
}
else
{
for(i=1,q=ready.head;i<n;i++)
{//找到就绪队列中第n-1个进程的地址
q=q->next;
}
p=q->next; //p表示就绪队列中的第n个进程的地址
q->next=p->next;
if(p==ready.rear)//如果p是最后一个元素
{ready.rear=q;}
EnQueue(run,p);
run.rear->Status=2;
}
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行时间+1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
}
cout<<"所有进程执行结束!"<<endl;
}
void Shortage(Queue wait,Queue ready,Queue run)//最短执行时间调度算法
{
int i,m,n;
PCB *p,*q;
if(ready.head==ready.rear&&wait.head!=wait.rear)//如果初始的就绪队列为空,且等待队列不空,则将等待队列的第一个进程转换到就绪队列中
{ p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;}
for(;ready.head!=ready.rear;) //每次循环从就绪队列中选择一个进程执行
{
if(ready.head->next==ready.rear)//如果就绪队列中只有一个进程,则以后的每次就绪队列中都只有一个进程,则同先进先出算法
{
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行了1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
else
{
for(n=i=1,p=ready.head->next,m=p->NeedTime;p!=ready.rear;i++)//xiugai1
{//遍历就绪队列,找到所需执行时间最短的进程
//n=i;
p=p->next;
if(m>p->NeedTime)
{
m=p->NeedTime;//m记录最短的执行时间
n=i+1; //n记录具有最短执行时间的进程在链队中的逻辑位置(第几个)
}
}
if(n==1)
{//如果执行时间最短的是第一个,则就绪队列第一个进程出队
p=DeQueue(ready,p);
EnQueue(run,p);
run.rear->Status=2;
}
else
{
for(i=1,q=ready.head;i<n;i++)
{//找到就绪队列中第n-1个进程的地址
q=q->next;
}
p=q->next; //p表示就绪队列中的第n个进程的地址
q->next=p->next; //p->next=NULL;
if(p==ready.rear)//如果p是最后一个元素
{ready.rear=q;}
EnQueue(run,p);
run.rear->Status=2;
}
for(i=1;i<=run.rear->NeedTime;i++)
{//进程在CPU上执行,每循环一次假设已执行时间+1ms
run.rear->OverTime=i;
cout<<"当前各进程状态:"<<endl;
Print(wait,ready,run);
}
//进程结束,收回内存
p=DeQueue(run,p);
free(p);
if(wait.head!=wait.rear)
{p=DeQueue(wait,p);
EnQueue(ready,p);
p->Status=1;
}
}
}
cout<<"所有进程执行结束!"<<endl;
}
void main()
{
char choose[20]; //接收输入的选择,便于判断是否输错
char c;
c='Y';
Create(ready);Create(wait);Create(run);//创建初始三个队列
for(;c=='Y'||c=='y';)
{
system("cls");
ifstream Input("process.txt");
initial(wait,ready,Input);
cout<<"您可用以下三种算法调度进程:"<<endl;
cout<<"1.先进先出调度算法"<<endl;
cout<<"2.基于优先数的调度算法"<<endl;
cout<<"3.最短执行时间调度算法"<<endl;
cout<<"请选择:";
cin>>choose;
switch(choose[0])
{case '1':FCFS(wait,ready,run);break;
case '2':Priority(wait,ready,run);break;
case '3':Shortage(wait,ready,run);break;
default:cout<<"输入错误!";break;
}
Input.close();
cout<<"继续操作?Y or N";
cin>>c;
}
//程序结束前,释放所有队列所占的空间
free(ready.head);free(wait.head);
free(run.head);
return;
}