Algorytmy i programowanie

Pacal powrótrka

Łańcuchy znaków

Oprócz liczb możemy w językach programowania działać także na znakach, czy też słowach. Do przechowywania pojedynczych znaków służy nam typ zwany char. Przykład:

program Slowa;
var ch: char;

begin
        ch := 'A';
        writeln(ch);
        readln;
end.

Ciekawostka: W komputerze znaki przechowywane są jako liczby, do odwzorowywania liczb na konkretne znaki służy nam tzw. Tablica ASCII

Do przechowywania ciągów znaków służy typ zmiennych o nazwie string. Przykładowy najprostszy program wczytujący słowo i wypisujący jego litery po jednej w każdej z linii wygląda następująco:

program Slowa;

var
        s: string;
        i : Integer;
begin
        readln(s);
        for i:=1 to length(s) do
        writeln(s[i],' ');
        readln;
end.

Zauważmy, że do elementów stringa, czyli ciągu znaków odwołujemy się tak jak do elementów tablicy. Funkcja lenght(s) zwraca nam długość ciągu znaków zapisanego w zmiennej s.

Jak widzieliśmy już wczesniej ciągi znaków zapisujemy w apostrofach, np:

program Slowa;

var
        s: string;
        i : Integer;
begin
        s:='abc';
        for i:=1 to length(s) do
        writeln(s[i],' ');
        readln;
end.

Na ciągach znaków możemy wykonywać działania takie jak dodawanie (dodawanie znaku na koniec stringa).

program Slowa;

var
        s, s2: string;
        i : Integer;
begin
        readln(s);
        for i:=1 to length(s) do
        Begin
             writeln(s[i],' ');
             if (i mod 2 = 1) then s2+=s[i];
        End;
        writeln(s2);
        readln;
end.

Polecenie case

W przypadku gdy chcemy na podstawie wartości zmiennej określić dalsze kroki programui opcji tych jest więcej niż dwie wtedy zamiast używania wielokrotnie operacji if lepiej jest użyć operacji case.

case zmienna of
wartosc1 : begin ... end;
wartosc2 : begin ... end;
....
else begin... end;
end;

Przykład:

program kejsy;

var
        i: integer;
Begin
        writeln('Podaj liczbe');
        readln(i);
        case i of
                1 : begin writeln('Jeden'); end;
                2 : begin writeln('Dwa'); end;
                else begin writeln('Wiecej niz dwa'); end;
        end;
        readln;
End.

Tablice dwuwymiarowe

Aby przekazać do procedury czy funkcji tablice dwuwymiarową należy po poleceniu przed var wpisać słowo kluczowe type i po nim zdefiniować pewien typ tablicowy, analogicznie jak ma to miejsce poniżej i dalej posługiwać się właśnie tym zdefiniowanym typem.

Przykład:

program macierze;

type
        macierz = Array[1..10,1..10] of Integer;
var
        m:macierz;

procedure p(var m1:macierz);
begin
        m1[1,1]:=0;
        m1[10,10]:=0;
end;

Begin
        m[1,1]:=10;
        writeln(m[1,1]);
        p(m);
        writeln(m[1,1]);
        readln;
End.

Zadanie 1

Napisz program, który wczytuje słowo i sprawdza czy jest ono palindromem (słowem, które wygląda tak samo czytane od początku jak i od końca);

Zadanie 2

Napisz program, który wczytuje dwa słowa i sprawdza czy drugie słowo zawiera się w pierwszym. Np. dla słów konkretny i kret słowo kret zawiera się w słowie konkretny, ale dla pary konkretny oraz krety odpowiedzią będzie, że się nie zawiera.

Zadanie 3

Napisz program czytania rozmiaru n (skończona nieparzysta liczba naturalna) i rysowania znaku X o rozmiarach n x n. Np dla n=3 wyglądałoby to następująco:

\(X\ \ \ X\)
\(\ \ \ X\ \)
\(X\ \ \ X\)

a dla n=5

\(X\ \ \ \ \ \ \ \ X\)
\(\ \ \ X\ \ X\ \)
\(\ \ \ \ \ \ X \ \ \)
\(\ \ \ X\ \ X\ \)
\(X\ \ \ \ \ \ \ \ X\)

Zadanie 4

Napisz program obliczający, dla zadanych liczb n i k, wartość symbolu Newtona \(\binom{n}{k}\) przy użyciu tablicy jednowymiarowej.

Zadanie 5

Napisz program, który za pomocą rekurencji odwraca zawartość tablicy jednowymiarowej.

Zadanie Domowe (5 pkt)

Napisz program, który pozwoli na wczytanie dwóch macierzy A i B (rozmiaru 3x3) i następnie udostępni użytkownikowi do wyboru opcje (menu takie jak poniżej będzie pokazywane wielokrotnie po wykonaniu każdej operacji, aż do wpisania przez użytkownika zera):

0 - wyjdź z programu
1 - dodaj do macierzy A macierz B
2 - dodaj do macierzy B macierz A
3 - zeruj główną przekątną macierzy A
4 - zeruj główna przekątną macierzy B
5 - podaj max wartość macierzy A
6 - podaj max wartość macierzy B
7 - wypisz macierz A
8 - wypisz macierz B
9 - sprawdź czy suma elementów macierzy A i B jest liczbą pierwszą
10 - wypisz mój numer indeksu

gdzie, przy dodawaniu dwóch macierzy wywoływana będzie procedura

dodaj(var pierwsza:macierz; druga: macierz);

a przy zerowaniu wywoływana będzie rekurencyjna procedura (można to zrobić bez rekurencji ale chcemy tu sztucznie nawet ją wykorzystać).

zeruj(var pierwsza:macierz;rozmiar:integer);

Do szukania maksimum wykorzystamy funkcję o deklaracji

szukMax(m:macierz):integer;

do wypisania macierzy wykorzystamy procedurę o deklaracji

wypisz(m:macierz);

do sprawdzania pierwszości wykorzystamy funkcje o deklaracji

pierwsza(m1:macierz;m2:macierz):boolean;

Uwaga! Państwa programy zostaną sprawdzone pod względem podobieństwa między sobą!

Termin wykonania zadań: Sobota 09.04.2016 do godziny 24.00. Proszę o przesłanie rozwiązań mailem . W temacie powinien znajdować się numer indeksu i słowo APR.