|
|||||||
|
|
|
|||||
|
|
|||||||
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