Ćwiczenia

Zadanie 1 (Flaga trójkolorowa)

Udowodnij częściową poprawność podanego poniżej rozwiązania zadania o fladze trójkolorowej.
Ćwiczenie
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie.
Program

<b>program</b> FlagaTrójkolorowa(N:integer; A:array[1..N] of integer);
<b>var</b> m,r,w,pom&nbsp;: integer;
<b>begin</b>
 m:=1; r:=1; w:=N;
<b>while</b> r &lt;= w <b>do</b>
 <b>if</b> A[r]=0 <b>then</b> r:=r+1			//przedłużamy segment liczb dodatnich 
<b>else</b> 
<b>if</b> A[r]&lt;0 <b>then</b> <b>begin</b>
pom:=A[r]; A[r]:=A[m]; A[m]:=pom;	//zamieniamy wartości w A[r] i A[m], po zamianie A[r]=0 i A[m] &lt; 0 
m:=m+1;					//więc zwiększamy oba indeksy r i m 
r:=r+1; 
<b>end</b>
<b>else</b> <b>begin</b> pom:=A[r]; A[r]:=A[w]; A[w]:=pom;	//zamieniamy wartości w A[r] i A[w] w:=w-1;					//po zamianie A[w]&gt;0,  ale o A[r] nic nie wiemy <b>end</b>; <b>end</b>. 


Zadanie 2 (Segment o danej sumie)

Udowodnij częściową poprawność dla podanego poniżej zadania i jego rozwiązania.

Ćwiczenie
Tablica A typu array[1..N] of integer, N >0 zawiera tylko liczby dodatnie. Napisz program, który dla danego W typu integer takiego, że W > 0 sprawdza, czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W\( =A[l]+...+A[p-1] \)).
Program

<b>program</b> SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer);
 //Tablica A zawiera tylko liczby dodatnie 
<b>var</b> l,p,suma: integer;
znalezione: boolean;
 <b>begin</b> 
l:=1; p:=1; suma:=0; 
<b>while</b> (suma &lt;&gt; W) <b>and</b> (p &lt;= N) <b>do</b>
 <b>if</b> suma &lt; W <b>then</b> <b>begin</b>		//jeśli suma jest za mała, to przesuwamy prawy koniec segmentu
suma:=suma+A[p]; 
p:=p+1; 
<b>end</b> 
<b>else</b> <b>begin</b>			//jeśli za duża, to przesuwamy lewy koniec segmentu 
suma:= suma-A[l]; l:=l+1; 
<b>end</b>; 
<b>while</b> (suma &gt; W) <b>do</b> <b>begin</b> 
suma:= suma-A[l]; 
l:=l+1; 
<b>end</b>;
znalezione:=(suma=W); 
<b>end</b>.


Zadanie 3 (Głosowanie większościowe)

Udowodnij częściową poprawność dla podanego poniżej zadania i jego rozwiązania.

Ćwiczenie
Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdź, czy jest w niej element występujący więcej niż N/2 razy i jeśli tak, wskaż go.
Program

<b>program</b> Głosowanie2(N,W:integer; A:array[1..N] of integer);
<b>var</b> ile,i,kand,lider: integer;
<b>begin</b>
kand:=A[1];		//szukamy kandydata na lidera 
ile&nbsp;:= 1;
 i:=2;
<b>while</b> i &lt;= N <b>do</b> <b>begin</b>
<b>if</b> A[i]=kand <b>then</b> <b>begin</b>
 ile:=ile+1; i:=i+1;
 <b>end</b>
 <b>else</b>
 <b>if</b> ile &gt; 0 <b>then</b> <b>begin</b>
 ile:=ile-1; i:=i+1; 
<b>end</b>
 <b>else</b> <b>begin</b>
 kand:=A[i];
 ile:=1;
 i:=i+1;
 <b>end</b>;
 <b>end</b>;
 ile:=0;		//sprawdzamy, czy kandydat jest liderem 
<b>for</b> i:=1 <b>to</b> n <b>do</b>
<b>if</b> A[i]=kand <b>then</b> ile:=ile+1; 
<b>if</b> (ile &gt;= (N div 2 + 1) <b>then</b> <b>begin</b>
 lider:=kand; 
write('Liderem jest: ', kand);
 <b>end</b> 
<b>else</b>
 lider:=0; 
<b>end</b>.

Zadanie 4 (BinPower)

Udowodnij częściową poprawność dla podanego poniżej zadania i jego rozwiązania.
Ćwiczenie
Dla zadanych x,n > 0 wyznacz xn (oczywiscie bez exp i ln).
Program

<b>function</b> BinPower(x,n:integer):integer; 
// Dla x,n &gt; 0 wyznaczamy x do potęgi n 
<b>var</b> z,y,i: integer; 
<b>begin</b>
 z:=1; 
y:=x; 
i:=n; 
<b>while</b> i &gt; 0 <b>do</b> <b>begin</b>
 <b>if</b> (i mod 2 = 1) <b>then</b> z:=z*y;
 y:=y*y;
 i:=i div 2;
 <b>end</b>;
 BinPower:=z;
 <b>end</b>;