Zadanie 1 (3 pkt)
Napisz program, który po uruchomieniu pozyska od użytkownika 3 liczby, a następnie wypisze na ekranie wynik analizy polegającej na sprawdzeniu czy podane liczby mogłyby być długościami boków trójkąta, a jeśli tak to dodatkowo wypisze czy ten trójkąt jest trójkątem prostokątnym.
Rozwiązanie:
Program trojkat;
Uses Crt;
Var
a,b,c:Byte;
BEGIN
ClrScr;
Write(`Podaj pierwsza liczbe - `); Readln(a);
Write(`Podaj druga liczbe - `); Readln(b);
Write(`Podaj trzecia liczbe - `); Readln(c);
If (a+b>c) And (a+c>b) And (b+c>a) Then
Write(`Podane liczby moga byc interpertowane jako dlugosci bokow trojkata')
Else
Write(`Podane liczby nie spelniaja warunku bokow trojkata');
If (c*c-a*a-b*b=0) Or (b*b-a*a-c*c=0) Or (a*a-b*b-c*c=0 Then
Write(` prostokatnego');
END.
Zadanie 2 (3 x 1 pkt)
Wypisz jak efekt można byłoby zobaczyć na ekranie po zakończeniu działania programów:
Uses CRT;
Var i,a,b:Byte;
BEGIN
ClrScr;
i:=1; a:=2; b:=3+i+2;
For a:=i To b-i Do
WriteLn(i,' ',a,' ',b);
Write(i+a+b);
Readln;
END.
Uses CRT;
Var a,b:-10..10;
BEGIN
ClrScr;
a:=1; b:=10;
Repeat
b:=b-a; a:=a+1;
WriteLn('a=',a,' b=',b);
Until a>b;
Readln;
END.
Uses CRT;
Var a,b:-10..10;
BEGIN
ClrScr;
a:=1; b:=10;
While a<b Do
Begin
b:=b-1; a:=2*a;
WriteLn('a=',a,' b=',b);
End;
Readln;
END.
Zadanie 3 (2 x 3pkt)
W zmiennej tablicowej dwuwymiarowej (30x2) zapisano liczby rzeczywiste interpretowane jako współrzędne 12 punktów (w kolumnie 1 przechowywane są wsp. X, a w kolumnie 2 - wsp. Y). Napisz fragment programu dzięki któremu:
a) punkty zostaną posortowane po wsp. Y w porządku malejącym
b) obliczone zostaną odległości pomiędzy ww. punktami (każdy z każdym), a wynik zapisany zostanie również w zmiennej tablicowej w ten sposób, że na przecięciu 5 wiersza i 7 kolumny odczytać będzie można odległość obliczoną pomiędzy punktami 5 i 7.
Rozwiązanie Ad. a)
For i:=1 To 11 Do
For j:=i+1 To 12 Do
If P[i,2]<P[j,2] Then
Begin
tmp:=P[i,1]; P[i,1]:=P[j,1]; P[j,1]:=tmp;
tmp:=P[i,2]; P[i,2]:=P[j,2]; P[j,2]:=tmp;
End;
Rozwiązanie Ad. b)
For i:=1 to 11 Do
Begin
M[i,i]:=0;
For j:=i+1 To 12 Do
Begin
M[i,j]:=sqrt(sqr(P[j,1]-P[i,1])+sqr(P[j,2]-P[i,2]));
M[j,i]:=M[i,j];
End;
End;
M[12,12]:=0;
Zadanie 4 (2 x 3pkt)
a) Napisz deklarację funkcji odpowiedzialnej za wyliczenie iloczynu 2 macierzy. Program do funkcji przekazuje 2 macierze (zmienne tablicowe) i 4 liczby (wymiary tych macierzy). Funkcja jako wartość zwraca wartość logiczną (true - udało się policzyć, false - nie udało się policzyć). Funkcja poprzez parametry zwraca również do programu informację o macierzy wynikowej i jej wymiarach.
b) Napisz deklarację procedury odpowiedzialnej za zliczenie liczby zer występujących na głównej przekątnej w zmiennej tablicowej. Zmienna tablicowa jest jednym z parametrów procedury.
Rozwiązanie:
Function il_mac(M1:macierz; w1,k1:Byte; M2:macierz; w2,k2:Byte; Var M3:macierz; Var w3,k3:Byte):Boolean;
Var
i,j,k:Byte;
Begin
il_mac:=False; {zakładamy, że nie uda się policzyć iloczynu}
If k1=w2 Then {jeśli ten warunek będzie spełniony to iloczyn uda się wyliczyć}
Begin
il_mac:=True; {funkcja będzie miała taką wartość bo iloczyn zostanie policzony}
w3:=w1; k3:=k2; {ustalamy wymiary macierzy wynikowej}
{obliczamy poszczegolne elementy macierzy wynikowej jako suma iloczynow wiersza z macierzy pierwszej i kolumny z macierzy drugiej}
For i:=1 To w3 Do
For j:=1 To k3 Do
Begin
M3[i,j]:=0;
For k:=1 To k1 Do
M3[i,j]:=M3[i,j]+M1[i,k]*M2[k,j];
End;
End;
End;
Procedure liczba_0_na_przekatnej(M:macierz; w,k:Byte; Var n:Byte);
Var
i,min:Byte;
Begin
min:=w; If k<min Then min:=k; {glowna przekatna będzie miala tyle elementow ile wynosi mniejsza z liczby wierszy lub kolumn}
n:=0; {skoro nie zaczęliśmy nawet szukać to zer na przekątnej mamy zero}
For i:=1 To min Do {przejdziemy przez wszystkie elementy przekątnej}
If M[i,i]=0 Then {sprawdzamy czy element przekatnej jest zerem}
n:=n+1; {jesli tak to zerowych elementow przekatnej mamy o jeden wiecej}
End;
To co powyżej dla mnie by wystarczyło by dać maksymalną liczbe punktów za to zadanie. Jeśli nie wierzycie, że ta funkcja i ta procedura da oczekiwany efekt to można zawsze dopisać resztę programu. Proponuję dopisać zatem procedure do losowego pozyskiwania macierzy oraz procedure do wypisywania macierzy na ekranie komputera. A nastepnie uruchomienie tych wszystkich funkcji i procedur w programie głównym.
Procedure losuj_mac(ozn:String; Var M:macierz; Var w,k:Byte);
Var
i,j:Byte;333
Begin
WriteLn;
WriteLn(`Podaj wymiary dla macierzy `,ozn);
Write(`Ile wierszy - `); Readln(w);
Write(`Ile kolumn - `); Readln(k);
For i:=1 To w Do
For j:=1 To k Do
M[i,j]:=-1+Random(3);
End;
Procedure mac_na_ekran(ozn:String; M:macierz; w,k:Byte);
Var
i,j:Byte;
Begin
Writeln;
Writeln(`***** macierz `,ozn, ` *****');
For i:=1 To w Do
Begin
For j:=1 To k Do
Write(M[i,j]:5);
Writeln;
End;
End;
Program zadanie4;
Uses CRT;
Type macierz=Array[1..10,1..10] of Integer;
Var
Function il_mac………
Procedure liczba_0_na_przekatnej………
Procedure losuj_mac………
Procedure mac_na_ekran………
BEGIN
ClrScr;
Randomize;
losuj_mac(`A',A,wA,kA);
mac_na_ekran(`A',A,wA,kA);
liczba_0_na_przekatnej(A,wA,kA,n);
WriteLn(`W macierzy A jest `,n,' zer na przekątnej');
losuj_mac(`B',B,wB,kB);
mac_na_ekran(`B',B,wB,kB);
liczba_0_na_przekatnej(B,wB,kB,n);
WriteLn(`W macierzy B jest `,n,' zer na przekątnej');
If il_mac(A,wA,kA,B,wB,kB,C,wC,kC) Then
Begin
mac_na_ekran(`C=A*B',C,wC,kC);
liczba_0_na_przekatnej(C,wC,kC,n);
WriteLn(`W macierzy C jest `,n,' zer na przekątnej');
End
Else
WriteLn(`wymiary wewnetrzne nie sa zgodne - nie moge mnozyc');
END.
Zadanie 5 (6 pkt)
Napisz program, który wybierze z dwóch plików na dysku punkty o tym samym oznaczeniu
i zapisze je do pliku trzeciego (tekstowego) posortowaniu wg oznaczenia w porządku rosnącym.
Pierwszy plik z danymi jest plikiem tekstowym i zawiera 3 kolumny. W pierwszej kolumnie na 5 pozycjach zapisany jest ciąg znaków będący oznaczeniem punktu, w drugiej i trzeciej kolumnie zapisane są liczby rzeczywiste interpretowane jako wsp. X i wsp. Y.
Drugi plik to plik rekordów, a każdy rekord składa się z trzech pól:
o:String[5]; x,y:Real;
Rozwiązanie:
w pliku
0 - 8 pkt - niedostateczny
9 - 14 pkt - dostateczny
15 - 19 pkt - dobry
20 - 24 pkt - bardzo dobry