操作系统

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
struct jcb{
char name[10];
char status;
int arrtime;//到达时间
int id;
int reqtime;//作业运行所需时间
int startime;//开始时间
int finitime;//完成时间
int ti;//周转时间
float TAtime,TAWtime;//等待时间,带权周转时间
float prio;
}job[24],jcb[24],jobarr[24];
int systime=0;
int m=0;
int intarr,intfin,intjob;//到达的作业个数,完成作业个数、未到达作业个数
int ReadFile()
{

int i=0;
FILE *fp; //定义文件指针
fp=fopen("E:/zydd.txt","r"); //打开文件
if(fp==NULL)
{
printf("File open error !\n");
exit(0);
}
printf("\n id 作业到达时间 作业运行所需要时间\n");
while(!feof(fp))
{
fscanf(fp,"%d%d%d",&jcb[i].id,&jcb[i].arrtime,&jcb[i].reqtime); //fscanf()函数将数据读入
printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime); //输出到屏幕
i++;
}

if(fclose(fp)) //关闭文件
{
printf("Can not close the file !\n");
exit(0);
}
m=i;
return m;

}

//调用伪随机数的产生数据
int Pseudo_random_number()
{
int i;
srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。
//输入作业数
m=rand()%23+5;
for(i=1; i<=m; i++)
{
jcb[i].id=i;
//作业到达时间
jcb[i].arrtime=rand()%29+1;
//作业运行时间
jcb[i].reqtime=rand()%7+1;
}
printf("\n id 作业到达时间 作业运行所需要时间\n");
for(i=1; i<=m; i++)
{
printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
}
return m;

}
//先到先服务
void TheFCFS()
{
int i,j;

float sum=0.0,acount=0.0;
struct jcb temp;


printf("**********先来先服务算法FCFS*************\n");
//ReadFile();
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(jcb[i].arrtime>jcb[j].arrtime)
{
temp=jcb[i];
jcb[i]=jcb[j];
jcb[j]=temp;
}
}
}
printf("\n id 作业到达时间 作业运行所需要时间\n");
for(i=0;i<m;i++)
{
printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
}
for(i=0;i<m;i++){
jcb[i].finitime=systime+jcb[i].reqtime;
jcb[i].ti=jcb[i].finitime-jcb[i].arrtime;
jcb[i].TAWtime=(float)jcb[i].ti/jcb[i].reqtime;
systime=jcb[i].finitime;
}
for(i=0;i<m;i++)
{
sum=sum+jcb[i].ti;
acount=acount+jcb[i].TAWtime;
}

//jcb[0].ti=jcb[0].finitime-systime;
printf("\nid 到达时间 运行时间 完成时间 周转时间 带权周转时间\n");
for(i=0;i<m;i++)
printf("%d %d\t\t%d\t %d\t %d\t %.2f\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime);


printf("平均作业周转时间=%.2f\n",sum/m);
printf("平均作业周转时间=%.2f\n",acount/m);
printf("\n");
printf("\n");

}
//计算周转时间,带权周转时间,平均周转时间
void jisuan(int i,int j){

float sum=0.0,acount=0.0;

for(i=0;i<m;i++){
jcb[i].finitime=systime+jcb[i].reqtime;
jcb[i].ti=jcb[i].finitime-jcb[i].arrtime;
jcb[i].TAWtime=(float)jcb[i].ti/jcb[i].reqtime;
systime=jcb[i].finitime;
}
for(i=0;i<m;i++)
{
sum=sum+jcb[i].ti;
acount=acount+jcb[i].TAWtime;
}

//jcb[0].ti=jcb[0].finitime-systime;
printf("\nid 到达时间 运行时间 完成时间 周转时间 带权周转时间\n");
for(i=0;i<m;i++)
printf("%d %d\t\t%d\t %d\t %d\t %.2f\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime,jcb[i].finitime,jcb[i].ti,jcb[i].TAWtime);


printf("平均作业周转时间=%.2f\n",sum/m);
printf("平均作业周转时间=%.2f\n",acount/m);
printf("\n");
printf("\n");
}
//短作业优先
void TheSJF()
{
int i,j;

float sum=0.0,acount=0.0;
struct jcb temp;
printf("**********先来先服务算法SJF*************\n");
//ReadFile();
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(jcb[i].arrtime>jcb[j].arrtime)
{
temp=jcb[i];
jcb[i]=jcb[j];
jcb[j]=temp;
}
}
}

printf("\n id 作业到达时间 作业运行所需要时间\n");
for(i=0;i<m;i++)
{
printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
}

for(i=1;i<m;i++){
for(j=i+1;j<m;j++){
if(jcb[i].reqtime>jcb[j].reqtime){
temp=jcb[i];
jcb[i]=jcb[j];
jcb[j]=temp;
}
}
}
jisuan(i,j);

}
//HRRF(最高响应比)算法调度
void TheHRRF(){
int i,j;
float sum=0.0,acount=0.0;

struct jcb temp;
printf("**********最高响应比算法HRRF*************\n");
//ReadFile();
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(jcb[i].arrtime>jcb[j].arrtime)
{
temp=jcb[i];
jcb[i]=jcb[j];
jcb[j]=temp;
}
}
}
for(i=1;i<m;i++){
for(j=i+1;j<m;j++){
if(jcb[i].reqtime>jcb[j].reqtime){
temp=jcb[i];
jcb[i]=jcb[j];
jcb[j]=temp;
}
}
}
printf("\n id 作业到达时间 作业运行所需要时间\n");
for(i=0;i<m;i++)
{
printf("\n%3d%12d%15d\n",jcb[i].id,jcb[i].arrtime,jcb[i].reqtime);
}


printf("\nid 最高响应比\n");
for(j=1;j<m;j++)
{
jcb[j].TAtime=(float)(jcb[0].reqtime-jcb[j].arrtime);
jcb[j].prio=1+jcb[j].TAtime/jcb[j].reqtime;
printf("%d %.2f\n",jcb[j].id,jcb[j].prio);
}
for(i=1;i<m-1;i++){
printf("\nid 最高响应比\n");
for(j=i+1;j<m;j++){
jcb[j].TAtime=jcb[j].TAtime+jcb[i].reqtime;
jcb[j].prio=1+jcb[j].TAtime/jcb[j].reqtime;
printf("%d %.2f\n",jcb[j].id,jcb[j].prio);
}}
jisuan(i,j);

}

 

void menu2()
{
printf("\t****************************************\n");
printf("\t 1、调用键盘输入数据 \n");
printf("\t 2、调用文本写入数据 \n");
printf("\t 3、调用伪随机数的产生数据 \n");
printf("\t 0、退出系统 \n");
printf("\t****************************************\n");
printf("\t请选择菜单项:");
}

void menu(){
printf("\t*****************************************************\n");
printf("\t* welcome *\n");
printf("\t*****************************************************\n");
printf("\t* 1、FCFS(先到先服务)算法调度 *\n");
printf("\t* 2、SJF(短作业优先)算法调度 *\n");
printf("\t* 3、HRRF(最高响应比)算法调度 *\n");
printf("\t* 0、后退到上一级菜单 *\n");
printf("\t*****************************************************\n");
printf("请选择功能<0~3>:");
}

void insert(int n)
{
int i,j;
char name[10];
int arrtime1;
int reqtime1;
printf("what?\n");
printf("输入作业名:");
scanf("%s",name);
printf("到达时间:");
scanf("%d",&arrtime1);
printf("要求服务时间:");
scanf("%d",&reqtime1);
printf("\n");
for(i=0;i<=n;i++)
{
if(arrtime1<job[i].arrtime)
{
for(j=n-1;j>=i;j--)
{
job[j+1].arrtime=job[j].arrtime;
strcpy(job[j+1].name,job[j].name);
job[j+1].reqtime=job[j].reqtime;

}
job[i].arrtime=arrtime1;
strcpy(job[i].name,name);
job[i].reqtime=reqtime1;
//n=n+1;
break;
}
if((i=n)&&(arrtime1>=job[i].arrtime))
{
job[i].arrtime=arrtime1;
job[i].reqtime=reqtime1;
strcpy(job[i].name,name);
}
}
for(i=0;i<=n;i++)
{
printf("N %d\t%s\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime);
}
}

void Delete(int n)
{

int i,j;
int arrtime1;
printf("what?\n");
printf("input the data to delete:");
scanf("%d",&arrtime1);
for(i=0;i<n;i++)
{
if(arrtime1==job[i].arrtime)
{
for(j=i+1;j<n;j++)
{
job[j-1].arrtime=job[j].arrtime;
job[j-1].reqtime=job[j].reqtime;
strcpy(job[j-1].name,job[j].name);
}
}
}
printf("\tname\tarrtime\treqtime\n");
for(i=0;i<n-1;i++)
{
printf("N %d\t%s\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime);
}
}
void all(int n)
{
//int i,j;
char ch;
//int arrtime1;
//int reqtime1;
printf("Insert or Delete or Exit?");
scanf("%s",&ch);
if(ch=='I' || ch=='i')
{
insert(n);
}
else if(ch=='D' || ch=='d')
{

Delete(n);

}
else if(ch=='E' || ch=='e')
{
exit(0);

}
}

//调用键盘输入数据
void input()
{
int i,j,n;
//char ch[10];
struct jcb temp;
printf("\t作业个数:");
scanf("%d",&n);
printf("\n");
for(i=0;i<n;i++){
printf("第%d个作业:\n",i+1);
printf("输入作业名:");
scanf("%s",job[i].name);
printf("到达时间:");
scanf("%d",&job[i].arrtime);
printf("要求服务时间:");
scanf("%d",&job[i].reqtime);
printf("\n");
}

for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(job[i].arrtime>job[j].arrtime){
temp=job[i];
job[i]=job[j];
job[j]=temp;
}
}
}
printf("经按到达时间排序后,未达到队列是\n");
printf("\tname\tartime\trqtime\n");
for(i=0;i<n;i++){
printf("N %d\t%s\t%d\t%d\n",i+1,job[i].name,job[i].arrtime,job[i].reqtime);
}
all(n);
printf("\n\t现在系统时间 0:\n");
}
main(){
int n,p;
while(1){
menu2();
scanf("%d",&n);
if(n==0) break;
switch(n){
case 1:input();
while(1){
menu();
scanf("%d",&p);
if(p==0) break;
switch(p){
case 1:TheFCFS();break;
case 2:TheSJF();break;
case 3:TheHRRF();break;
case 0:p=0;break;}}
break;
case 2:ReadFile();
while(1){
menu();
scanf("%d",&p);
if(p==0) break;
switch(p){
case 1:TheFCFS();break;
case 2:TheSJF();break;
case 3:TheHRRF();break;
case 0:p=0;break;}}
break;
case 3:Pseudo_random_number();
while(1){
menu();
scanf("%d",&p);
if(p==0) break;
switch(p){
case 1:TheFCFS();break;
case 2:TheSJF();break;
case 3:TheHRRF();break;
case 0:p=0;break;}}
break;
case 0:n=0;break;
}

}
printf("please any key to continue......");
getchar();
}

 

posted on 2016-04-22 16:59  33甄增文  阅读(81)  评论(0编辑  收藏  举报