下意识还是想用面向对象去编程,但是二维数组传参数想着有些麻烦,于是就写成这样了,有些冗余。这次是真的体会到面向对象编程思想的好处了。
也发先了一个以前没发现的坑:
C语言scanf函数在连续输入字符型变量时需要注意:
比如代码是这样的:char a,b;
scanf("%c",a);
scanf("%c",b);
运行的话发现只能给输入a
原因是scanf是从标准输入缓存区读你想要输入的参数
你想给char a输入A,在scanf函数运行时你肯定是从键盘输入“A”
然后呢,输入“enter”回车这下就完了,
第二行的scanf就从缓存区读走了“enter”给了char b。
解决方法:char a,b;
scanf(" %c",a);//%号前加一个空格
scanf(" %c",b);//
(1)scanf函数“%”号前加一个空格 就可以抵消“enter”了。
(2)可以在第一个scanf后,调用清除缓存区的函数fflush(stdin);
下面是本文章的真正内容:
C语言面向过程用FCFS和SJF算法模拟作业调度://实验一: 作业调度的模拟
//要求:
//3)根据作业调度算法(先来先服务和短作业优先都要做),编写程序,模拟作业调度。
//4)保存调度结果(作业调度次序,每个作业的完成时间、周转时间、带权周转时间,
//所有作业的平均周转时间、平均带权周转时间)、提交实验结论。
//-----------------------
//我们模拟比较简单的非抢占是进程调度方式
//本题的精髓是根据作业调度算法求出不同算法下的作业调度次序
//次序算出来了剩下就是简单的计算了
//-----------------------
#include
typedef struct fcfs{
char pname;
int cometime;
int servicetime;
}fcfs;
//而SJF算法需要添加状态行,来标志那些进程需要调度
typedef struct sjf{
char pname;
int cometime;
int servicetime;
int stuta;
}sjf;
int main(void)
{
//我们采用面向过程编程
//进程名: A B C D E
//到达时间:0 1 2 3 4
//服务时间:4 3 4 2 4
//FCFS
fcfs f[5];
//输入
for(int i=0;i<5;i++)
{
printf("请输入第%d个进程的进程名\n",i+1);
scanf(" %c",&(f[i].pname));
printf("请输入第%d个进程的到达时间\n",i+1);
scanf("%d",&(f[i].cometime));
printf("请输入第%d个进程的服务时间\n",i+1);
scanf("%d",&(f[i].servicetime));
}
for(int i=0;i<5;i++)
{
printf("第%d个进程的进程名:%c\n",i+1,f[i].pname);
printf("第%d个进程的到达时间:%d\n",i+1,f[i].cometime);
printf("第%d个进程的服务时间:%d\n",i+1,f[i].servicetime);
}
//根据达到时间,用冒泡排序给进程排好调度次序
for(int i=0;i<4;i++)
{
for(int j=0;j<4-i;j++)
{
if(f[j].cometime>f[j+1].cometime)
{
fcfs temp;
temp=f[j];
f[j]=f[j+1];
f[j+1]=temp;
}
}
}
//输出调度次序
printf("调度次序为:\n");
for(int i=0;i<5;i++)
{
printf("%3c",f[i].pname);
}
//计算完成时间
int finishtime[5];//存储各个进程的完成时间
int sum=0;//存储总的服务时间
for(int i=0;i<5;i++)
{
sum+=f[i].servicetime;
finishtime[i]=sum;
}
printf("\n");
//输出完成时间
printf("进程及其完成时间为:\n");
for(int i=0;i<5;i++)
{
printf("%3c",f[i].pname);
}
printf("\n");
for(int i=0;i<5;i++)
{
printf("%3d",finishtime[i]);
}
//计算周转时间:周转时间=完成时间-到达时间
int cyclingtime[5];
for(int i=0;i<5;i++)
{
cyclingtime[i]=finishtime[i]-f[i].cometime;
}
printf("\n");
//输出周转时间
printf("进程及其周转时间为:\n");
for(int i=0;i<5;i++)
{
printf("%3c",f[i].pname);
}
printf("\n");
for(int i=0;i<5;i++)
{
printf("%3d",cyclingtime[i]);
}
//计算带权周转时间floatWI=周转时间/服务时间
float floatWi[5];
for(int i=0;i<5;i++)
{
floatWi[i]=(cyclingtime[i]*0.1)/(f[i].servicetime*0.1);
}
printf("\n");
//输出带全周转时间
printf("进程及其平均周转时间为:\n");
for(int i=0;i<5;i++)
{
printf("%5c",f[i].pname);
}
printf("\n");
for(int i=0;i<5;i++)
{
printf("%1.2f ",floatWi[i]);
}
printf("\n");
//计算平均周转时间:总周转时间/5
for(int i=0;i<5;i++)
{
sum+=cyclingtime[i];
}
float avgcycling;
avgcycling=(float)sum/5;
printf("平均周转时间为:%1.2f\n",avgcycling);
//计算平均带权周转时间:总带全周转时间/5
float SUM=0;
for(int i=0;i<5;i++)
{
SUM+=floatWi[i];
}
float avgWi;
avgWi=SUM/5;
printf("平均带权周转时间为:%1.2f\n",avgWi);
//---------------------------------------------------------------
//FCFS算法完成,记下来写SJF
sjf s[5];
//输入
for(int i=0;i<5;i++)
{
printf("请输入第%d个进程的进程名\n",i+1);
scanf(" %c",&(s[i].pname));
printf("请输入第%d个进程的到达时间\n",i+1);
scanf("%d",&(s[i].cometime));
printf("请输入第%d个进程的服务时间\n",i+1);
scanf("%d",&(s[i].servicetime));
//状态号初始化都是0表示为进栈,不考虑调度
s[i].stuta=0;
}
//根据到达时间和服务时间排序
//为了辅助我们引出时间t来判断进程时候参与调度,int SJForder[5]来存储顺序
int t=0;
int SJForder[5]={0};
//t时刻那些进程需要调度,stuta=1来标记
int m;
for(m=0;m<5;m++)
{
for(int i=0;i<5;i++)
{
if(s[i].cometime<=t && s[i].stuta==0)
{
s[i].stuta=5-m;
}
}
//找出第一个被标记的,并且假设他是最短的任务
int Short=0;
for(int i=0;i<5;i++)
{
if(s[i].stuta==5-m)
{
Short=i;
break;
}
}
//挨着比较找出真的最短任务
for(int i=0;i<5;i++)
{
if(s[i].stuta==5-m)
{
if(s[i].servicetime
{
Short=i;
}
}
}
SJForder[m]=Short;
t+=s[Short].servicetime;
s[Short].stuta++;
//状态位重置为0
for(int i=0;i<5;i++)
{
if(s[i].stuta<=5-m)
{
s[i].stuta=0;
}
}
}
//输出调度次序
printf("调度次序为:\n");
for(int i=0;i<5;i++)
{
printf("%3c",s[SJForder[i]].pname);
}
//计算完成时间
sum=0;
for(int i=0;i<5;i++)
{
sum+=s[SJForder[i]].servicetime;
finishtime[i]=sum;
}
printf("\n");
//输出完成时间
printf("进程及其完成时间为:\n");
for(int i=0;i<5;i++)
{
printf("%3c",s[SJForder[i]].pname);
}
printf("\n");
for(int i=0;i<5;i++)
{
printf("%3d",finishtime[i]);
}
//计算周转时间:周转时间=完成时间-到达时间
for(int i=0;i<5;i++)
{
cyclingtime[i]=finishtime[i]-s[SJForder[i]].cometime;
}
printf("\n");
//输出周转时间
printf("进程及其周转时间为:\n");
for(int i=0;i<5;i++)
{
printf("%3c",s[SJForder[i]].pname);
}
printf("\n");
for(int i=0;i<5;i++)
{
printf("%3d",cyclingtime[i]);
}
//计算带权周转时间floatWI=周转时间/服务时间
for(int i=0;i<5;i++)
{
floatWi[i]=(cyclingtime[i]*0.1)/(s[SJForder[i]].servicetime*0.1);
}
printf("\n");
//输出带全周转时间
printf("进程及其平均周转时间为:\n");
for(int i=0;i<5;i++)
{
printf("%5c",s[SJForder[i]].pname);
}
printf("\n");
for(int i=0;i<5;i++)
{
printf("%1.2f ",floatWi[i]);
}
printf("\n");
//计算平均周转时间:总周转时间/5
for(int i=0;i<5;i++)
{
sum+=cyclingtime[i];
}
avgcycling=(float)sum/5;
printf("平均周转时间为:%1.2f\n",avgcycling);
//计算平均带权周转时间:总带全周转时间/5
for(int i=0;i<5;i++)
{
SUM+=floatWi[i];
}
avgWi=SUM/5;
printf("平均带权周转时间为:%1.2f\n",avgWi);
return 0;
}
谢谢观看,欢迎指正。