#include
#include
#include
#include
using namespace std;
struct fcfs{ //先来先服务算法从这里开始
char name[10];
float arrivetime;
float servicetime;
float starttime;
float finishtime;
float zztime; //周转时间
float dqzztime; //带权周转时间
}; //定义一个结构体,里面包含的有一个进程相关的信息
fcfs a[100];
void input(fcfs *p,int N) //进程的输入
{
int i;
cout<<endl;
printf(" 请您输入进程的 名字 到达时间 服务时间: (例如: a 0 100)\n\n");
for(i=0;i<=N-1;i++)
{
printf(" 请您输入进程%d的信息:\t",i+1);
scanf("\t\t\t%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
}
}
void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) //先来先服务调度算法的输出
{
int k;
printf("\n\n调用先来先服务算法以后进程运行的顺序是: ");
printf("%s",p[0].name);
for(k=1;k<N;k++)
{
printf("-->%s",p[k].name);
}
cout<<endl;
printf("\n具体进程调度信息:\n");
printf("\t进程名\t到达时间\t服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n");
for(k=0;k<=N-1;k++)
{
printf("\t %s\t%-.2f\t %-.2f\t %-.2f\t %-.2f\t %-.2f\t %-.2f\n",p[k].name,p[k].arrivetime,
p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);
}
getchar(); //此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪
}
void sort(fcfs *p,int N) //排序
{
for(int i=0;i<=N-1;i++)
for(int j=0;j<=i;j++)
if(p[i].arrivetime<p[j].arrivetime)
{
fcfs temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N)
//运行阶段,计算开始时间和完成时间,计算周转时间和带权周转时间
{
int k;
for(k=0;k<=N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}
}
for(k=0;k<=N-1;k++)
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].dqzztime=p[k].zztime/p[k].servicetime;
}
}
void FCFS(fcfs *p,int N)
{
float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
sort(p,N);
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
getchar();
} //先来先服务算法到此结束
struct sjf{//最短进程优先调度算法从这里开始
char name[10];
float arrivetime; //到达时间
float servicetime; //运行时间
float starttime; //开始时间
float finishtime; //完成时间
};
sjf a1[100];
void input(sjf *p,int N1)//进程信息输入
{
int i;
cout<<endl;
printf(" 请您输入进程的 名字 到达时间 服务时间: (例如: a 0 100)\n\n");
for(i=0;i<=N1-1;i++)
{
printf(" 请您输入进程%d的信息:\t",i+1);
scanf("\t\t\t%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
}
}
void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,int N1)//最终结果输出
{
int k;
printf("\n\t调用最短进程优先调度算法以后进程的调度顺序为:");
printf("%s",p[0].name);
for(k=1;k<N1;k++)
{printf("-->%s",p[k].name);}
cout<<endl;
printf("\n进程具体调度信息:\n");
printf("\n\t进程名\t到达时间\t运行时间\t开始时间\t完成时间\n");
for(k=0;k<=N1-1;k++)
{
printf(" \t%s\t %-.2f\t\t %-.2f\t\t %-.2f\t\t %-.2f\t\n",p[k].name,p[k].arrivetime,
p[k].servicetime,p[k].starttime,p[k].finishtime);
}
getchar();
}
void sort(sjf *p,int N1)//排序
{
for(int i=0;i<=N1-1;i++)
for(int j=0;j<=i;j++)
if(p[i].servicetime<p[j].servicetime)
{
sjf temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,int N1)//运行阶段
{ int k;
for(k=0;k<=N1-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+float(p[k].servicetime)/60;}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime)/60;}
}
}
void sjff(sjf *p,int N1)
{
float arrivetime=0,servicetime=0,starttime=0,finishtime=0;
sort(p,N1);
for(int m=0;m<N1-1;m++)
{if(m==0)
p[m].finishtime=p[m].arrivetime+float(p[m].servicetime)/60;
else
p[m].finishtime=p[m-1].finishtime+float(p[m].servicetime)/60;
int i=0;
for(int n=m+1;n<=N1-1;n++)
{
if(p[n].arrivetime<=p[m].finishtime)
i++;
}
float min=p[m+1].servicetime;
int next=m+1;
for(int k=m+1;k<m+i;k++)
{
if(p[k+1].servicetime<min)
{min=p[k+1].servicetime;
next=k+1;}
}
sjf temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
deal(p,arrivetime,servicetime,starttime,finishtime,N1);
Print(p,arrivetime,servicetime,starttime,finishtime,N1);
getchar();
}//最短进程优先调度算法到这里结束
char menu()//用来输出相关信息的函数
{
char cse1;
while(1)
{
system("cls");
fflush(stdin); //清空缓冲区
cout<<endl;
cout<<endl;
cout<<"\t"<<"|| <<<<<<<<<<<<欢<<<<<<<<<<< >>>>>>>>>>>>迎>>>>>>>>>>> ||"<<endl ;
cout<<"\t"<<"|| ||"<<endl ;
cout<<"\t"<<"||"<<"\t 实 验 一 进 程 调 度 算 法 实 验"<<"\t\t"<<"||"<<endl;
cout<<"\t"<<"|| ||"<<endl ;
cout<<"\t"<<"||"<<"\t\t 1.先来先服务调度算法 "<<"\t\t"<<"||"<<endl;
cout<<"\t"<<"|| ||"<<endl ;
cout<<"\t"<<"||"<<"\t\t 2.最短进程优先调度算法 "<<"\t\t"<<"||"<<endl;
cout<<"\t"<<"|| ||"<<endl ;
cout<<"\t"<<"|| <<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>> ||"<<endl ;_
```c
```_
cout<<endl;
cout<<endl;
cout<<"\t\t 请输入您的选择(1/2):";
cse1=getchar();
if(cse1<'1'||cse1>'2')
cout<<"你的输入有错!"<<endl;
else
break;
}
return cse1;
}
int main(int argc, char *argv[])
{
while(1)
{
switch(menu())
{
case '1':
int N;
cout<<endl;
cout<<endl;
printf("\t\t<<---!!!@@@先来先服务调度算法@@@!!!--->>\n");
cout<<endl;
printf("输入进程数目:");
scanf("%d",&N);
input(a,N);
FCFS(a,N);
case '2':
int N1;
cout<<endl;
cout<<endl;
printf("\t\t<<---!!!@@@最短进程优先调度算法@@@!!!--->>\n");
cout<<endl;
printf("输入进程数目: ");
scanf("%d",&N1);
input(a1,N1);
sjf *b=a1;
sjf *c=a1;
sjff(b,N1);
getchar();
}
}
system("PAUSE");
return EXIT_SUCCESS;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1:
输入
3
0
fang 90
yang 50
ning 70
输出
fang 90
ning 70
yang 50
考察内容:结构体排序
#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 100000
struct Student
{
string name;
double score;
int index;
};
int cmp2(Student a, Student b)
{//成绩从大到小排序
if(a.score == b.score)
return a.index < b.index;
return a.score < b.score;
}
int cmp1(Student a, Student b)
{//成绩从小到大排序
if(a.score == b.score)
return a.index < b.index;
return a.score > b.score;
}
int main()
{
int n, m;
while(scanf("%d %d", &n, &m)!=EOF)
{
Student *s = new Student[MAXSIZE];
for(int i = 0; i < n; i++)
{
cin>>s[i].name>>s[i].score;
s[i].index = i;//录入顺序
}
if(m == 0)
sort(s, s+n, cmp1);
else
sort(s, s+n, cmp2);
for(int i = 0; i < n; i++)
cout<<s[i].name<<" "<<s[i].score<<endl;
}
return 0;
}