Kurs Pascala LO Biecz 2010/2011. Kurs Pascala oparty na zadaniach i problemach z lekcji Informatyki.



Podobne dokumenty
Programowanie w Turbo Pascal

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Zadania język C++ Zad. 1. Napisz program wczytujący z klawiatury wiek dwóch studentów i wypisujący informację o tym, który z nich jest starszy.

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Procedury i funkcje. Przykład programu z procedurą. Definicja. Cechy procedury

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Pascal - wprowadzenie

do instrukcja while (wyrażenie);

6. Pętle while. Przykłady

Programowanie - wykład 4

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Podstawy Programowania Podstawowa składnia języka C++

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Zasady Programowania Strukturalnego

Lekcja 6: Pascal. Procedura i funkcja

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

Pętle instrukcje powtórzeo

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Programowanie komputerowe. Zajęcia 1

3. Podstawowe funkcje mamematyczne. ZAPOZNAĆ SIĘ!!!

Podprogramy. Procedury

Konstrukcje warunkowe Pętle

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Programowanie w Baltie klasa VII

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

WHILE (wyrażenie) instrukcja;

1 Powtórzenie wiadomości

WHILE (wyrażenie) instrukcja;

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

4. Funkcje. Przykłady

Podstawy Programowania C++

LISTA 5. C++ PETLE for, while, do while

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Wstęp do programowania

Rekurencja (rekursja)

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Język C część 2. Podejmowanie decyzji w programie. if else. switch

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

2.8. Algorytmy, schematy, programy

PROGRAMOWANIE W C++ ZADANIA

Zapis algorytmów: schematy blokowe i pseudokod 1

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Instrukcja standardowa Writeln

Język C zajęcia nr 5

Podstawy programowania

if (wyrażenie ) instrukcja

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Algorytmy i struktury danych. Wykład 4

Pętle. Dodał Administrator niedziela, 14 marzec :27

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

ALGORYTMY I STRUKTURY DANYCH

Języki programowania zasady ich tworzenia

Algorytmy w teorii liczb

Algorytm. a programowanie -

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

2.Sprawdzanie czy podana liczba naturalna jest pierwsza Liczba pierwsza to liczba podzielna tylko przez 1 i przez siebie.

Warunki logiczne instrukcja if

Wrocław, dn. 19 kwietnia 2006 roku. Anna Kaleta Piotr Chojnacki IV rok, informatyka chemiczna Liceum Ogólnokształcące nr 10 we Wrocławiu

1 Wprowadzenie do algorytmiki

KURS PASCAL A. 1.Wprowadzenie

Wprowadzenie komentarzy do programu

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

lekcja 8a Gry komputerowe MasterMind

Algorytm Euklidesa. Największy wspólny dzielnik dla danych dwóch liczb całkowitych to największa liczba naturalna dzieląca każdą z nich bez reszty.

Struktura pliku projektu Console Application

2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117).

7. Pętle for. Przykłady

1 Podstawy c++ w pigułce.

Programowanie - instrukcje sterujące

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Pętla while. Prowadzący: Łukasz Dunaj, strona kółka: atinea.pl/kolko

Luty 2001 Algorytmy (7) 2000/2001

Proste programy w C++ zadania

Instrukcja warunkowa i złoŝona.

TEMAT: Podejmowanie decyzji w programie instrukcja warunkowa (IF).

Instrukcje sterujące

Przypomnienie wiadomości dla trzecioklasisty C z y p a m i ę t a s z?

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Język C, instrukcje sterujące (laboratorium)

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Lekcja 3: Pierwsze kroki z Pythonem. Pętle

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

while(wyrażenie) instrukcja

I. Podstawy języka C powtórka

Programowanie komputerowe. Zajęcia 3

Programowanie obiektowe - zadania

for (inicjacja_warunkow_poczatkowych(końcowych); wyrazenie_warunkowe; wyrazenie_zwiekszajace(zmniejszające)) { blok instrukcji; }

Transkrypt:

Kurs Pascala LO Biecz 2010/2011 Kurs Pascala oparty na zadaniach i problemach z lekcji Informatyki. Krzysztof Libront Ostatnia modyfikacja: 2010-11-12

Spis treści Wprowadzenie do języka Pascal.... 3 Zadanie 1: Napisz program wczytujący liczbę całkowitą i sprawdzający czy liczba jest dodatnia czy ujemna.... 5 Zadanie 2: Napisz program który będzie wczytywał pewną liczbę naturalną, sprawdzał czy jest dodatnia czy ujemna, i tak dopóki nie wpiszemy 0.... 6 Zadanie 3: Sumowanie ciągu liczb naturalnych.... 7 Zadanie 4: Znajdź największą liczbę w podanym ciągu.... 8 Zadanie 5: Znajdź największy wspólny dzielnik przy pomocy algorytmu Euklidesa.... 9 Zadanie 6: Różne typy zmiennych - zastosowanie.... 10 Zadanie 7: Zabawa z tablicami... 11 Zadanie 8: Sprawdź czy dany wyraz jest palindromem... 12 Zadanie 9: Stwórz procedurę wypisującą n razy ":)"... 13 Zadanie 10: Stwórz program skracający ułamek zwykły... 15 Zadanie 11: Silnia - rekurencja... 19 Zadanie 12: Podnoszenie 2 do potęgi n... 20 2

Wprowadzenie do języka Pascal. Przygotowałem kurs Pascala dla mało zaawansowanych :) Po każdej lekcji będę przygotowywał dla was krótki przewodnik z danym materiałem. Na początek proponuję zapoznad się ze słownictwem którego będę używał i krótkim wprowadzeniem. Na początek ściągnij program ftp://ftp.freepascal.org/pub/fpc/dist/2.2.4/i386-win32/fpc-2.2.4.i386- win32.exe. Zainstaluj i uruchom. Reszta tak jak w szkole. Konstrukcja programu: program nazwa_programu; var zmienne : typ; częśd główna programu {nazwa programu} {inicjowanie zmiennych} {częśd główna programu} {koniec programu} Pogrubione zostały słowa kluczowe programu, które należy znad na pamięd. Natomiast w nawiasach klamrowych znajdują się komentarze, które nie mają wpływu na działanie programu - przy przepisywaniu zalecam ich omijanie. zmienna - element programu, do którego możemy przypisad pewną wartośd poprzez operator przypisania ":=". Zmienne mogą posiadad określony typ danych, który można ustawid w ten oto sposób: var nazwa_zmiennej : typ; Tabela typów: Typ Zakres Rodzaj liczb... integer -32768...32767 Całkowite byte 0...255 Całkowite longint -2147483648...2147483647 Całkowite shortint -128...127 Całkowite word 0...65535 Całkowite real 5.0x10-324...1.7x10308 Rzeczywiste double 5.0x10-324...1.7x10308 Rzeczywiste extended 3.4x10-4932..1.1x104932 Rzeczywiste comp -9 223 372 036 854 775 808...9 223 372 036 854 775 807 Rzeczywiste String Łaocuch znaków - Podstawowe funkcje: Read(nazwa_zmiennej); {wczytywanie wartości z klawiatury pod zmienną} Readln(nazwa_zmiennej); {wczytywanie wartości z klawiatury pod zmienną i przejście do następnej linii} Write('Jakiś tekst'); {wypisuje "Jakiś tekst" na ekranie} Writeln('Jakiś tekst'); {wypisuje "Jakiś tekst" na ekranie i przechodzi do następnej linii} Writeln('Jakiś tekst', nazwa_zmiennej,' dalszy ciąg tekstu'); {połączenie tekstu ze zmienną} 3

if warunek then możliwośd1 else możliwośd; {np. jeżeli a<10 to wypisz('a jest mniejsze od 10'); w przeciwnym wypadku wypisz('a jest większe od 10);} Do zapisania warunku możemy wykorzystad: - a>b - a większe od b, - a>=b - a większe lub równe b, - a<b - a mniejsze od b, - a<=b - a mniejsze lub równe b, - a<>b - a różne od b. W Pascalu występują trzy pętle: - dwie pętle warunkowe repeat... until warunek; {powtarzaj... dopóki warunek jest nie spełniony;} oraz while warunek do {podczas gdy warunek jest spełniony powtarzaj...;} - jedna pętla z licznikiem for i:=1 to 10 do...; {od i=1 do 10 powtarzaj...; - po każdym powtórzeniu do "i" zostanie dodane 1 aż osiągnie 10} Tablice można porównad do kolejki w której stoi n liczb. Jeśli nie wiemy ile liczbę będzie podanych możemy utworzyd tablice o np. 100 wartościach - nie musimy wtedy tworzyd zmienna1, zmienna2, zmienna3 itd. (było by to trochę męczące). Tablice deklarujemy w następujący sposób: var Nazwa_tablicy : array[1..1000] of Integer; {stwórz tablice od 1 do max 1000 różnych rekordów typu Integer (liczb całkowitych)} Wartości przypisujemy tak jak do zwykłej zmiennej, jednak przy tablicach musimy również w której z kolei pozycji ma znaleźd dana liczba: Nazwa_tablicy[1] := 185; {przypisz do tablicy Nazwa_tablicy na pozycji 1 liczbę 185} Jeżeli po if, którejś z pętli dalszy kod naszego programu będzie dłuższy niż jedna linijka (instrukcja np. Write) musimy umieścid ją pomiędzy kod_programu Przykładowo: program nazwa; var a : integer; Readln(a); if a>0 then {gdy a jest większe od 0 wyświetl} Writeln('A jest większe od zera'); Writeln(Kolejny tekst do wyświetlenia') else {w przeciwnym wypadku} Writeln('A jest mniejsze od zera'); Writeln(Kolejny tekst do wyświetlenia'); Wygeneruje nam błąd ponieważ pomiędzy then a else znajdują się więcej niż 2 funkcje (w tym przypadku wypisywanie tekstu). Nie pomoże nam dodanie tego do jednej linii: Writeln('A jest większe od zera'); Writeln(Kolejny tekst do wyświetlenia'); Aby program uruchomił się poprawnie potrzebujemy.... program nazwa2; var a : integer; Readln(a); if a>0 then {tylko gdy a jest większe od 0 wyświetl} {rozpoczynamy "pudełko" nr 1} 4

else Writeln('A jest większe od zera'); Writeln(Kolejny tekst do wyświetlenia'); end {kooczymy pudełko nr 1 UWAGA! w przypadku gdy po end występuje else nie dajemy na koocu ";"} {rozpoczynamy pudełko nr 2} Writeln('A jest mniejsze od zera'); Writeln(Kolejny tekst do wyświetlenia'); {kooczymy pudełko nr 2} Teraz program uruchomi się poprawnie :) Tak pokrótce wprowadziłem was do Pascala. Zadanie 1: Napisz program wczytujący liczbę całkowitą i sprawdzający czy liczba jest dodatnia czy ujemna. program sprawdzanie; var liczba : integer; {nadajemy zmiennej liczba typ liczb całkowitych} Writeln('Wpisz jakąś liczbę całkowitą:'); Readln(liczba); {wczytujemy liczbę z klawiatury} if liczba > 0 then {sprawdzamy czy liczba jest większa od 0} Writeln('Liczba jest dodatnia') {wypisujemy stosowny tekst (bez ";"!!!, bo jest przed else)} else {w przeciwnym wypadku} Writeln('Liczba jest ujemna lub jest zerem'); {wypisujemy stosowny tekst} Można także dodad linijkę kodu, aby sprawdzid czy aby liczba nie jest 0. program sprawdzanie_ulepszone; var liczba : integer; {nadajemy zmiennej liczba typ liczb całkowitych} Writeln('Wpisz jakąś liczbę całkowitą:'); Readln(liczba); {wczytujemy liczbę z klawiatury} if liczba > 0 then {sprawdzamy czy liczba jest większa od 0} Writeln('Liczba jest dodatnia') {wypisujemy stosowny tekst (bez ";"!!!, bo jest przed else)} else {w przeciwnym wypadku} if liczba = 0 then {jeżeli liczba jest równa 0 to} Writeln('Podana liczba jest zerem.') {wypisujemy stosowny tekst (bez ";"!!!, bo jest przed else)} else {w przeciwnym wypadku} Writeln('Liczba jest ujemna.); {wypisujemy stosowny tekst} 5

Zadanie 2: Napisz program który będzie wczytywał pewną liczbę naturalną, sprawdzał czy jest dodatnia czy ujemna, i tak dopóki nie wpiszemy 0. Skorzystamy z przykładu z zadania 1. Przykład 1 z użyciem pętli repeat... until; program sprawdzanie_ulepszone_petla; var liczba : integer; {nadajemy zmiennej liczba typ liczb całkowitych} repeat {powtarzaj wszystko pomiędzy repeat a until} Writeln('Wpisz jakąś liczbę całkowitą:'); Readln(liczba); {wczytujemy liczbę z klawiatury} if liczba > 0 then {sprawdzamy czy liczba jest większa od 0} Writeln('Liczba jest dodatnia') {wypisujemy stosowny tekst (bez ";"!!!, bo jest przed else)} else {w przeciwnym wypadku} Writeln('Liczba jest ujemna.); {wypisujemy stosowny tekst} until liczba = 0; {dopóki liczba nie przyjmie wartości 0} Czyż to nie jest banalne? Przykład 2 z użyciem pętli while... do;. program sprawdzanie_ulepszone_petla; var liczba : integer; {nadajemy zmiennej liczba typ liczb całkowitych} liczba := 1; {pod zmienną liczba przypisujemy wartośd różną od 0 (np. 1), ponieważ pętla while sprawdza warunek "liczba <> 0" przed wczytaniem liczby z klawiatury - gdy tego nie zrobimy, pętla od razu zostanie przerwana i program się wyłączy} while liczba <> 0 do {podczas gdy liczba różna od 0 to powtarzaj} {używamy ponieważ mamy kilka różnych instrukcji (Writeln, Readln, if itd.); pudełko nr 1} Writeln('Wpisz jakąś liczbę całkowitą:'); Readln(liczba); {wczytujemy liczbę z klawiatury} if liczba > 0 then {sprawdzamy czy liczba jest większa od 0} Writeln('Liczba jest dodatnia') {wypisujemy stosowny tekst (bez ";"!!!, bo jest przed else)} else {w przeciwnym wypadku} Writeln('Liczba jest ujemna.); {wypisujemy stosowny tekst} {koniec pudełka nr 1} 6

Zadanie 3: Sumowanie ciągu liczb naturalnych. Tym razem użyjemy pętli for ponieważ wiemy ile zostanie podanych liczb. program sumowanie; var liczba, ile, suma, licznik : integer; {nadajemy zmiennym typ liczb całkowitych} Write('Ile liczb chcesz zsumowad? '); Readln(ile); {wczytujemy ile liczb będziemy sumowad} for licznik := 1 to ile do {zaczynamy powtarzad od 1 do "ile" włącznie (wpisana przez nas) } {używamy ponieważ mamy kilka różnych instrukcji (Writeln, Readln, if itd.); pudełko nr 1} Write('Wpisz liczbę do sumowania: '); Readln(liczba); {wczytujemy z klawiatury liczbę} suma:=suma+liczba; {dodajemy do obecnej sumy kolejną wpisaną liczbę} {koniec pudełka nr 1} Writeln('Suma wynosi: ', suma); {wyświetlamy sumę liczb} Program z zabezpieczeniem przeciwko ujemnej liczbie sumowanych liczb. Dodatkowo zapamiętuje jakie liczby zostały wpisane. program sumowanie; var ile, suma, licznik : integer; {nadajemy zmiennym typ liczb całkowitych} var tablica : array[1..1000] of integer; {tworzymy tablice w której zapamiętamy wszystkie liczby} Write('Ile liczb chcesz zsumowad? '); Readln(ile); {wczytujemy ile liczb będziemy sumowad} if ile < 0 then ile:= ile*-1; {sprawdzamy czy ile nie jest ujemne, jeśli tak to mnożymy ją przez -1} if ile < 1000 then {tworząc tablice ustawiliśmy jej rozmiar do max 1000 różnych liczb, aby uniknąd niepotrzebnych błędów sprawdzamy, czy podana wartośd jest mniejsza od 1000} {pudełko nr 1} for licznik := 1 to ile do {zaczynamy powtarzad od 1 do "ile" włącznie (wpisana przez nas) } {używamy ponieważ mamy kilka różnych instrukcji (Writeln, Readln, if itd.); pudełko nr 2} Write('Wpisz ', licznik,' liczbę do sumowania: '); Readln(tablica[licznik]); {wczytujemy z klawiatury liczbę do tablicy} suma:=suma+tablica[licznik]; {dodajemy do obecnej sumy kolejną wpisaną liczbę} {koniec pudełka nr 2} Write('Suma liczb: '); for licznik :=1 to ile do {pętla która wypisze wszystkie liczby} if licznik = ile then {sprawdzamy czy liczba nie jest przypadkiem ostatnia} Write(tablica[licznik], '=') {do ostatniej liczby dodajemy "="} else {w przeciwnym wypadku} Write(tablica[licznik], '+'); {do każdej liczby dodajemy "+" dla ładnego wyglądu} Writeln(suma,'.'); {wypisujemy wynik działania} end {koniec pudełka nr 1} else {jeżeli więcej niż 1000} Writeln('Za dużo liczb do zsumowania (max 1000).'); 7

Zadanie 4: Znajdź największą liczbę w podanym ciągu. program najwieksza_wiadome; uses Crt; {używamy biblioteki która będzie czyścid nam ekran} var tablica : array[1..5] of integer; {tworzymy tablicę do max 5 liczb (wystarczy 5 zmienid na dowolną liczbę jeśli potrzebujemy)} var najwieksza, licznik : integer; {pomocnicze zmienne} Clrscr; {czyścimy obraz} najwieksza:=-32768; {przypisujemy najmniejszą możliwą liczbę dla zmiennej typu integer (musimy to zrobid, aby nasz program działał również na liczbach ujemnych, gdybyśmy tego nie uczynili największa miała by wartośd początkową 0 - usuo tą linijkę i przekonaj się sam!)} tablica[1]:=54; {ustalamy pierwszą liczbę} tablica[2]:=23; tablica[3]:=-83; tablica[4]:=12; tablica[5]:=-7; {ustalamy piątą liczbę} for licznik:=1 to 5 do {pętla działająca 5 razy (od 1 do 5), gdy podamy więcej liczb musimy zmienid 5 na inną liczbę} if tablica[licznik]>najwieksza then najwieksza:=tablica[licznik]; {porównujemy następną liczbę z ostatnią największą, jeśli jest większa, ustawiamy ją jako nową największą} Writeln('Najwieksza liczba to: ', najwieksza); {wypisujemy największą liczbę} Gdy liczby będziemy dostawad z zewnątrz, program musi wyglądad troszkę inaczej np.: program najwieksza_liczba; uses Crt; var najwieksza, ile, licznik, liczba : integer; {pomocnicze zmienne} Clrscr; {czyścimy obraz} najwieksza:=-32768; {przypisujemy najmniejszą możliwą liczbę dla zmiennej typu integer (musimy to zrobid, aby nasz program działał również na liczbach ujemnych, gdybyśmy tego nie uczynili największa miała by wartośd początkową 0 - usuo tą linijkę i przekonaj się sam!)} Write('Ile bedzie liczb? '); {pytamy o ilośd liczb w ciągu} Readln(ile); {wczytujemy tą liczbę} for licznik:=1 to ile do {pętla prosząca o "ile" liczb} {pudełko nr 1} Write('Podaj ', licznik,' liczbe do sprawdzenia: '); Readln(liczba); {wczytujemy daną liczbę z kolei} if liczba>najwieksza then najwieksza:=liczba; {sprawdzamy czy przypadkiem podana liczba nie jest większa od naszej dotychczasowej największej liczby, jeśli tak zmieniamy największą na nową} {koniec pudełka nr 1} Writeln('Najwieksza liczba jest: ', najwieksza); {wypisujemy największą liczbę} 8

Zadanie 5: Znajdź największy wspólny dzielnik przy pomocy algorytmu Euklidesa. program najwiekszy_spolny_dzielnik; var a, b, nwd : integer; Write('Podaj pierwszą liczbe: '); Readln(a); Write('Podaj drugą liczbe: '); Readln(b); while a<>b do {pętla działająca gdy a i b są różne} if a>b then a:=a-b else b:=b-a; {jeżeli a jest większe od b, wtedy pod a podstawiamy różnicę a- b, w przeciwnym wypadku (większe b) pod b podstawiamy różnicę b-a} nwd:=a; Writeln('Największy wspolny dzielnik to: ', nwd,'.'); Przykład szukania NWD przy pomocy dzielenia. program najwiekszy_spolny_dzielnik; var a, b, nwd, x : integer; Write('Podaj pierwszą liczbe: '); Readln(a); Write('Podaj drugą liczbe: '); Readln(b); x:=1; while x<>0 do {pudełko nr 1} if a>b then {jeżeli a większe b} if a mod b = 0 then {jeżeli reszta z dzielenia wynosi 0 to wypisujemy NWD} {pudełko nr 2} Writeln('NWD: ', b); x:=0 {podstawiamy pod x 0 aby przerwad pętle while} end {koniec pudełka nr 2} else a:=a mod b {podstawiamy pod a (większe od b): resztę z dzielenia a przez b} else if b mod a = 0 then {jeżeli reszta z dzielenia b przez a wynosi 0 to wypisujemy NWD} {pudełko nr 3} Writeln('NWD: ', a); x:=0 {podstawiamy pod x 0 aby przerwad pętle while} end {koniec pudełka nr 3} else b:=b mod a; {podstawiamy pod b (większe od a): resztę z dzielenia b przez a} {koniec pudełka nr 1} 9

Zadanie 6: Różne typy zmiennych - zastosowanie. Typ zmiennej to tak jakby opakowanie na produkt w sklepie np. nie będziemy przechowywad chipsów w szklanym słoiku, albo masła w puszce. Tak samo w Pascalu nie możemy przechowywad liter (znaków) pod zmienna liczbową integer i na odwrót. Każdy rodzaj danych (liczbowy, ciąg, znak) ma określony typ - pamiętaj więc o tym! Więcej o typach u Pawła Bajorka. :) program tajny_kod; var a : longint; {deklarujemy zmienna typu longint (patrz tabelka)} z : char; {deklarujemy zmienna typu char - jeden znak (liczba, litera)} Write('Podaj liczbe: '); Readln(a); {wczytujemy liczbe} Write('Podaj znak: '); Readln(z); {wczytujemy znak} Writeln('Tajny kod to: ', z, a*2); {wyświetlamy tajny kod będący znakiem połączonym z podwojoną liczbą} Następnym zadaniem jest zamiana znaku na następny z tablicy ASCII. program tajny_kod_2; var a : longint; {deklarujemy zmienną typu longint} z : char; {deklarujemy zmienna typu char - jeden znak (cyfra, litera)} b : shortint; {deklarujemy zmienną typu shortint} Write('Podaj liczbe: '); Readln(a); {wczytujemy liczbe} Write('Podaj znak: '); Readln(z); {wczytujemy znak} b:=integer(z); {zmieniamy znak na liczbę odpowiadającą mu z tabeli ASCII} if b<32 then b:=32; {eliminujemy wszystkie znaki specjalne takie jak spacja, shift itd.} if (b+1)>125 then b:=32; {sprawdzamy czy nie znajdujemy się przypadkiem na koocu tablicy ASCII, jeżeli tak to wyświetlamy pierwszy znak z tablicy} z:=char(b+1); {zamieniamy liczbę na znak z tablicy ASCII (char ma odwrotne działanie do funkcji integer)} Writeln('Tajny kod to: ', z, a*2); {wyświetlamy nasz wspaniały kod} Funkcje integer(); oraz char(); to wbudowane w język Pascal podstawowe instrukcje, które zajmują się najbrudniejszą robotą. Dzięki nim nie musimy tworzyd osobnej funkcji, tablicy i porównywad każdy ze znaków z osobna. Funkcja integer(); zamienia każdy znak na liczbę z tablicy ASCII np. A->65, a->97, 2->50 (dwa to cyfra!). Char(); natomiast wykonuje działanie odwrotne - odczytuje kod ASCII następnie zastępuje go danym znakiem np. 122->z, 115->s. Proponuję zajrzed tutaj. 10

Zadanie 7: Zabawa z tablicami Za zadanie mamy wczytad do tablicy dziesięd liczb, które następnie musimy wypisad... program tablice; var a : array[1..10] of Integer; {deklarujemy tablice o maksymalnie 10 różnych liczbach/rekordach/wpisach (w tym wypadku liczny całkowite - Integer)} licznik : Integer; {licznik potrzebny do pętli for} for licznik:=1 to 10 do {używamy, ponieważ chceny aby pętla for powtarzała nam więcej niż jedną funkcje (Write i Readln); pudełko nr 1} Write('Podaj ', licznik,' liczbe: '); {prosimy o kolejną liczbę} Readln(a[licznik]); {wczytujemy ją z klawiatury} {koniec pudełka nr 1} Write('Wpisane liczby to: '); for licznik:=1 to 10 do Write(a[licznik], ' '); {wyświetlamy w jednej linii wszystkie wpisane liczby} BONUS! Przykład dodatkowy dla zainteresowanych i ambitnych: Posortuj liczby od najmniejszej do największej. Użyjemy algorytmu bąbelkowego, bo jest łatwy w użyciu. Kliknij po więcej. program sortowanie_liczb; var a : array[1..10] of Integer; {deklarujemy tablice} licznik, pomocnicza : Integer; {dwie zmienne: jedna do pętli for, druga potrzebna do podstawiania} for licznik:=1 to 10 do {pętla do wczytywania 10 liczb} {pudełko nr 1} Write('Podaj ', licznik,' liczbe: '); {prosimy o kolejną liczbę} Readln(a[licznik]); {wczytujemy z klawiatury} {koniec pudełka nr 1} licznik:=1; {"zerujemy" licznik} while licznik<>10 do {pętla działająca do póki nie dojdziemy na koniec tablicy} if a[licznik]>a[licznik+1] then {sprawdzamy czy liczba jest większa od następnej w tablicy} {pudełko nr 2} pomocnicza:=a[licznik]; {jeśli tak to zapisujemy sobie liczbę wiekszą} a[licznik]:=a[licznik+1]; {w jej miejsce podstawiamy następna (mniejszą) liczbę} a[licznik+1]:=pomocnicza; {w miejsce mniejszej dajemy większą zapisaną wcześniej} licznik:=1; {"zerujemy" licznik} end {koniec pudełka nr 2} else {w przeciwnym wypadku} licznik:=licznik+1; {przechodzimy do sprawdzania następnej liczby w tablicy} Write('Posortowane liczby: '); for licznik:=1 to 10 do Write(a[licznik], ' '); 11

Zadanie 8: Sprawdź czy dany wyraz jest palindromem Palindrom to wyraz który czytany od tyłu brzmi i znaczy to samo co czytany w klasyczny sposób np. "kajak". Do rozwiązania tego problemu użyjemy zmiennej typu String oraz funkcji wbudowanej w Pascala Lenght(); która policzy długośd wpisanego wyrazu (np. dla "kajak" zwróci nam 5). program palindrom; var wyraz : string[20]; {tworzymy zmienna wyraz typu string (łaocuch znaków) o max 20 znakach} licznik, dlugosc, spr : Integer; {dodatkowe zmienne} Write('Wpisz słowo: '); Readln(wyraz); {wczytujemy podany wyraz} dlugosc:=length(wyraz); {zapamiętujemy jego długośd} for licznik:=1 to dlugosc do {powtarzamy pętle tyle razy ile znaków ma podany wyraz (trochę mało optymalne, można to ominąd, ale już nie chcę komplikowad)} if wyraz[licznik]=wyraz[dlugosc+1-licznik] then spr:=spr+1; {sprawdzamy czy odpowiadające sobie znaki z początku i kooca wyrazu są takie same, jeżeli tak, to zwiększamy zmienną "spr" o 1} if spr=dlugosc then {tutaj wykorzystujemy zmienną spr do porównania jej z długością wyrazu} Writeln('Brawo to palindrom!') {jeżeli są równe - to oznacza że wszystkie odpowiadające sobie znaki były jednakowe} else Writeln('Niestety to nie palindrom!'); {jeżeli różnica wynosi chociażby 1 wypisujemy, że to nie palindrom} 12

Zadanie 9: Stwórz procedurę wypisującą n razy ":)" Na początek może wyjaśnię co, z czym i jak :) Procedury to nic innego jak mini program w naszym głównym programie. Tzn. używa się ich, gdy dany fragment kodu wykorzystujemy wielokrotnie w różnych miejscach. Przykładowo: program przyklad; uses crt; var i, ile : Integer; Clrscr; Write('Ile razy wyswietlic ":)"? '); Readln(ile); for i:=1 to ile do Write(':)'); Writeln; Write('Ile razy wyswietlic ":)"? '); Readln(ile); for i:=1 to ile do Write(':)'); Writeln; Write('Ile razy wyswietlic ":)"? '); Readln(ile); for i:=1 to ile do Write(':)'); Czy nie wydaje się wam, że pewne fragmenty kodu się powtarzają? Czy nie można prościej? Po co pisad to samo tyle razy? Tutaj właśnie przydadzą się nam procedury (i funkcje, ale to później:)). Procedury mają budowę identyczną jak program (prawie): PROGRAM program nazwa_programu; var zmienna : Integer; {dalsza część programu} PROCEDURY procedure nazwa_procedury(parametry); var zmienna : Integer; {dalsza częśd procedury} Procedura może przyjmowad jakiś parametr, lecz nie musi (w takim przypadku omijamy po nazwie nawiasy). Procedury deklarujemy w programie przed słówkiem (głównego programu po którym występuje dalsza częśd programu), czyli: program nazwa_programu; var zmienna : Integer; 13

procedure nazwa_procedury; var zmienna : Integer; { procedury} {dalsza częśd procedury} {główny } nazwa_procedury; {wywołanie procedury - zrobi nam to co zaprogramowaliśmy w "dalsza częśd procedury} {dalsza częśd programu} Jak przerobid poprzedni przykład? Na przykład tak: program przyklad; uses crt; var ile : Integer; procedure wypisz; var i : Integer; Write('Ile razy wyswietlic ":)"? '); Readln(ile); for i:=1 to ile do Write(':)'); Writeln; Clrscr; wypisz; wypisz; wypisz; Powyższy program 3 razy powtórzy procedurę pytania "Ile razy wyświetlic" oraz samo wypisywanie " :)". Oczywiście można stworzyd procedurę do której będziemy przekazywad ilośd powtórzeo jej działania zamiast pisad "wypisz; wypisz; wypisz;". program przyklad; uses crt; var ile : Integer; procedure wypisz(pow : Integer); var i, j : Integer; for j:=1 to pow do Write('Ile razy wyswietlic ":)"? '); Readln(ile); for i:=1 to ile do Write(':)'); Writeln; 14

Clrscr; wypisz(3); Działanie jest identyczne :) Różnych możliwości, przeróbek jest naprawdę wiele, toteż nie podam ich tu wszystkich. Zachęcam to eksperymentów przed przejściem do następnej części! Zadanie 10: Stwórz program skracający ułamek zwykły Powtórzę: jeśli dalej nie rozumiesz procedur eksperymentuj! Zadania: 1. Napisz program który będzie wypisywał imię osoby (wczytane pod zmienną), określoną ilośd razy. 2. Napisz program który będzie dodawał x par liczb całkowitych. Teraz, jeśli rozwiązałeś/aś te zadania przejdź dalej... Nasz program ma znajdowad największy wspólny dzielnik licznika i mianownika, a następnie skracad cały ułamek. Tak więc zaczynajmy: program ulamki; uses crt; var licznik, mianownik : Integer; procedure wczytaj; Write('Podaj licznik: '); Readln(licznik); Write('Podaj mianownik: '); Readln(mianownik); procedure wypisz; Clrscr; Writeln(licznik); Writeln('----'); Writeln(mianownik); Clrscr; wczytaj; wypisz; 15

Powyższy program wczyta licznik i mianownik, następnie wypisze go w formie: licznik --------------- mianownik Co dalej? Musimy stworzyd funkcje która będzie obliczad nam NWD. Polecam zajrzed na wikipedie gdzie znajduje się gotowy kod i przede wszystkim przypomnienie zasady działania. program ulamki; uses crt; var licznik, mianownik : Integer; procedure wczytaj; Write('Podaj licznik: '); Readln(licznik); Write('Podaj mianownik: '); Readln(mianownik); function NWD : Integer; var a, b : Integer; a:=licznik; b:=mianownik; while a<>b do if a>b then a:=a-b else b:=b-a; NWD:=a; procedure wypisz; var dzielnik, licznik2, mianownik2 : Integer; Clrscr; dzielnik:=nwd; licznik2:=licznik div dzielnik; mianownik2:=mianownik div dzielnik; Writeln('Przed:'); Writeln(licznik); Writeln('----'); Writeln(mianownik); Writeln; Writeln('Po:'); Writeln(licznik2); Writeln('----'); Writeln(mianownik2); 16

Clrscr; wczytaj; wypisz; Już widzę miny większości z was... Dlaczego tak, co, gdzie i jak? Zmodyfikowałem procedurę wypisz, oraz tuż przed nią dopisałem funkcje NWD (nie przyjmującą żadnego parametru). Funkcja różni się od procedury tym, że zwraca jakąś wartośd - w naszym przypadku Integer którą zapisujemy pod zmienną dzielnik. Następnie pod zmienną należącą do procedury (została utworzona po deklaracji "procedure wypisz;" więc należy do tej procedury) licznik2 i mianownik2 podstawiamy/przypisujemy wartośd z dzielenia całkowitego (div). Pewnie wielu z was myśli to trudne - NIE to nie jest trudne tylko wystarczy przeanalizowad przykład i spróbowad go przerobid według własnego pomysłu. Dla tych co myślą inaczej i zastanawiają się: "A co gdy będzie więcej ułamków?" przygotowałem następny program. program ulamki; uses crt; var licznik, mianownik, licznik2, mianownik2 : array[1..100] of Integer; ile, i : Integer; procedure wczytaj(pow : Integer); for i:=1 to pow do Write('Podaj licznik ',i,' ulamka: '); Readln(licznik[i]); Write('Podaj mianownik: ',i,' ulamka:'); Readln(mianownik[i]); function NWD(ktory : Integer) : Integer; var a, b : Integer; a:=licznik[ktory]; b:=mianownik[ktory]; while a<>b do if a>b then a:=a-b else b:=b-a; NWD:=a; procedure wypisz(pow : Integer); var dzielnik : Integer; Clrscr; for i:=1 to pow do dzielnik:=nwd(i); licznik2[i]:=licznik[i] div dzielnik; mianownik2[i]:=mianownik[i] div dzielnik; 17

Writeln('Przed:'); Writeln(licznik[i]); Writeln('----'); Writeln(mianownik[i]); Writeln; Writeln('Po:'); Writeln(licznik2[i]); Writeln('----'); Writeln(mianownik2[i]); Clrscr; Write('Ile bedzie ulamkow?'); Readln(ile); wczytaj(ile); wypisz(ile); Co najdziwniejsze powyższy kod działa :) Do tego przykłady musimy użyd tablicy (jeżeli chcemy gdzieś zapamiętad wyniki naszych obliczeo - uwierzcie, że to nam się jeszcze przyda). Mamy ich aż (tylko) cztery: dwie dla licznika i mianownika podstawowego, dwie dla licznika2 i mianownika2 - po skróceniu. Do procedur dodałem parametr który informuje (ją) ile wczytujemy/wypisujemy ułamków. Przy funkcji NWD zaś parametr informuje dla którego ułamka ma obliczyd NWD np. NWD(2) sprawdzi największy wspólny dzielnik dla ułamka podanego jako drugi. Jeśli nadal nie rozumiesz o co chodzi... eksperymentuj. Zastanów się: 1. Ile maksymalnie możemy podad ułamków? 2. Co zrobid aby wypisad sumę liczników? A mianowników? 3. Dlaczego funkcja NWD jest przed procedurą wypisz, a nie po? 18

Zadanie 11: Silnia - rekurencja Za zadanie mamy napisad program obliczający rekurencyjnie silnię. Silnię oznaczamy jako n!, gdzie n to dowolna liczba całkowita dodatnia. Przykładowo 5! = 1*2*3*4*5. Rekurencja polega na napisaniu funkcji która oblicza daną wartośd wywołując samą siebie - do pewnego momentu, który zależy od nas. Silnia rekurencyjnie 1. program silnia; 2. uses crt; 3. var liczba : Integer; 4. 5. function oblicz_silnie(n : Integer) : longint; 6. 7. if n=0 then 8. oblicz_silnie:=1 9. else 10. oblicz_silnie:=n*oblicz_silnie(n-1); 11. 12. 13. 14. Clrscr; 15. Write('Podaj liczbe: '); 16. Readln(liczba); 17. 18. writeln('silnia wynosi: ', oblicz_silnie(liczba)); 19. Opis kodu: 1. Nazywamy program. 2. Dołączamy bibliotekę Crt dzięki której będziemy mogli czyścid ekran. 3. Tworzymy zmienną liczba. 5. Tworzymy funkcje "oblicz_silnie" która przyjmuje jedną wartośd n typu Integer oraz zwraca wartośd typu longint. N to liczba dla której mamy obliczyd silnię. 6. Rozpoczynamy "ciało" funkcji. 7. Sprawdzamy czy aby przypadkiem liczba dla której mamy obliczyd silnię nie jest 0: 8. jeśli tak wartośd funkcji oblicz_silnie przyjmuje 1 9. w przeciwnym wypadku 10. Tutaj właśnie zauważamy rekurencję czyli wywołanie przez funkcję samej siebie. Wartośd funkcji oblicz_silnie przyjmuje n razy wartośd funkcji dla n mniejszego o jeden. 11. Koniec deklaracji funkcji. 13. Rozpoczynamy częśd główną programu. 14. Czyścimy ekran. 15+16. Prosimy o liczbę i ją wczytujemy. 18. Wypisujemy wartośd silni wywołując funkcję oblicz_silnie. 19. Koniec programu. 19

Zadanie 12: Podnoszenie 2 do potęgi n Naszym kolejnym zadaniem jest napisad program który oblicza wpisaną przez nas potęgę dwójki. Potęgowanie 2 1. program potega_dwojki; 2. uses crt; 3. var pot : Integer; 4. 5. function potega(dok : Integer) : Integer; 6. 7. if dok=0 then 8. potega:=1 9. else 10. potega:=2*potega(dok-1); 11. 12. 13. 14. Clrscr; 15. Write('Do ktorej potegi: '); 16. Readln(pot); 17. 18. writeln('potega 2 wynisi: ', potega(pot)); 19. Opis kodu: 1. Nazywamy program. 2. Dołączamy bibliotekę Crt dzięki której będziemy mogli czyścid ekran. 3. Tworzymy zmienną pot (od potęga :) ). 5. Tworzymy funkcje "potega" która przyjmuje jedną wartośd dok (dokąd) typu Integer oraz zwraca wartośd typu Integer. Dok to liczba mówiąca nam do której potęgi podnosimy 2. 6. Rozpoczynamy "ciało" funkcji. 7. Sprawdzamy czy aby przypadkiem do której potęgi nie jest równe 0: 8. jeśli tak wartośd funkcji potega przyjmuje 1 9. w przeciwnym wypadku 10. Używamy rekurencję. Wartośd funkcji potega przyjmuje 2 razy wartośd funkcji dla dok mniejszego o jeden. 11. Koniec deklaracji funkcji. 13. Rozpoczynamy częśd główną programu. 14. Czyścimy ekran. 15+16. Prosimy o liczbę i ją wczytujemy. 18. Wypisujemy wartośd potęgi wywołując funkcję potega. 19. Koniec programu. Dodatkowe zadania: 1. Przerób powyższy kod tak, aby liczył potęgę dla dowolnej liczby - nie tylko dla 2. 2. Napisz program obliczający NWD rekurencyjnie za pomocą algorytmu Euklidesa. 20