Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program lab;
- uses
- windows, crt;
- label showMassive,showCPUtime,ShowSortResult,sortingstats,showmdlngrsltAve,showmdlngrsltFull,search,1,11,111,1111,112,113,12,121,1211,122,123,13,131,132,133,14,666;
- procedure numSorting(scn:integer;a:array of integer;srtdA:array of integer;anum:array of integer;var srtdnum:array of integer);
- var i,j,k,povt:integer;
- begin
- for i:=1 to scn do
- begin
- povt:=0;
- for j:=1 to scn do
- begin
- if srtdA[i]=a[j] then
- begin
- srtdnum[i]:=anum[j];
- if i>1 then
- begin
- for k:=1 to i-1 do
- if srtdnum[i]=srtdnum[k] then
- begin
- povt:=1;
- break;
- end
- else
- povt:=0;
- end;
- if povt=1 then
- continue;
- break;
- end;
- end;
- end;
- end;
- procedure Sliv(var a:array of integer;p,q : integer;var com1,per1:int64);{Їа®жҐ¤га б«Ёў ой п ¬ ббЁўл, p- з «®, q-Є®Ґж}
- var r,i,j,k : integer;
- b:array[1..10000]of integer;
- begin
- r:=(p+q) div 2;{¤Ґ«Ё¬ ¬ ббЁў}
- i:=p;{ з «® «Ґў®© Ї®«®ўЁл}
- j:=r+1;{ з «® Їа ў®© Ї®«®ўЁл}
- for k:=p to q do{ᬮваЁ¬ ®в з « ¤® Є®ж }
- begin
- com1:=com1+3;
- if (i<=r) and ((j>q) or (a[i]<a[j])) then
- {ЇҐаҐбв ў«пҐ¬ н«Ґ¬Ґвл Ё§ Ї®«®ўЁ ў ®ўл© ¬ ббЁў, гЇ®а冷稢 п Ї ал}
- begin
- per1:=per1+1;
- b[k]:=a[i];
- i:=i+1;
- end
- else
- begin
- per1:=per1+1;
- b[k]:=a[j];
- j:=j+1;
- end ;
- end;
- for k:=p to q do
- begin
- per1:=per1+1;
- a[k]:=b[k];
- end;
- end;
- {४габЁў п Їа®жҐ¤га б®авЁа®ўЄЁ, Їа®ўҐапҐв Ґб«Ё ®бв «®бм
- Ў®«миҐ ®¤®Ј® н«Ґ¬Ґв , Ї®ўв®апҐв б«ЁпЁҐ ў «Ґў®© Ё«Ё Їа ў®© з бвпе ¬ ббЁў }
- procedure Sort(var a:array of integer;p,q : integer;var com,per:int64); {p,q - Ё¤ҐЄбл з « Ё Є®ж б®авЁа㥬®© з бвЁ ¬ ббЁў }
- begin
- if p<q then {¬ ббЁў Ё§ ®¤®Ј® н«Ґ¬Ґв ваЁўЁ «м® гЇ®а冷зҐ}
- begin
- Sort(a,p,(p+q) div 2,com,per);{б®авЁа㥬 «Ґўго Ї®«®ўЁг}
- Sort(a,(p+q) div 2 + 1,q,com,per);{Їа ўго Ї®«®ўЁг}
- Sliv(a,p,q,com,per);{б«Ёў Ґ¬ ¤ўҐ Ї®«®ўЁл}
- end;
- end;
- var
- i,j,k,l:integer; {ЇҐаҐ¬ҐлҐ жЁЄ«®ў}
- f,e:text; {а Ў®в б ⥪б⮬}
- p1,p11,p12,p13:string; {ЇгЄв ¬Ґо (бва®Є®ўл© вЁЇ)}
- cp1,cp11,cp12,cp13:integer; {ЇгЄв ¬Ґо}
- n,CPUn:string; {Є®«-ў® Ї®в®Є®ў/ўаҐ¬Ґ Їа®ж-а (бва®Є®ўл© вЁЇ)}
- cn,cCPUn:integer; {Є®«-ў® Ї®в®Є®ў/ўаҐ¬Ґ Їа®ж-а }
- c:integer; {"§ йЁв ®в ¤га Є®ў"}
- MINthrd:integer; {¬ЁЁ¬ «мл© Ї®в®Є (б®авЁа®ўЄ ўлЎ®а®¬)}
- MINthrdNUM:integer; {®¬Ґа ¬ЁЁ¬ «м®Ј® Ї®в®Є (б®авЁа®ўЄ ўлЎ®а®¬)}
- res,start1,finish1,start2,finish2,start3,finish3:int64; {Ё§¬ҐаҐЁҐ ўаҐ¬ҐЁ}
- permnum1,comparsnum1,permnum2,comparsnum2,permnum3,comparsnum3:int64; {Є®«ЁзҐбвў® ЇҐаҐбв ®ў®Є Ё ба ўҐЁ©}
- sthread:array [0..10000]of string; {Ї®в®ЄЁ (бва®Є. вЁЇ)}
- thread:array [0..10000]of integer; {Ї®в®ЄЁ}
- sortedthrd:array [0..10000] of integer; {б®авЁа®ў л© ¬ ббЁў Ї®в®Є®ў}
- sortednum:array [0..10000] of integer; {б®авЁа®ў л© ¬ ббЁў ®¬Ґа®ў Ї®в®Є®ў}
- num:array [0..10000]of integer; {®¬Ґа н«-в®ў ¬ бЁў }
- cs:array [byte]of integer; {б®авЁа®ўЄ Ї®¤бзҐв®¬ (ўбЇ®¬. ¬ ббЁў)}
- sort3:integer; {Їа®ўҐапҐв, ўлЇ®«п« бм «Ё б®авЁа®ўЄ Ї®¤бзҐв®¬}
- sCPUtime:array [0..10000] of string; {ўаҐ¬Ґ Їа®ж-а (бва®Є. вЁЇ)}
- CPUtime:array [1..10000]of integer; {ўаҐ¬Ґ Їа®ж-а }
- used:array[1..1000] of integer;
- manual:byte;
- usedthrds:integer;
- ost:integer;
- bin:integer;
- min,max,mid:integer;
- mdldmas,mdldnum:integer;
- sumcpu,realsumcpu:integer;
- stroka:integer;
- found:integer;
- begin
- sort3:=0;
- queryperformancefrequency (res);
- 1:clrscr;
- writeln (' ***OS Thread scheduler Emulator***');
- writeln (' Main Menu (Choose point 1-8)');
- writeln (' 1.Insert threads');
- writeln (' 2.Sorting');
- writeln (' 3.Modelling');
- writeln (' 4.Exit');
- readln (p1);
- clrscr;
- val (p1,cp1,c);
- if c <> 0 then
- begin
- writeln;
- writeln ('ERROR! Insert number from 1 to 8 (Press Enter to back to menu)');
- readln;
- goto 1;
- end;
- case cp1 of
- 1: goto 11;
- 2: begin
- if cn=0 then
- begin
- clrscr;
- writeln ('You must insert threads first');
- readln;
- goto 1;
- end;
- goto 13;
- end;
- 3: begin
- if cn=0 then
- begin
- clrscr;
- writeln ('You must insert threads first');
- readln;
- goto 1;
- end
- else
- begin
- if sortednum[1]=0 then
- begin
- clrscr;
- writeln ('You must sort theads first');
- readln;
- goto 1;
- end
- else
- if cCPUn=0 then
- begin
- clrscr;
- writeln ('You must insert CPU times first');
- readln;
- goto 12;
- end;
- end;
- goto 14;
- end;
- 4: goto 666;
- else writeln ('Choose point 1-4 (Enter=Ok)'); readln; goto 1;
- end;
- 11:clrscr;
- writeln (' Insert threads');
- Writeln (' Choose insert type (1-3)');
- writeln (' 1.Manual filling (If number of threads < 20)');
- writeln (' 2.Autofilling');
- writeln (' 3.From file (Threads.txt)');
- writeln (' 4.Back to main menu');
- readln (p11);
- clrscr;
- val (p11,cp11,c);
- if c <> 0 then
- begin
- writeln;
- writeln ('ERROR! Insert number from 1 to 4 (Press Enter to back to menu)');
- readln;
- goto 11;
- end;
- c:=0;
- case cp11 of
- 1:goto 111;
- 2:goto 112;
- 3:goto 113;
- 4: goto 1;
- else writeln ('Choose point 1-4 (Enter=Ok)');readln;clrscr;goto 11;
- end;
- 111:clrscr;writeln ('Insert number of threads (1-20)');
- readln (n);
- clrscr;
- val (n,cn,c);
- if c <> 0 then
- begin
- writeln;
- writeln ('ERROR! Insert number from 1 to 20 (Press Enter to back to menu)');
- readln;
- goto 11;
- end;
- if (cn<1) or (cn>20) then
- begin
- writeln ('Insert number from 1 to 20 (Enter=Ok)');
- readln;
- goto 111;
- end;
- 1111:clrscr;
- writeln ('Insert threads (Numbers from 0 to 255)');
- for i:=1 to cn do
- begin
- write (i, ' thread: ');
- readln (sthread[i]);
- val (sthread[i],thread[i],c);
- if c<>0 then
- begin
- clrscr;
- writeln;
- writeln ('ERROR! Insert number from 0 to 255 (Press enter to back to menu)');
- readln;
- goto 11;
- end;
- if (thread[i]<0) or (thread[i]>255) then
- begin
- clrscr;
- writeln;
- writeln ('Insert number from 0 to 255 (Enter=Ok)');
- readln;
- goto 1111;
- end;
- num[i]:=i;
- end;
- clrscr;
- comparsnum1:=0;
- comparsnum2:=0;
- sort3:=0;
- sortednum[1]:=0;
- goto showmassive;
- 112:clrscr;writeln ('Insert number of threads (1-1000)');
- readln (n);
- clrscr;
- val (n,cn,c);
- if c<>0 then
- begin
- writeln;
- writeln ('ERROR! Insert number from 1 to 1000 (Press enter to back to menu)');
- readln;
- goto 11;
- end;
- if (cn<1) or (cn>1000) then
- begin
- writeln ('Insert number from 1 to 1000 (Enter=Ok)');
- readln;
- goto 112;
- end;
- for i:=1 to cn do
- begin
- thread[i]:=random(255);
- num[i]:=i;
- end;
- clrscr;
- comparsnum1:=0;
- comparsnum2:=0;
- sort3:=0;
- sortednum[1]:=0;
- goto showmassive;
- 113:clrscr;
- assign (f,'Threads.txt');
- reset (F);
- i:=0;
- while not eof(f) do
- begin
- i:=i+1;
- num[i]:=i;
- read (f,thread[i]);
- if (thread[i]<0) or (thread[i]>255) then
- begin
- clrscr;
- writeln;
- writeln ('Error! Threads.txt must be filled with numbers from 0 to 255 (Press Enter to back to menu)');
- readln;
- close (f);
- goto 11;
- end;
- end;
- close (f);
- cn:=i;
- clrscr;
- comparsnum1:=0;
- comparsnum2:=0;
- sort3:=0;
- sortednum[1]:=0;
- goto showmassive;
- 12:clrscr;
- writeln (' Insert CPU times');
- Writeln (' Choose insert type (1-3)');
- writeln (' 1.Manual filling (If number of times < 20)');
- writeln (' 2.Autofilling');
- writeln (' 3.From file (CPUtimes.txt)');
- writeln (' 4.Back to main menu');
- readln (p12);
- clrscr;
- val (p12,cp12,c);
- if c <> 0 then
- begin
- writeln;
- writeln ('ERROR! Insert number from 1 to 4 (Press Enter to back to menu)');
- readln;
- goto 12;
- end;
- case cp12 of
- 1:goto 121;
- 2:goto 122;
- 3:goto 123;
- 4:goto 1;
- else writeln ('Choose point 1-4 (Enter=Ok)');readln;clrscr;goto 12;
- end;
- 121:clrscr; manual:=1;goto 14;
- 122:clrscr;writeln ('Insert number of CPU times (1-1000)');
- readln (CPUn);
- clrscr;
- val (CPUn,cCPUn,c);
- if c<>0 then
- begin
- writeln;
- writeln ('ERROR! Insert number from 1 to 1000 (Press enter to back to menu)');
- readln;
- goto 12;
- end;
- if (cCPUn<1) or (cCPUn>1000) then
- begin
- writeln ('Insert number from 1 to 1000 (Enter=Ok)');
- readln;
- goto 122;
- end;
- for i:=1 to cCPUn do
- begin
- CPUtime[i]:=random(255)+1;
- end;
- clrscr;
- goto ShowCPUtime;
- 123:clrscr;
- assign (e,'CPUtimes.txt');
- reset (e);
- i:=0;
- while not eof(e) do
- begin
- i:=i+1;
- read (e,CPUtime[i]);
- if (CPUtime[i]<0) or (CPUtime[i]>255) then
- begin
- clrscr;
- writeln;
- writeln ('Error! CPUtimes.txt must be filled with numbers from 0 to 255 (Press Enter to back to menu)');
- readln;
- close (e);
- goto 12;
- end;
- end;
- close (e);
- cCPUn:=i;
- clrscr;
- goto showCPUtime;
- 13:clrscr;
- writeln (' Sorting');
- writeln (' Choose sorting type');
- writeln (' 1.Selection');
- writeln (' 2.Merge ');
- writeln (' 3.Counting');
- writeln (' 4.Back to main menu');
- readln (p13);
- clrscr;
- val (p13,cp13,c);
- if c<>0 then
- begin
- writeln;
- writeln ('Error! Insert number from 1 to 4 (Enter=ok)');
- readln;
- goto 13;
- end;
- case cp13 of
- 1: goto 131;
- 2: goto 132;
- 3: goto 133;
- 4: goto 1;
- else writeln ('Choose point 1-4 (Enter=ok)'); readln; goto 13;
- end;
- 131:clrscr;
- permnum1:=0;
- comparsnum1:=0;
- write ('Sorting of threads.Please wait... ');
- for i:=1 to cn do
- begin
- sortedthrd[i]:=thread[i];
- sortednum[i]:=num[i];
- end;
- queryperformancecounter (start1);
- for i:=1 to cn-1 do
- begin
- minthrdnum:=i;
- minthrd:=sortedthrd[i];
- for j:=i+1 to cn do
- begin
- comparsnum1:=comparsnum1+1;
- if sortedthrd[j]<minthrd then
- begin
- permnum1:=permnum1+1;
- minthrdnum:=j;
- minthrd:=sortedthrd[j];
- sortedthrd[minthrdnum]:=sortedthrd[i];
- sortedthrd[i]:=minthrd;
- end;
- end;
- end;
- queryperformancecounter (finish1);
- write ('ok');
- writeln;
- write ('Sorting of numbers.Please wait... ');
- numsorting(cn,thread,sortedthrd,num,sortednum);
- writeln ('ok');
- writeln;
- writeln ('Press Enter to show sorting statistics');
- readln;
- goto ShowSortResult;
- 132:clrscr;
- permnum2:=0;
- comparsnum2:=0;
- write ('Sorting of threads.Please wait... ');
- for i:=1 to cn do
- begin
- sortedthrd[i]:=thread[i];
- sortednum[i]:=num[i];
- end;
- queryperformancecounter (start2);
- sort(sortedthrd,1,cn,comparsnum2,permnum2);
- queryperformancecounter (finish2);
- write ('ok');
- writeln;
- write ('Sorting of numbers.Please wait... ');
- numsorting(cn,thread,sortedthrd,num,sortednum);
- writeln ('ok');
- writeln;
- writeln ('Press Enter to show sorting statistics');
- readln;
- goto ShowSortResult;
- 133:clrscr;
- sort3:=1;
- permnum3:=0;
- comparsnum3:=0;
- write ('Sorting of threads.Please wait... ');
- queryperformancecounter (start3);
- for i:=1 to 255 do
- cs[i]:=0;
- for i:=1 to cn do
- begin
- cs[thread[i]]:=cs[thread[i]]+1;
- sortednum[i]:=num[i];
- end;
- for i:=1 to 255 do
- cs[i]:=cs[i-1]+cs[i];
- for i:=cn downto 1 do
- begin
- permnum3:=permnum3+1;
- sortedthrd[cs[thread[i]]]:=thread[i];
- cs[thread[i]]:=cs[thread[i]]-1;
- end;
- queryperformancecounter (finish3);
- write ('ok');
- writeln;
- write ('Sorting of numbers.Please wait... ');
- numsorting(cn,thread,sortedthrd,num,sortednum);
- writeln ('ok');
- writeln;
- writeln ('Press Enter to show sorting statistics');
- readln;
- goto showsortresult;
- 14:clrscr;
- gotoxy(1,1);write ('CPUt');gotoxy(6,1);write ('SumT');gotoxy (12,1);write ('Thrd');gotoxy(18,1);write('No');gotoxy(24,1);write('Res');gotoxy(30,1);write('Attmepts');
- for i:=1 to cn do
- used[i]:=0;
- stroka:=2;
- usedthrds:=0;
- ost:=0;
- i:=0;
- while usedthrds<>cn do
- begin
- i:=i+1;
- if manual=0 then
- if i>ccpun then
- break;
- if manual=1 then
- begin
- gotoxy(1,stroka);read(cputime[i]);
- end
- else
- begin
- gotoxy(1,stroka);write(cputime[i]);
- end;
- realsumcpu:=cputime[i]+ost;
- sumcpu:=cputime[i]+ost;
- found:=0;
- bin:=0;
- min:=1;max:=cn;
- search:
- while (min<=max) and (found=0) do
- begin
- bin:=bin+1;
- mid:=(min+max)div 2;
- if sumcpu<sortedthrd[mid] then
- max:=mid-1
- else
- if sumcpu>sortedthrd[mid] then
- min:=mid+1
- else
- if used[mid]=1 then
- begin
- if mid<>cn then
- begin
- l:=1;
- while sortedthrd[mid+l]=sortedthrd[mid] do
- begin
- if used[mid+l]<>1 then
- begin
- mdldmas:=sortedthrd[mid+l];
- mdldnum:=sortednum[mid+l];
- ost:=realsumcpu-mdldmas;
- used[mid+l]:=1;
- found:=1;break;
- end;
- l:=l+1;
- if mid+l>cn then break;
- end;
- end;
- if (mid<>1) and (found=0) then
- begin
- l:=1;
- while sortedthrd[mid-l]=sortedthrd[mid] do
- begin
- if used[mid-l]<>1 then
- begin
- mdldmas:=sortedthrd[mid-l];
- mdldnum:=sortednum[mid-l];
- ost:=realsumcpu-mdldmas;
- used[mid-l]:=1;
- found:=1;break;
- end;
- l:=l+1;
- if mid-l<1 then break;
- end;
- end;
- break;
- end
- else
- begin
- mdldmas:=sortedthrd[mid];
- mdldnum:=sortednum[mid];
- used[mid]:=1;
- ost:=realsumcpu-mdldmas;
- found:=1;
- break;
- end;
- end;
- if (found=0) and (sumcpu>0) then
- begin
- sumcpu:=sumcpu-1;bin:=0;min:=1;max:=cn;
- goto search;
- end;
- if found=0 then
- ost:=realsumcpu
- else
- begin
- gotoxy(6,stroka);write (realsumcpu);gotoxy (12,stroka);write (mdldmas);gotoxy(18,stroka);write(mdldnum);gotoxy(24,stroka);write(ost);gotoxy(30,stroka);write(bin);
- stroka:=stroka+1;
- end;
- if found=1 then
- begin
- realsumcpu:=ost;
- sumcpu:=ost;
- found:=0;bin:=0;min:=1;max:=cn;
- goto search;
- end;
- usedthrds:=0;
- for j:=1 to cn do
- if used[j]=1 then
- usedthrds:=usedthrds+1;
- end;
- writeln;
- writeln ('Press ENTER to back to main menu');readln;readln;goto 1;
- showsortresult:
- clrscr;
- writeln ('Original massive of threads');
- gotoXY (1,2); writeln ('T');
- gotoXY (1,3); writeln ('N');
- if cn<16 then
- begin
- for i:=1 to cn do
- begin
- gotoXY (5*i,2);
- writeln (thread[i]);
- gotoXY (5*i,3);
- writeln (num[i]);
- end;
- writeln;
- end
- else
- begin
- for i:=1 to 14 do
- begin
- gotoXY (5*i,2);
- writeln (thread[i]);
- gotoXY (5*i,3);
- writeln (num[i]);
- end;
- gotoXY (75,2);
- writeln ('...');
- gotoXY (75,3);
- writeln ('...');
- writeln;
- end;
- writeln ('Sorted massive');
- gotoXY (1,6); writeln ('T');
- gotoXY (1,7); writeln ('N');
- if cn<16 then
- begin
- for i:=1 to cn do
- begin
- gotoXY (5*i,6);
- writeln (sortedthrd[i]);
- gotoXY (5*i,7);
- writeln (sortednum[i]);
- end;
- writeln;
- end
- else
- begin
- for i:=1 to 14 do
- begin
- gotoXY (5*i,6);
- writeln (sortedthrd[i]);
- gotoXY (5*i,7);
- writeln (sortednum[i]);
- end;
- gotoXY (75,6);
- writeln ('...');
- gotoXY (75,7);
- writeln ('...');
- writeln;
- end;
- sortingstats:writeln (' Stats');
- Writeln ('1. Selection sort');
- if comparsnum1=0 then
- begin
- writeln (' Sorting of that type has not been performed yet');
- end
- else
- begin
- writeln (' number of permutations = ', permnum1);
- writeln (' number of comparisons = ', comparsnum1);
- writeln (' time spent (sec) : ', (finish1-start1)/res);
- end;
- Writeln ('2. Merge sort');
- if comparsnum2=0 then
- begin
- writeln (' Sorting of that type has not been performed yet');
- end
- else
- begin
- writeln (' number of permutations = ', permnum2);
- writeln (' number of comparisons = ', comparsnum2);
- writeln (' time spent (sec) : ', (finish2-start2)/res);
- end;
- Writeln ('3. Counting sort');
- if sort3=0 then
- begin
- writeln (' Sorting of that type has not been performed yet');
- end
- else
- begin
- writeln (' number of permutations = ', permnum3);
- writeln (' number of comparisons = ', comparsnum3);
- writeln (' time spent (sec) : ',(finish3-start3)/res);
- end;
- writeln;
- writeln ('Press enter to back to main menu');
- readln;
- goto 1;
- showCPUtime:
- writeln ('CPUtimes');
- gotoXY (1,3); writeln ('T');
- if cCPUn<16 then
- begin
- for i:=1 to cCPUn do
- begin
- gotoXY (5*i,3);
- writeln (CPUtime[i]);
- end;
- writeln;
- writeln ('Press Enter to continue');
- readln;
- goto 14;
- end
- else
- begin
- for i:=1 to 14 do
- begin
- gotoXY (5*i,3);
- writeln (CPUtime[i]);
- end;
- gotoXY (75,3);
- writeln ('...');
- writeln;
- writeln ('Press Enter to continue');
- readln;
- manual:=0;
- goto 14;
- end;
- showmassive:
- writeln (' Threads');
- gotoXY (1,3); writeln ('T');
- gotoXY (1,4); writeln ('N');
- if cn<16 then
- begin
- for i:=1 to cn do
- begin
- gotoXY (5*i,3);
- writeln (thread[i]);
- gotoXY (5*i,4);
- writeln (num[i]);
- end;
- writeln;
- writeln ('T-working time , N-number of thread');
- writeln;
- writeln ('Press Enter to back to main menu');
- readln;
- goto 1;
- end
- else
- begin
- for i:=1 to 14 do
- begin
- gotoXY (5*i,3);
- writeln (thread[i]);
- gotoXY (5*i,4);
- writeln (num[i]);
- end;
- gotoXY (75,3);
- writeln ('...');
- gotoXY (75,4);
- writeln ('...');
- writeln;
- writeln ('T-working time , N-number of thread');
- writeln;
- writeln ('Press Enter to back to main menu');
- readln;
- goto 1;
- end;
- 666:end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement