Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web
VAJA 13


1. naloga
Napisan je program, ki prebere priimek in ime osebe.
Vsebino spremenljivke T naj bi sestavljali za?etnici imena in priimka osebe,
lo?eni s piko. Zakaj program ne dela prav? Napišite ustrezne popravke!

Type Niz20=string[20];
Var Priimek, Ime, S : Niz20;
Begin
  Write('Vpisi ime: ');Readln(Ime);
  Write('Vpisi priimek: ');Readln(Priimek);
  S[1]:=Ime[1];
  S[2]:='.';
  S[3]:=Priimek[1];
  S[4]:='.';
  WriteLN('Zacetnice= ',S);
End.

Program ne dela, ker ?e prirejamo stringu vrednosti samo na dolo?enih mestih,
moramo biti pazljivi na dolžino stringa, ki pa je zapisana v S[0], ta pa je
v programu verjetno 0.

Type Niz20=string[20];
Var Priimek, Ime, S : Niz20;
Begin
  Write('Vpisi ime: ');Readln(Ime);
  Write('Vpisi priimek: ');Readln(Priimek);
  S[1]:=Ime[1];
  S[2]:='.';
  S[3]:=Priimek[1];
  S[4]:='.';
  S[0]:=Chr(4);
  WriteLN('Zacetnice= ',S);
End.
 

2. naloga
Preverite pravilnost delovanja naslednjega programa.
Spremenite algoritem sortiranja tako, da bo 'inteligentnejši' in s tem tudi hitrejši.

Var T : Array[1..10] of integer;
    i,j,pom:integer;
Begin
  randomize;
  For i:=1 to 10 do begin
    t[i]:=Random(100); Write(t[i]:3);
  End;
  Writeln;
  For i:=1 to 10 Do
    For j:= 1 to 10 Do
      If t[j]>=t[i] then begin
        pom:=t[i];
        t[i]:=t[j];
        t[j]:=pom;
      end;
  For i:=1 to 10 do begin
    Write(t[i]:3);
  End;
  Writeln;
End.
 

Var T : Array[1..10] of integer;
    i,j,pom:integer;
    b:boolean;
Begin
  randomize;
  For i:=1 to 10 do begin
    t[i]:=Random(100); Write(t[i]:3);
  End;
  Writeln;
  b:=true; i:=1;
  while (10 >= i) and b do begin
    b:=false;
    For j:= 1 to 10 Do
      If t[j]>=t[i] then begin
        b:=true;
        pom:=t[i];
        t[i]:=t[j];
        t[j]:=pom;
      end;
      inc(i);
  end;
  For i:=1 to 10 do begin
    Write(t[i]:3);
  End;
  Writeln; readln;
End.

3. naloga
Imamo 2-D tabelo celih števil. Tabela ima 10 stolpcev in 5 vrstic.
a) Napišite podprogram za vnos naklju?nih podatkov in intervala [10..99].
b) Napišite podprogram za izra?un povpre?ne vrednosti elementov v i-tem stolpcu.
c) Napišite podprogram, ki izpiše tabelo po stolpcih. Vrstni red stolpcev naj
        dolo?a naraš?ajo?a povpre?na vrednost elementov. (Potrebovali boste še 2 pomožni
        tabeli. V eni boste hranili povpre?ne vrednosti elementov v stolpcih, v drugi pa indekse
        teh stolpcev. Zato najprej napišite podprograma za polenjenje teh dveh tabel, nato podprogram
        za urejanje tabele povpre?nih vrednosti in nazadnje podprogram za izpis.)
d) Napišite podprogram, s katerim elementom k-te vrstice spremenite predznak.
Sestavite program, ki v seznamu izbir ponuja navedene podprograme.

uses crt;
const N=10;
const M=5;
type Tab=array[1..M,1..N] of integer;
var T:Tab;
    ch:Char;
    c:integer;
procedure RandomFill(var X:Tab);
var i,j:integer;
begin
    randomize;
    for i:=1 to M do
       for j:=1 to N do
          X[i,j]:=random(90) + 10;
    writeln('Random Number Generated.');
    writeln;
end;
function CalcAverage(var X:Tab;j:integer):integer;
var i,a:integer;
    u:boolean;
begin
   CalcAverage:=0;
   u:=j=0;
   if u then begin write('Calc Average In Column: '); readln(j); end;
   if (j > 0) and (N >= j) then begin
    a:=0;
    for i:=1 to M do a:=a + x[i,j];
    if u then writeln('An average in column ',j, ' is: ', a/M:3:2);
    CalcAverage:=trunc(a/m);
        if u then writeln;
   end;
end;
procedure InvertVal(var x:tab);
var i,j,a:integer;
begin
   write('Invert Value In Line: '); readln(i);
   if (i > 0) and (M >= i) then begin
    for j:=1 to N do x[i,j]:=x[i,j] * (-1);
    writeln('Value Inverted In Line ',i,'.');
        writeln;
   end;
end;
procedure PrintByAverage(Var x:tab);
type STab=array[1..2,1..10] of integer;
var Y:STab;
    i,j,pom1,pom2:integer;
begin
    for j:=1 to N do Y[1,j]:=j;
    for j:=1 to N do Y[2,j]:=CalcAverage(X,j);
    for i:=2 to N do begin
       pom1:=Y[1,i]; pom2:=Y[2,i]; j:=i-1;
       while (Y[2,j] > pom2) And (j>0) do begin
            Y[1,j+1]:=Y[1,j]; Y[2,j+1]:=Y[2,j]; Dec(j); end;
       Y[1,j+1]:=pom1; Y[2,j+1]:=pom2;
    end;
    for i:=1 to M do begin
       for j:=1 to N do write(X[i,Y[1,j]]:4);
       writeln;
    end;
    writeln;
    for i:=1 to N do write(Y[2,i]:4);
    writeln;
end;
procedure ListOptions;
begin
   writeln;
   writeln('Options');
   writeln('Press ''E'' To Random Generate Items');
   writeln('Press ''P'' To Print Contents Of Array Sorted By Average Value Of Columns');
   writeln('Press ''I'' To Invert Values In Line');
   writeln('Press ''A'' To Calculate Average  Value In Column');
   writeln;
end;
begin
   clrscr;
   ch:=' ';
   while ch <> #27 do begin
       case upcase(ch) of
          'E':RandomFill(T);
          'O':ListOptions;
          'P':PrintByAverage(T);
          'I':InvertVal(T);
          'A':C:=CalcAverage(T,0);
          else writeln(chr(10),chr(13),'Press ''O'' to list options.');
       end;
       CH:=READKEY;
   end;
end.

4. naloga
Podana je tabela elementov: 'G' 'C' 'S' 'B' 'W' 'c' 'P' 'r' 'Q' 'U'
a) Napišite, kako se spreminja vsebina tabele pri urejanju z izbiranjem.
 GCSBWcPrQU
 CGSBWcPrQU
 CGSBWcPrQU
 BCGSWcPrQU
 BCGSWcPrQU
 BCGSWcPrQU
 BCGPSWcrQU
 BCGPSWcrQU
 BCGPQSWcrU
 BCGPQSUWcr

b) Napišite podprogram za urejanje z izbiranjem, ki ne bo upošteval,
        da so po ASCII tabeli male ?rke za velikimi.
c) Napišite, kako se spreminja vsebina tabele pri urejanju s premenami.
 GCSBWcPrQU
 BGCSPWcQrU
 BCGPSQWcUr
 BCGPQSUWcr
 BCGPQSUWcr

uses crt;
const N=10;
type TabE=Array[1..N] of char;
const T:TabE = ('G','C','S','B','W','c','P','r','Q','U');
var F:TabE;
procedure Sort_Bubble(var X:TabE);
var i,j:integer;
    p:Char;
    b:boolean;
begin
    b:=true; i:=2;
    while b and (N >= i) do begin
      b:=false;
      for j:=N downto i do
       if x[j-1] > x[j] then
          begin p:=x[j-1]; x[j-1]:=x[j]; x[j]:=p; b:=true; end;
      writeln(x);
      inc(i);
    end;
    writeln('Bubble Sort: Array Sorted Case Sensitive.');
end;
procedure Sort_UpInsertion(var T:TabE);
var i,j:integer;
   pom:Char;
begin
    for i:=2 to N do begin
       pom:=T[i]; j:=i-1;
       while (UpCase(T[j]) > UpCase(pom)) And (j>0) do begin
            T[j+1]:=T[j]; Dec(j); end;
       T[j+1]:=pom;
       writeln(T);
    end;
    writeln('Insertion Sort: Array Sorted Case Insensitive.');
end;
procedure Sort_Insertion(var T:TabE);
var i,j:integer;
   pom:Char;
begin
    for i:=2 to N do begin
       pom:=T[i]; j:=i-1;
       while (T[j] > pom) And (j>0) do begin
            T[j+1]:=T[j]; Dec(j); end;
       T[j+1]:=pom;
       writeln(T);
    end;
    writeln('Insertion Sort: Array Sorted Case Sensitive.');
end;
begin
   clrscr;
   F:=T;
   Sort_Bubble(F);
   F:=T;
   Sort_UpInsertion(F);
   F:=T;
   Sort_Insertion(F);
   readln;
end.
 

5. naloga
Turbo pascal ima v knjižnici DOS vgrajeno proceduro:
 GetTime(Var Hour, Minute, Second, Sec100: Word);
Ta procedura vrne sistemski ?as.
Napišite program, s katerim boste v desnem zgornjem vogalu zaslonske
slike izpisovali trenutni ?as. Oblika izpisa: hh:mm:ss:s1.
Tudi enomestno število naj se izpiše z vodilno ni?lo. (Primer: 11:06:02:10)
Program se kon?a, ko uporabnik pritisne katerokoli tipko.

uses dos,crt;
type T2Time=record
            h1:word;
            m1:word;
            s1:word;
            s100:word;
            end;
var TT:T2Time;
    ch:char;
function FZeros(s:word;frmt:byte):string;
var l,p:byte;
    s1:string;
begin
    str(s,s1);
    l:=length(s1);
    if frmt  > l then for p:=1 to frmt-1 do s1:='0' + s1;
    fzeros:=s1;
end;
function T2TimeToStr(var T2:T2Time):string;
begin
  t2timetostr:=concat(FZeros(t2.h1,2),':',fzeros(t2.m1,2),':',fzeros(t2.s1,2),':',fzeros(t2.s100,2));
end;
procedure WrtTime;
var s5:string;
begin
    gotoxy(65,1);
    writeln('                            ');
    gettime(tt.h1,tt.m1,tt.s1,tt.s100);
    s5:=t2timetostr(tt);
    gotoxy(80-length(s5),1);
    writeln(s5);
end;
begin
   clrscr;
   repeat
      wrttime;
      delay(2);
   until keypressed;
end.

6. naloga
Napišite podprogram, ki izra?una in izpiše razliko dveh ?asov. ?e je npr. prvi ?as
11:05:55:20, drugi pa 11:06:1:10, naj program izpiše: 00:00:05:90.
Napišite program, ki ?aka, da uporabnik pritisne katerokoli tipko, izpiše,
koliko ?asa je preteklo od prejšnjega pritiska na tipko, ponovno ?aka,
da uporabnik pritisne tipko, spet izpiše ?as itd. Program se kon?a, ko uporabnik pritisne tipko Esc.

uses dos,crt;
type T2Time=record
            h1:word;
            m1:word;
            s1:word;
            s100:word;
            end;
var T1,T2,T3:T2Time;
    ch:char;
function FZeros(s:word;frmt:byte):string;
var l,p:byte;
    s1:string;
begin
    str(s,s1);
    l:=length(s1);
    if frmt > l then for p:=1 to frmt-1 do s1:='0' + s1;
    fzeros:=s1;
end;
function T2TimeToStr(var T2:T2Time):string;
begin
  t2timetostr:=concat(FZeros(t2.h1,2),':',fzeros(t2.m1,2),':',fzeros(t2.s1,2),':',fzeros(t2.s100,2));
end;

procedure WriteTime(Var TT:T2Time);
var s5:string;
begin
  s5:=t2timetostr(tt);
  writeln(s5);
end;

procedure GetRTime(Var TT:T2Time);
begin
  gettime(tt.h1,tt.m1,tt.s1,tt.s100);
end;

Function CLngT2Time(var TT:T2Time):LongInt;
begin
    CLngT2Time:= ((tt.h1 * 3600) + (tt.m1 * 60) + tt.s1) * 100 + tt.s100
end;

procedure CT2TimeLng(LngVal:LongInt; var xx:T2Time);
begin
    lngval:=abs(lngval);
    xx.h1:= lngval div 360000;
    lngval:= lngval - (xx.h1 * 360000);
    xx.m1:= lngval div 6000;
    lngval:= lngval - (xx.m1 * 6000);
    xx.s1:= lngval div 100;
    lngval:= lngval - (xx.s1 * 100);
    xx.s100:=lngval;
end;

procedure DiffDate(Var T1,T2:T2Time;var x1:T2Time);
begin
    CT2TimeLng(CLngT2Time(t1)-CLngT2Time(t2),x1);
end;

begin
   clrscr;
   GetRTime(t1);
   ch:=readkey;
   while ch <> #27 do begin
      GetRTime(t2);
      DiffDate(t1,t2,t3);
      {WriteTime(t2);
      writeln('-');
      WriteTime(t1);
      writeln('=');}
      WriteTime(t3);
      writeln;
      GetRTime(t1);
      ch:=readkey;
   end;
end.

7. naloga
Deklarirajte tabelo 10000 elementov tipa Byte. Napišite vse tri procedure za urejanje podatkov
(izbiranje, premene, vstavljanje). Napišite podprogram, ki izpiše, koliko ?asa je trajalo
dolo?eno urejanje v primeru:
a) ko je tabela napolnjena z naklju?nimi podatki iz intervala [1..200]
b) ko je tabela napolnjena s podatki, ki so že urejeni v naraš?ajo?em vrstnem redu
c) ko je tabela napolnjena s podatki, urejenimi v padajo?em vrstnem redu
 Primerjajte hitrosti metod!
Dopolnite program tako, da dodate izboljšano ina?ico urejanja s premenami.

Rezultati:

Bubble Sort    - Time Spent: 00:00:08:73
Selection Sort - Time Spent: 00:00:01:98
Insertion Sort - Time Spent: 00:00:03:24

Program:

uses dos,crt;
const N=10000;
type T2Time=record
            h1:word;
            m1:word;
            s1:word;
            s100:word;
            end;
     MyType=Byte;
     Tab=Array[1..N] of MyType;
var T1,T2,T3:T2Time;
    T,X:Tab;
    ch:char;
function FZeros(s:word;frmt:byte):string;
var l,p:byte;
    s1:string;
begin
    str(s,s1);
    l:=length(s1);
    if frmt > l then for p:=1 to frmt-1 do s1:='0' + s1;
    fzeros:=s1;
end;
function T2TimeToStr(var T2:T2Time):string;
begin
  t2timetostr:=concat(FZeros(t2.h1,2),':',fzeros(t2.m1,2),':',fzeros(t2.s1,2),':',fzeros(t2.s100,2));
end;

procedure WriteTime(Var TT:T2Time);
var s5:string;
begin
  s5:=t2timetostr(tt);
  write(s5);
end;

procedure GetRTime(Var TT:T2Time);
begin
  gettime(tt.h1,tt.m1,tt.s1,tt.s100);
end;

Function CLngT2Time(var TT:T2Time):LongInt;
begin
    CLngT2Time:= ((tt.h1 * 3600) + (tt.m1 * 60) + tt.s1) * 100 + tt.s100
end;

procedure CT2TimeLng(LngVal:LongInt; var xx:T2Time);
begin
    lngval:=abs(lngval);
    xx.h1:= lngval div 360000;
    lngval:= lngval - (xx.h1 * 360000);
    xx.m1:= lngval div 6000;
    lngval:= lngval - (xx.m1 * 6000);
    xx.s1:= lngval div 100;
    lngval:= lngval - (xx.s1 * 100);
    xx.s100:=lngval;
end;

procedure DiffDate(Var T1,T2:T2Time;var x1:T2Time);
begin
    CT2TimeLng(CLngT2Time(t1)-CLngT2Time(t2),x1);
end;

procedure RndFill(var x:Tab);
var i:integer;
begin
   randomize;
   for i:=1 to N do x[i]:=random(200) +1;
end;

procedure Sort_Bubble(var X:Tab);
var i,j:integer;
    p:MyType;
    b:boolean;
begin
    b:=true; i:=2;
    while b and (N >= i) do begin
      b:=false;
      for j:=N downto i do
       if x[j-1] > x[j] then
          begin p:=x[j-1]; x[j-1]:=x[j]; x[j]:=p; b:=true; end;
      inc(i);
    end;
end;

procedure Sort_Selection(var T:Tab);
var i,j,k:integer;
    pom:MyType;
begin
    for i:=1 to N-1 do begin
       k:=i; pom:=T[i];
       for j:=i+1 to N do if pom > T[j] then begin pom:=t[j]; k:=j; end;
       T[k]:=T[i];
       T[i]:=pom;
    end;
end;

procedure Sort_Insertion(var T:Tab);
var i,j:integer;
   pom:MyType;
begin
    for i:=2 to N do begin
       pom:=T[i]; j:=i-1;
       while (T[j] > pom) And (j>0) do begin
            T[j+1]:=T[j]; Dec(j); end;
       T[j+1]:=pom;
    end;
end;

procedure WrtTable(var x:Tab);
var i:Integer;
begin
   for i:=1 to N do writeln(x[i]);
end;

procedure WriteRes(vText:string);
begin
      GetRTime(t2);
      DiffDate(t1,t2,t3);
      write(vtext,' - Time Spent: ');
      WriteTime(t3);
      writeln;
      {GetRTime(t1);}
end;

begin
   clrscr;
   ch:=readkey;
   while ch <> #27 do begin
      writeln; writeln('Filling...'); RndFill(T);
      writeln; writeln('Sorting...');
      X:=T; GetRTime(T1); Sort_Bubble(X);    WriteRes('Bubble Sort   ');
      X:=T; GetRTime(T1); Sort_Selection(X); WriteRes('Selection Sort');
      X:=T; GetRTime(T1); Sort_Insertion(X); WriteRes('Insertion Sort');
      writeln;
      ch:=readkey;
   end;
end.
 

8. naloga
a) Preverite pravilnost delovanja programa.
        Deluje pravilno.
b) Ugotovite, katera metoda je uporabljena v proceduri kaksno_sortiranje
        (postopek, na katerem sloni ta procedura).
        Bubble Sort.
c) Ugotovite, kako je realiziran postopek premene podatkov in pri katerih tipih
        podatkov ta postopek ne deluje pravilno.
        Postopek ne deluje pravilno pri stringih.
        Ko je potrebno podatka medseboj zamenjati, je zamenjava narejena
        tako, da ni potrebna še pomožna spremenljivka. Takrat sta podatka med seboj
        sešteta in potem pravilno odšteta.
d) Napišite sled programa za naslednje podatke [ 10 14 6 3 18 44 2 15 50 55].

Type Tabela = Array[1..10] Of Integer;
Var X : Tabela;

Procedure Polni(Var X : Tabela);
Var I : Integer;
Begin
  Randomize;
  For I:=1 to 10 Do
    X[I]:=Random(100);
End;

Procedure Kaksno_sortiranje(Var X : Tabela);
Var I,J : Integer;
Begin
  For I:=1 to 9 Do
    For J:=I+1 to 10 Do
      If X[I]>X[J] Then
      Begin
        X[J]:=x[J]+x[I];
        X[I]:=x[J]-x[I];
        X[J]:=x[J]-x[I];
      End;
End;
Procedure Izpis(X : Tabela);
Var I : Integer;
Begin
  For I:=1 to 10 Do
    Write(X[I]:5);
  WriteLn;
End;
Begin (* glavni program *)
  Polni(X);
  Kaksno_sortiranje(X);
  Izpis(X);
End.

Sled:

  x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9]x[10]   I    J

   10   14    6    3   18   44    2   15   50   55    0    0
   10   14   16    3   18   44    2   15   50   55    1    3
    6   14   16    3   18   44    2   15   50   55    1    3
    6   14   10    3   18   44    2   15   50   55    1    3
    6   14   10    9   18   44    2   15   50   55    1    4
    3   14   10    9   18   44    2   15   50   55    1    4
    3   14   10    6   18   44    2   15   50   55    1    4
    3   14   10    6   18   44    5   15   50   55    1    7
    2   14   10    6   18   44    5   15   50   55    1    7
    2   14   10    6   18   44    3   15   50   55    1    7
    2   14   24    6   18   44    3   15   50   55    2    3
    2   10   24    6   18   44    3   15   50   55    2    3
    2   10   14    6   18   44    3   15   50   55    2    3
    2   10   14   16   18   44    3   15   50   55    2    4
    2    6   14   16   18   44    3   15   50   55    2    4
    2    6   14   10   18   44    3   15   50   55    2    4
    2    6   14   10   18   44    9   15   50   55    2    7
    2    3   14   10   18   44    9   15   50   55    2    7
    2    3   14   10   18   44    6   15   50   55    2    7
    2    3   14   24   18   44    6   15   50   55    3    4
    2    3   10   24   18   44    6   15   50   55    3    4
    2    3   10   14   18   44    6   15   50   55    3    4
    2    3   10   14   18   44   16   15   50   55    3    7
    2    3    6   14   18   44   16   15   50   55    3    7
    2    3    6   14   18   44   10   15   50   55    3    7
    2    3    6   14   18   44   24   15   50   55    4    7
    2    3    6   10   18   44   24   15   50   55    4    7
    2    3    6   10   18   44   14   15   50   55    4    7
    2    3    6   10   18   44   32   15   50   55    5    7
    2    3    6   10   14   44   32   15   50   55    5    7
    2    3    6   10   14   44   18   15   50   55    5    7
    2    3    6   10   14   44   62   15   50   55    6    7
    2    3    6   10   14   18   62   15   50   55    6    7
    2    3    6   10   14   18   44   15   50   55    6    7
    2    3    6   10   14   18   44   33   50   55    6    8
    2    3    6   10   14   15   44   33   50   55    6    8
    2    3    6   10   14   15   44   18   50   55    6    8
    2    3    6   10   14   15   44   62   50   55    7    8
    2    3    6   10   14   15   18   62   50   55    7    8
    2    3    6   10   14   15   18   44   50   55    7    8