Round Robin & Shortest Job First in C/C++

Hey guys, its project I had worked on. It is used for process scheduling. Please save the file with .cpp extension. Hope you guys like it. Here's the screen shot of the output.



Here's the source code, enjoy coding..


/*
Pogrammer : Ashok Kumar Shrestha
Program: Round Robin and Shortest job first scheduling
*/

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>
#include<process.h>
struct proc
{
int id;
int arrival;
int burst;
int rem;
int wait;
int finish;
int ti;
int turnaround;
float ratio;
}process[10];

int no,k;
int chkprocess(int);
int nextprocess1();
int nextprocess(int);
void main1();
void rr();
void sjs();
void input(int num);
void oppage(int, int);
void bar_print(int,int);
void table_print(int);

void loading()
{
int d=3,i,x1=120,y1=350,x2=x1+400,y2=y1+15;
char arr[10];
cleardevice();
moveto(260,50);
setcolor(7);
settextstyle(4,0,10);
outtext("A");
settextstyle(1,0,1);
moveto(250,200);
outtext("PRODUCTION");
delay(600);

setcolor(1);
setfillstyle(1,3);
rectangle(x1,y1,x2,y2);
rectangle(x1-d,y1-d,x2+d,y2+d);
floodfill(x1-1,y1-1,1);
setcolor(7);
settextstyle(8,0,1);
outtextxy(x1,y1-30,"Loading...");
setfillstyle(1,2);
for(i=0;i<100;i++)
{
delay(100);
bar(x1+1,y1+1,x1+i*4+3,y2-1);
gotoxy(x2/8-2,y1/17+1);
printf("%d %",i+1);
}
getch();
}
void hexagon(int d,int stta,int etta,int color)
{
int i,j,mx=getmaxx()/2,my=getmaxy()/2+5,x[6],y[6];
struct arccoordstype arcinfo;

for(i=0;i<6;i++)
{
setcolor(0);
arc(mx,my,stta+60*i,etta+60*i,d);
getarccoords(&arcinfo);
x[i]=arcinfo.xend;
y[i]=arcinfo.yend;
setcolor(color);
}
for(i=0;i<5;i++)
{
line(x[i],y[i],x[i+1],y[i+1]);
}
line(x[5],y[5],x[0],y[0]);
}
void pattern()
{
cleardevice();
int i,j,k;
setcolor(9);
for(i=0;i<17;i++)
{
hexagon(i*10,45+i*10,80+i*10,3);
      // hexagon(i*10,0,180);// for regular eqidistance hexagon. vary last angle to obtain hexagon oreinted in different direction.
delay(50);
}
}

int intro()
{
loading();
pattern();
return 0;
}

int frst_page()
{
int x1=5,y1=5,x2=getmaxx(),y2=getmaxy();
int d1=3;
setcolor(14);
rectangle(x1,y1,x2,y2);
rectangle(x1+d1,y1+d1,x2-d1,y2-d1);

setcolor(11);
rectangle(x1+2*d1,y1+10,x2-2*d1,y2-390);
rectangle(x1+3*d1,y1+10+d1,x2-3*d1,y2-390-d1);

setcolor(10);
rectangle(x1+2*d1+75,y2-375,x2-2*d1-75,y2-90);
rectangle(x1+3*d1+75,y2-375+d1,x2-3*d1-75,y2-90-d1);

setcolor(12);
rectangle(x1+2*d1+100,y2-75,x2-2*d1-100,y2-15);
rectangle(x1+3*d1+100,y2-75+d1,x2-3*d1-100,y2-15-d1);

settextstyle(2,0,7);
setcolor(14);
outtextxy(18,40,"<<<< Graphical Simulation of Scheduling Algorithm >>>>");
setcolor(14);
outtextxy(110,150,"1. Shortest Job First scheduling ");
outtextxy(110,200,"2. Round Robin scheduling");
outtextxy(110,250,"3. About ");
outtextxy(110,300,"4. Press Esc to exit");
setcolor(13);
outtextxy(180,420,"Enter your choice . . .     ");

int ch=0;
ch=getch();
       // printf("%d",ch-48);
if(ch==27)
exit(0);
return (ch-48);
}
void about()
{
cleardevice();
setcolor(14);
settextstyle(2,0,7);
outtextxy(290,20,"About");
setfillstyle(1,14);
bar(260,50,370,52);

settextstyle(2,0,6);
setcolor(10);
outtextxy(5,70,"This program is about graphical simulation of Scheduling algorithms") ;
outtextxy(5,100,"Currently we can simulate two algorithms, round robin and shortest");
outtextxy(5,130,"job first. This is the combined project by me and my fellow ");
outtextxy(5,160,"programmers.");
settextstyle(2,0,7);
setcolor(14);
outtextxy(200,200,"About the programmer:");
setfillstyle(1,14);
bar(165,230,470,233);

setcolor(11);
outtextxy(200,250,"Ashok Kumar Shrestha");
setcolor(14);
rectangle(50,400,600,460);

setfillstyle(1,11);
setcolor(13);
outtextxy(100,420,"Do you want do go to main menu? (Y/N)");

char ch;
ch=getch();
if(ch=='y'||ch=='Y')
{
cleardevice();
main1();
}
else
exit(0);

}

void main1()
{
int choice=0;
choice=frst_page();
clrscr();
cleardevice();

switch(choice)
{
case 1: sjs(); break;
case 2: rr();    break;
case 3:         about(); break;
default: exit(0);
}
}

void main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"..\\bgi");
cleardevice();

intro();
main1();
}

void oppage(int s,int n)
{
cleardevice();

setcolor(14);
settextstyle(1,0,3);
if(s==1)
{
outtextxy(46,20,"<<< Simulation :");
setcolor(11);
outtextxy(245,20," Shortest Remaining Time >>>");
}

else if(s==2)
{ outtextxy(110,20,"<<< Simulation :");
setcolor(11);
outtextxy(320,20,"Round Robin >>>");
}
setcolor(13);
settextstyle(2,0,6);
outtextxy(15,70,"Process : ");

outtextxy(15,95,"Time : ");
int x1=getmaxx(),y1=getmaxy();
setcolor(11);
rectangle(5,5,x1-5,y1-5);
setcolor(10);
rectangle(10,10,x1-10,65);
rectangle(10,70,150,y1-200);
rectangle(150,70,x1-10,y1-200);
rectangle(10,y1-195,x1-10,y1-10);
rectangle(10,70,150,120);

char array[40];
for(int i=0;i<n;i++)
{
setfillstyle(1,(i+7)%15);
bar(20,130+i*20-2,40,130+(i+1)*20-2);

moveto(50,130+(i)*20-2);
setcolor(15);
sprintf(array,"P%d",i+1);
outtext(array);
}
outtextxy(20,y1-175,"Process");
outtextxy(335,y1-195,"Time");
outtextxy(120,y1-175,"Arrival");
outtextxy(240,y1-175,"Burst");
outtextxy(340,y1-175,"Waiting");
outtextxy(450,y1-175,"Turn around");
line(100,y1-174,x1-10,y1-174);
line(10,y1-155,x1-10,y1-155);
line(100,y1-195,100,y1-10);
for(i=0;i<n;i++)
{
moveto(60,y1-150+i*20);
setcolor(11);
sprintf(array,"P%d",i+1);
outtext(array);
}
delay(800);
// outextxy(640,y1-175u,"Process");
       // bar_print(n,23,4);
// table_print(7,2);
}

void bar_print(int t,int p)
{
delay(500);
char array[40];
setcolor(14);

settextstyle(2,0,6);
setfillstyle(1,0);
bar(105,72,130,90);
bar(80,97,115,115);


moveto(110,70);
setcolor(11);
sprintf(array,"P%d",p);   /////display new process
outtext(array);

moveto(80,95);
setcolor(11);
sprintf(array,"%2ds",t);   ///// display current time
outtext(array);

setfillstyle(1,(6+p)%15);
bar(160+((t-1)%23)*20,80+(t-1)/23*30,160+((t-1)%23+1)*20-3,80+((t-1)/23+1)*30-15);
settextstyle(2,0,4);

moveto(165+((t-1)%23)*20,80+(t-1)/23*30);
setcolor(0);
sprintf(array,"P%d",p);
outtext(array);


setcolor(15);
settextstyle(2,1,4);
/*
moveto(158+((t-1)%23)*20,80+((t-1)/23+1)*20-4);
sprintf(array,"%d",t-1);
outtext(array);
*/
moveto(155+((t-1)%23+1)*20,80+((t-1)/23+1)*30-15);
sprintf(array,"%d",t);
outtext(array);

}

void table_print(int n)
{
int y1=getmaxy();
char array[20];
settextstyle(2,0,6);
for(int i=0;i<n;i++)
{
moveto(140,y1-150+i*20);
setcolor(11);
sprintf(array,"%2ds",process[i+1].arrival);   ///// display arrival time
outtext(array);

moveto(260,y1-150+i*20);
setcolor(11);
sprintf(array,"%2ds",process[i+1].burst);   ///// display burst time
outtext(array);

moveto(360,y1-150+i*20);
setcolor(11);
sprintf(array,"%2ds",process[i+1].wait);   ///// display wait time
outtext(array);

moveto(500,y1-150+i*20);
setcolor(11);
sprintf(array,"%2ds",process[i+1].turnaround);   ///// display turnaround time
outtext(array);
}
float avgwt=0;
for(i=1;i<=n;i++)
{
avgwt+=process[i].wait;
}
moveto(160,y1-240);
setcolor(11);
sprintf(array,"Average waiting time : %.2fs",(float)avgwt/n);   ///// display average wait time
outtext(array);

float avg=0;
for(i=1;i<=n;i++)
{
avg+=process[i].turnaround;
}
moveto(160,y1-220);
setcolor(11);
sprintf(array,"Average Turn around time : %.2fs",(float)avg/n);   ///// display average turnaround time
outtext(array);
if(getch()==28)
exit(0);
else
{ cleardevice();
main1();
}

}

void input(int num)
{
int i=0,j=0,boxw=100,boxh=35,n1=3;
int x=getmaxx()/2-(boxw*n1)/2;//,y=getmaxy()/2-(boxh*(num+1))/2;
int y=20;
for(j=0;j<n1;j++)
rectangle(x+j*boxw,y+i*50,x+(j+1)*boxw,y+(i+1)*50);
for(i=0;i<num;i++)
{
for(j=0;j<n1;j++)
{
rectangle(x+j*boxw,y+i*boxh+60,x+(j+1)*boxw,y+(i+1)*boxh+60);
}
}
settextstyle(2,0,7);
setcolor(14);
outtextxy(x+10,y+10,"Process");
outtextxy(x+15+1*boxw,y+10,"Arrival");
outtextxy(x+15+2*boxw,y+10,"Burst");

char array[40];
for(i=0;i<num;i++)
{
for(j=0;j<n1;j++)
{
gotoxy(26+j*12,7+i*2);
if(j==0)
printf("P%d",i+1);
else if(j==1)
{
printf("-> ");
scanf("%d",&(process[i+1].arrival));
}
else if(j==2)
{
printf("-> ");
scanf("%d",&(process[i+1].burst));
}

/*
moveto(x2+15,y2+10);
sprintf(array,"%d",cur);
outtext(array);
*/
}
}

}

void rr()
{
int i, j,t,time = 0,n;
struct proc temp;


setcolor(14);
settextstyle(3,0,4);
outtextxy(65,50,"---ROUND ROBIN SCHEDULING---");
setcolor(11);
line(10,95,630,95);
setcolor(10);
settextstyle(2,0,8);
outtextxy(75,200,"Enter the number of processes:");
setcolor(11);
rectangle(550,190,600,240);
gotoxy(72,14);
scanf("%d", &n);

setcolor(10);
outtextxy(75,300,"Enter the time slice of the CPU:");
setcolor(11);
rectangle(550,290,600,340);
gotoxy(72,20);
scanf("%d", &t);

cleardevice();

input(n);
oppage(2,n);
for(i = 1; i <= n; i++)
{
process[i].id = i;
process[i].rem = process[i].burst;
process[i].ti=0;
process[i].wait=0;
process[i].finish=0;

}
for(i = 1; i <= n; i++)
{
for(j = i + 1; j <= n; j++)
{
if(process[i].arrival > process[j].arrival)
{
temp = process[i];
process[i] = process[j];
process[j] = temp;
}
}
}

no = 0;
j = 1;
int prev=0;
while(chkprocess(n) == 1)
{
prev=j;
if(process[no + 1].arrival == time)
no++;

if((process[j].ti<=t)&&(process[j].rem !=0))
{
process[j].rem--;
process[j].ti++;
//if(prev!=0)
 // printf("P%d-->",prev);
time++;
bar_print(time,prev);
if(process[j].rem==0)
process[j].finish=time;

for(i = 1; i <= no; i++)
{
if((i!=j) && (process[i].rem != 0))
process[i].wait++;
}
}
if((process[j].ti >= t)||(process[j].rem==0))
{

process[j].ti = 0;
j=nextprocess(j);
}

}
process[n].finish = time;

for(i = 1; i <= n; i++)
{

process[i].turnaround = (process[i].wait-1) + process[i].burst;
process[i].ratio = (float)process[i].turnaround / (float)process[i].burst;
 /*
printf("%5d %8d %7d  %8d %10d %9d %10.1f ", process[i].id, process[i].arrival,
 process[i].burst,
 process[i].wait - 1, process[i].finish,
 process[i].turnaround, process[i].ratio);

printf("\n\n");
*/
}
table_print(n);
}
void sjs()
{
int i, j,t,time = 0,n;
struct proc temp;

setcolor(14);
settextstyle(3,0,3);
outtextxy(65,50,"---SHORTEST REMAIMIMG TIME SCHEDULING---");
setcolor(11);
line(10,95,630,95);
setcolor(10);
settextstyle(2,0,8);
outtextxy(75,200,"Enter the number of processes:");
setcolor(11);
rectangle(550,190,600,240);
gotoxy(72,14);
scanf("%d", &n);

cleardevice();
input(n);

oppage(1,n);

for(i = 1; i <= n; i++)
{
process[i].id = i;
process[i].rem = process[i].burst;
process[i].ti=0;
process[i].wait=0;
process[i].finish=0;

}

for(i = 1; i <= n; i++)
{
for(j = i + 1; j <= n; j++)
{
if(process[i].arrival > process[j].arrival)
{
temp = process[i];
process[i] = process[j];
process[j] = temp;
}
}
}

no = 0;
j = 1;
time=0;
int prev=0;
while(chkprocess(n) == 1)
{       prev=j;
if(process[no + 1].arrival == time)
{
no++;
if(process[j].rem==0)
   process[j].finish=time;
j = nextprocess1();
}

if(process[j].rem != 0)
{
process[j].rem--;
time++;
bar_print(time,j);
for(i = 1; i <= no; i++)
{
if(i != j && process[i].rem != 0)
process[i].wait++;
}
}
else
{

process[j].finish = time;
j=nextprocess1();
      // time--;
k=j;

}


}
process[k].finish = time;

for(i = 1; i <= n; i++)
{
process[i].turnaround = process[i].wait + process[i].burst;
}

/*
printf("\n\n\t\t\t---SHORTEST REMAINING TIME NEXT---");
printf("\n\n Process  Arrival  Burst   Waiting  Finishing turnaround  Tr/Tb \n");
printf("%5s %9s %7s %10s %8s %9s\n\n", "id", "time", "time", "time", "time", "time");


for(i = 1; i <= n; i++)
{

process[i].turnaround = process[i].wait + process[i].burst;
process[i].ratio = (float)process[i].turnaround / (float)process[i].burst;

printf("%5d %8d %7d  %8d %10d %9d %10.1f ", process[i].id, process[i].arrival,
 process[i].burst,
 process[i].wait, process[i].finish,
 process[i].turnaround, process[i].ratio);

printf("\n\n");
}
*/
table_print(n);
getch();
exit(0);

}


int nextprocess1()
{
int min, l, i;
min = 32000;
for(i = 1; i <= no; i++)
{
if( process[i].rem!=0 && process[i].rem < min)
{
min = process[i].rem;
l = i;
}
}
return l;
}



int chkprocess(int s)
{
int i;
for(i = 1; i <= s; i++)
{
if(process[i].rem != 0)
return 1;
}
return 0;
}

 int nextprocess(int k)
{
int i;

i=k+1;

while(chkprocess(i) && i!=k)

{
if(process[i].rem != 0)

return(i);
else
i=(i+1)%no;
}
return i;
 }
//End of program

Comments

Popular posts from this blog

Wizard Quiz: Privacy Policy

Sorting Hat: Privacy Policy

mTranslator