Podstawy programowania

Podobne dokumenty
Podstawy programowania

Podstawy programowania

Podstawy programowania w języku C++

Podstawy programowania

Podstawy programowania w języku C i C++

Podstawy programowania

Podstawy programowania

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

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

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

Język programowania PASCAL

Podstawy programowania

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Informatyka 1. Przetwarzanie tekstów

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

Programowanie w Turbo Pascal

Podstawy programowania

Wstęp do programowania. Różne różności

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

Języki programowania obiektowego Nieobiektowe elementy języka C++

OPERACJE NA PLIKACH. Podstawowe pojęcia:

Języki programowania obiektowego Nieobiektowe elementy języka C++

Podstawy programowania w języku C++

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

Podstawy programowania

Podstawy programowania w języku C++

Podstawy programowania w języku C++

lekcja 8a Gry komputerowe MasterMind

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Wykład III PASCAL - iteracja cz, 2, - liczby losowe, - tablice

Pascal - wprowadzenie

Programowanie w języku C++

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Wprowadzenie do programowania w języku C

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

Lekcja 6: Pascal. Procedura i funkcja

Systemy ekspertowe. Wnioskowanie w systemach regułowych. Część piąta. Autor Roman Simiński.

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Podstawy programowania skrót z wykładów:

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

Podstawy programowania w języku C++

Podstawy Programowania C++

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

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

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

WIADOMOŚCI WSTĘPNE WPROWADZENIE DO JĘZYKA TURBO PASCAL. Klawisze skrótów. {to jest właśnie komentarz, moŝna tu umieścić dowolny opis}

Informatyka 1. Wyrażenia i instrukcje cd., ręczna symulacja, operacje wejścia/wyjścia

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Lekcja 3: Pierwsze kroki z Pythonem. Pętle

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Programowanie. Wprowadzanie danych i wyprowadzanie wyników. Klasa 2 Lekcja 24 WEJŚCIE/WYJŚCIE

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

Wprowadzenie do programowania w języku C

Programowanie Delphi obliczenia, schematy blokowe

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

Wstęp do programowania

Zasady Programowania Strukturalnego

Tablice. TYPE identyfikator tablicy = ARRAY [Indeksl,..., Indeksn] OF Typ; Dany identyfikator_ tablicy można wykorzystać w deklaracji VAR:

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Wstęp do Informatyki

INSTRUKCJA ITERACYJNA REPEAT. repeat Instrukcja_1; Instrukcja_2; {... } Instrukcja_N; until wyr ; INSTRUKCJA ITERACYJNA WHILE

INSTRUKCJE PĘTLI, INSTRUKCJA WYBORU. Instrukcja pętli For to do

*W uproszczeniu: jest dziewięciu sędziów przyznających po dwie noty: za wartość techniczną i artystyczną (skala od 0.0 do 6.0)

KURS PASCAL A. 1.Wprowadzenie

Algorytmy i struktury danych

Instrukcje iteracyjne (pętle)

Programowanie w języku C++

Powtórka algorytmów. Wprowadzenie do języka Java.

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

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Kilka prostych programów

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wprowadzenie do programowanie obiektowego w języku C++

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Tablice deklaracja, reprezentacja wewnętrzna

LibreOffice Calc VBA

Bloki anonimowe w PL/SQL

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Wstęp do programowania

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

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

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

Instrukcja warunkowa i wyboru

Przykład programu Rozwiązanie równania postaci:

Systemy ekspertowe Część siódma Realizacja dziedzinowego systemu ekspertowego Roman Simiński

Systemy ekspertowe Część siódma Realizacja dziedzinowego systemu ekspertowego Roman Simiński

PASCAL Kompendium. Środowisko TURBO PASCAL Skróty klawiaturowe. Edycja kodu Pomoc spis treści. Skopiowanie zaznaczonego bloku do schowka

P R OGRA M OW A N I E KOMPUTERÓW Ćwiczenia laboratoryjne

Transkrypt:

Podstawy programowania Część siódma Tablice różne zastosowania Zbiory Autor Roman Simiński Kontakt siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

Problem 0 Do programu dopływa strumień znaków np. użytkownik wpisuje z klawiatury znak po znaku. Zadaniem programu jest wyznaczenie, ile wśród tych znaków jest dużych liter. Zakładamy, że wpisanie przez użytkownika znaku '\' kończy program. Copyright Roman Simiński Strona : 2

Problem 0 analiza + pseudokod Zdefiniuj zmienną całkowitą licznik dużych liter: LiczDL Wyzeruj LiczDL Powtarzaj Wczytaj znak Jeżeli znak jest dużą literą to Zwiększ LiczDL o 1 Aż zostanie naciśnięty znak '\' Wyprowadź LiczDL Copyright Roman Simiński Strona : 3

Problem 0 przykładowe rozwiązanie Program LiczbaDuzychLiter; Var LiczDL : Integer; (* Licznik duzych liter *) Znak : Char; (* Przechowuje wczytany znak *) Begin WriteLn( 'Podawaj kolejne znaki (kazdy zatwierdz Enterem), ' ); WriteLn( 'a ja policze ile wpisales duzych liter.' ); WriteLn( 'Nacisnij \ by zakonczyc.' ); (* Zerowanie licznika - bardzo wazna operacja *) LiczDL := 0; (* Iteracja wczytujaca znaki i zliczajaca duze litery *) Repeat Write( '>'); ReadLn( Znak ); If Znak In [ 'A'.. 'Z' ] Then LiczDL := LiczDL + 1; Until Znak = '\'; (* Wyswietlenie licznosci duzych liter *) WriteLn( 'Liczba duzych liter: ', LiczDL ); Write( 'Nacisnij Enter by zakonczyc program...' ); ReadLn; End. Copyright Roman Simiński Strona : 4

Problem 0 alternatywne wersje testu na dużą literę Wersja z wykorzystaniem zbioru znaków testowanie przynależności znaku zapamiętanego w zmiennej Znak do zbioru dużych liter [ 'A'.. 'Z' ] If Znak In [ 'A'.. 'Z' ] Then LiczDL := LiczDL + 1; Testowanie, czy znak zapamiętany w zmiennej Znak, zawiera się w przedziale dużych liter typu porządkowego Char. If ( Znak >= 'A' ) And ( Znak <= 'Z' ] Then LiczDL := LiczDL + 1; Copyright Roman Simiński Strona : 5

Problem 1 Jak w Problem 0, tylko wyznaczamy liczbę wystąpień każdej z dużych liter. Copyright Roman Simiński Strona : 6

Problem 1, rozwiązanie naiwne analiza + pseudokod Zdefiniuj zmienną całkowitą licznik dla litery A: LiczA Zdefiniuj zmienną całkowitą licznik dla litery B: LiczB... Zdefiniuj zmienną całkowitą licznik dla litery Z: LiczZ Wyzeruj LiczA, LiczB,... LiczZ Powtarzaj Wczytaj znak Jeżeli znak jest dużą literą to Jeżeli znak to 'A' to Zwiększ LiczA o 1 Jeżeli znak to 'B' to Zwiększ LiczB o 1... Jeżeli znak to 'Z' to Zwiększ LiczZ o 1 Aż zostanie naciśnięty znak '\' Wyprowadź LiczA, LiczB,... LiczZ Copyright Roman Simiński Strona : 7

Problem 1, rozwiązanie naiwne wątpliwości Zdefiniuj zmienną całkowitą licznik dla litery A: LiczA Zdefiniuj zmienną całkowitą licznik dla litery B: LiczB... Zdefiniuj zmienną całkowitą licznik dla litery Z: LiczZ Wyzeruj LiczA, LiczB,... LiczZ Potarzaj Wczytaj znak Jeżeli znak jest dużą literą to Jeżeli znak to 'A' to Zwiększ LiczA o 1 Jeżeli znak to 'B' to Zwiększ LiczB o 1... Jeżeli znak to 'Z' to Zwiększ LiczZ o 1 Aż zostanie naciśnięty znak '\' Tyle zmiennych? Sporo pisania... A jeżeli trzeba będzie jeszcze to samo zrobić dla małych liter i cyfr?!! 8-/ Wyprowadź LiczA, LiczB,... LiczZ Copyright Roman Simiński Strona : 8

Problem 1, rozwiązanie naiwne wątpliwości, cd.... Zdefiniuj zmienną całkowitą licznik dla litery A: LiczA Zdefiniuj zmienną całkowitą licznik dla litery B: LiczB... Zdefiniuj zmienną całkowitą licznik dla litery Z: LiczZ Wyzeruj LiczA, LiczB,... LiczZ Potarzaj Wczytaj znak Jeżeli znak jest dużą literą to Jeżeli znak to 'A' to Zwiększ LiczA o 1 Jeżeli znak to 'B' to Zwiększ LiczB o 1... Jeżeli znak to 'Z' to Zwiększ LiczZ o 1 Aż zostanie naciśnięty znak '\' Czy algorytm jest do... znaczy, że kiepski? Nie, algorytm jest OK. A może trzeba to jakoś sprytnie zaprogramować...? Wyprowadź LiczA, LiczB,... LiczZ Copyright Roman Simiński Strona : 9

Elementarz programisty: równanie Niklausa Wirth'a algorytmy + struktury danych = programy Algorytm mam. A o co chodzi z tymi strukturami danych...? Copyright Roman Simiński Strona : 10

Problem 1, poszukiwanie rozwiązanie nienaiwnego Rozwiązanie naiwne: definiujemy tyle liczników, ile dużych liter, każdy licznik jest osobną zmienną. Rozwiązanie lepsze: definiujemy tablicę liczb całkowitych, tablica ma tyle elementów ile dużych liter. LiczDL LiczA 2 A 2 LiczB 4 B 4 LiczC 0 C 0 Każdy element tablicy będzie licznikiem dla danej litery LiczZ 3 Z 3 Copyright Roman Simiński Strona : 11

Problem 1, poszukiwanie rozwiązanie nienaiwnego, cd.... Świat programisty LiczDL A B C A B Z Z Wyświetl zawartość tablicy Świat użytkownika Copyright Roman Simiński Strona : 12

Problem 1, jak zadeklarować tablicę liczników dla dużych liter? Deklaracja zmiennej tablicowej LiczDL: Var LiczDL : Array[ 'A'.. 'Z' ] Of Integer; Bardziej elegancka forma: Type DuzeLitery = 'A'.. 'Z'; Var LiczDL : Array[ DuzeLitery ] Of Integer; Jak odwołujemy się do elementów tablicy? LiczDL[ 'A' ] := 0;... LiczDL[ 'A' ] := LiczDL[ 'A' ] + 1;... WriteLn( LiczDL[ 'A' ] ); Copyright Roman Simiński Strona : 13

Problem 1 rozwiązanie sprytne Rozwiązanie bazuje na tym samy algorytmie co rozwiązanie naiwne, sprytność rozwiązania polega na mądrym wykorzystaniu możliwości typów tablicowych. Zakładając, ze zmienna Znak jest typu Char, zerowanie wszystkich liczników: (* Zerowanie tablicy licznikow duzych liter *) For Znak := 'A' To 'Z' Do LiczDL[ Znak ] := 0; Co rozwija się w trakcie wykonania w ciąg instrukcji: LiczDL[ 'A' ] := 0; LiczDL[ 'B' ] := 0; LiczDL[ 'C' ] := 0;... LiczDL[ 'Z' ] := 0; Copyright Roman Simiński Strona : 14

Problem 1 rozwiązanie sprytne Wczytanie znaku do zmiennej Znak, sprawdzenie czy to duża litera, oraz zwiększenie licznika odpowiadającego wczytanej literze. Write( '>'); ReadLn( Znak ); If Znak In [ 'A'.. 'Z' ] Then LiczDL[ Znak ] := LiczDL[ Znak ] + 1; To samo powtarzane, aż do wczytania znacznika końca: Repeat Write( '>'); ReadLn( Znak ); If Znak In [ 'A'.. 'Z' ] Then LiczDL[ Znak ] := LiczDL[ Znak ] + 1; Until Znak = '\'; Copyright Roman Simiński Strona : 15

Problem 1 rozwiązanie sprytne Wyprowadzenie zawartości tablicy liczników dużych liter do strumienia wyjściowego programu: WriteLn( 'Duze litery:' ); For Znak := 'A' To 'Z' Do Write( ' ', Znak, ': ', LiczDL[ Znak ] : 4 ); Copyright Roman Simiński Strona : 16

Problem 1 przykładowy kod programu Program LiczenieDuzychLiter; Type DuzeLitery = 'A'.. 'Z'; Var LiczDL : Array[ DuzeLitery ] Of Integer; Znak : Char; Begin (* Informacje o programie *) WriteLn( 'Podawaj kolejne znaki (kazdy zatwierdz Enterem), ' ); WriteLn( 'a ja policze ile wpisales duzych liter.' ); WriteLn( 'Nacisnij \ by zakonczyc.' ); (* Zerowanie tablicy licznikow duzych liter *) For Znak := 'A' To 'Z' Do LiczDL[ Znak ] := 0; (* Iteracja wczytujaca i zliczajaca *) Repeat Write( '>'); ReadLn( Znak ); If Znak In [ 'A'.. 'Z' ] Then LiczDL[ Znak ] := LiczDL[ Znak ] + 1; Until Znak = '\'; (* Ciag dalszy >> *) Copyright Roman Simiński Strona : 17

Problem 1 rozwiązanie sprytne, przykładowy kod programu (* Wyswietlenie liczby kazdej z duzych liter *) WriteLn; WriteLn( 'Duze litery:' ); For Znak := 'A' To 'Z' Do Write( ' ', Znak, ': ', LiczDL[ Znak ] : 4 ); WriteLn; Write( 'Nacisnij Enter by zakonczyc program' ); ReadLn; End. Dobór odpowiedniej struktury danych pozwolił zastosować naiwny i zdawało by się nieoptymalny algorytm. Często jest tak, że dobry pomysł na program nie tylko tkwi w algorytmie ale w dobrze zorganizowanych strukturach danych. Copyright Roman Simiński Strona : 18

Problem 2 Jak w Problem 1, tylko wyznaczamy liczbę wystąpień każdej z liter dużych, małych i cyfr. Copyright Roman Simiński Strona : 19

Problem 2 analogicznie jak dla dużych liter? Deklaracja zmiennej tablicowej LiczDL, LiczML, LiczC: Var LiczDL : Array[ 'A'.. 'Z' ] Of Integer; LiczML : Array[ 'a'.. 'z' ] Of Integer; LiczC : Array[ '0'.. '9' ] Of Integer; Bardziej elegancka forma: Type DuzeLitery = 'A'.. 'Z'; MaleLitery = 'a'.. 'z'; Cyfry = '0'.. '9'; Var LiczDL : Array[ DuzeLitery ] Of Integer; LiczML : Array[ MaleLitery ] Of Integer; LiczC : Array[ Cyfry ] Of Integer; Copyright Roman Simiński Strona : 20

Problem 2 analogicznie jak dla dużych liter? Wątpliwości... Niby sprytne, ale będzie teraz trzeba męczyć się z trzema tablicami... :( A jeżeli jeszcze dojdzie zapamiętywanie liczebności innych znaków, to robi się nieciekawie! Copyright Roman Simiński Strona : 21

Problem 2 a może wystarczy jedna tablica? Deklaracja tablicy liczników dla wszystkich znaków typy Char: Var Licznik : Array[ Char ] Of Integer; Przy tak zdefiniowanej tablicy, każdy znak będący elementem typu Char posiada swój własny licznik. Można zatem zliczać ile jest liter, cyfr, przecinków, kropek, itp., itd. Dla naszych potrzeb wystarczy wykorzystać tylko wybrane elementy tablicy, reszta póki co się marnuje. Ale mimo tej redundancji, przetwarzanie jest proste, dotyczy jednej tablicy. Uporządkowanie liter i cyfr w kodzie ASCII Znak: spójne obszary kodowe Cyfry Duże litery Małe litery... 0 1... 9... A B... Z... a b... z........................ Kod: 0 48 49 57 65 66 90 97 98 122 255 Copyright Roman Simiński Strona : 22

Problem 2 wystarczy jedna tablica Program LiczenieLiterICyfr; Var Licznik : Array[ Char ] Of Integer; Znak : Char; Begin (* Informacje o programie *) WriteLn( 'Podawaj kolejne znaki (kazdy zatwierdz Enterem), a ja policze' ); WriteLn( 'ile wpisales kazdej z liter oraz kazdej cyfr.' ); WriteLn( 'Nacisnij \ by zakonczyc.' ); (* Zerowanie tablicy licznikow duzych liter, dziala dla ASCII *) For Znak := Chr( 0 ) To Chr( 255 ) Do Licznik[ Znak ] := 0; (* Iteracja wczytujaca i zliczajaca *) Repeat Write( '>'); ReadLn( Znak ); Licznik[ Znak ] := Licznik[ Znak ] + 1; Until Znak = '\'; (* Ciag dalszy >> *) Copyright Roman Simiński Strona : 23

Problem 2 wystarczy jedna tablica (* Wyswietlenie licznika dla kazdej z duzych liter *) WriteLn; WriteLn( 'Duze litery:' ); For Znak := 'A' To 'Z' Do Write( ' ', Znak, ': ', Licznik[ Znak ] : 4 ); (* Wyswietlenie licznika dla kazdej z malych liter *) WriteLn; WriteLn( 'Male litery:' ); For Znak := 'a' To 'z' Do Write( ' ', Znak, ': ', Licznik[ Znak ] : 4 ); (* Wyswietlenie licznika dla kazdej z cyfr *) WriteLn; WriteLn( 'Cyfry:' ); For Znak := '0' To '9' Do Write( ' ', Znak, ': ', Licznik[ Znak ] : 4 ); WriteLn; Write( 'Nacisnij Enter by zakonczyc program' ); ReadLn; End. Copyright Roman Simiński Strona : 24

Kolejny program wytypuj szóstkę do dużego lotka Zadaniem programu jest wylosowanie sześciu liczb, pozwalających wypełnić pojedynczy typowanie tzw. dużego lotka. Losujemy liczby z przedziału 1.. 49, w wylosowanej szóstce nie może być powtórzeń. Copyright Roman Simiński Strona : 25

Wytypuj szóstkę do dużego lotka analiza + pseudokod Zdefiniuj zmienną całkowitą licznik losowanych liczb: Wylosowanych Zdefiniuj zmienną całkowitą pamięta aktualnie wylosowaną liczbę: Liczba Zainicjuj generator liczb pseudolosowych Wyzeruj zmienna Wylosowanych Powtarzaj Wylosuj wartość z przedzialu 1.. 49 i wstaw do zmiennej Liczba Wyprowadź zawartość zmiennej Liczba do strumienia wyjściowego Zwiększ zmienną Wylosowanych o 1 Aż zmienna Wylosowanych będzie miała wartość 6 To ma szansę zadziałać, ale nigdy nie wiadomo, czy losując kolejną liczbę, nie otrzymamy czasem którejś z już wcześniej wylosowanych liczb..., ale umówmy się, że ten problem rozwiążemy później. Copyright Roman Simiński Strona : 26

Wytypuj szóstkę do dużego lotka koślawa, pierwsza wersja Program LosujSzostke; Const (* Losujemy liczby od 1 do wartosci stalej Zakres *) Zakres = 49; Var Liczba : Integer; (* Losowana liczba, kandydat do szostki *) Wylosowanych : Integer; (* Licznik losowanych liczb *) Begin WriteLn( 'Losuje szostke liczb z 49-ciu.' ); Randomize; (* Inicjalizacja generatora liczb pseudolosowych *) WriteLn( 'Wylosowana szostka: ' ); Wylosowanych := 0; (* Zerowanie licznika wylosowanych liczb *) Repeat Liczba := Random( Zakres ) + 1; (* Losowanie liczby z zakresu *) Write( Liczba, ' ' ); (* Wyprowadzenie wylosowanej liczby *) Wylosowanych := Wylosowanych + 1; Until Wylosowanych = 6; (* Powtarzamy az wylosujemy szostke *) WriteLn; WriteLn( 'Nacisnij Enter by zakonczyc program...' ); ReadLn; End. Copyright Roman Simiński Strona : 27

Wytypuj szóstkę do dużego lotka jak wyeliminować duplikaty? Zdefiniuj zmienną całkowitą licznik losowanych liczb: Wylosowanych Zdefiniuj zmienną całkowitą pamięta aktualnie wylos. liczbę: Liczba Zainicjuj generator liczb pseudolosowych Wyzeruj zmienna Wylosowanych Potarzaj Wylosuj wartość z przedzialu 1.. 49 i wstaw do zmiennej Liczba Jeżeli wartość zmiennej Liczba nie była jeszcze wylosowana To Wyprowadź zawartość zmiennej Liczba Zwiększ zmienną Wylosowanych o 1 Aż zmienna Wylosowanych będzie miała wartość 6 W jaki sposób pamiętać, jakie liczby zostały wylosowane wcześniej? Copyright Roman Simiński Strona : 28

Wytypuj szóstkę do dużego lotka rejestr wylosowanych liczb Każdy element rejestru odpowiada liczbie kandydatce do szóstki. Jeżeli na danej pozycji w rejestrze ustawiona jest wartość Tak, to dana liczba została już wylosowana. Jeżeli na zadanej pozycji jest wartość Nie, taka liczba jeszcze nie była wylosowana. JuzWylosowane Tak Nie Tak Nie Tak... Nie Nie Tak Tak Nie 1 2 3 4 5 45 46 47 48 49 Załóżmy, że wylosowano liczbę 45. Na pozycji tej liczbie odpowiadającej jest Nie, zatem takiej liczby jeszcze nie wylosowano. Liczba 45 może wejść do losowanej szóstki. Copyright Roman Simiński Strona : 29

Wytypuj szóstkę do dużego lotka rejestr wylosowanych liczb Każdy element rejestru odpowiada liczbie kandydatce do szóstki. Jeżeli na danej pozycji w rejestrze ustawiona jest wartość Tak, to dana liczba została już wylosowana. Jeżeli na zadanej pozycji jest wartość Nie, taka liczba jeszcze nie była wylosowana. JuzWylosowane Tak Nie Tak Nie Tak... Tak Nie Tak Tak Nie 1 2 3 4 5 45 46 47 48 49 Zaznaczamy, że liczba 45 została wylosowana wpisując do rejestru Tak, na pozycji odpowiadającej tej liczbie. Copyright Roman Simiński Strona : 30

Wytypuj szóstkę do dużego lotka rejestr wylosowanych liczb Każdy element rejestru odpowiada liczbie kandydatce do szóstki. Jeżeli na danej pozycji w rejestrze ustawiona jest wartość Tak, to dana liczba została już wylosowana. Jeżeli na zadanej pozycji jest wartość Nie, taka liczba jeszcze nie była wylosowana. JuzWylosowane Tak Nie Tak Nie Tak... Tak Nie Tak Tak Nie 1 2 3 4 5 45 46 47 48 49 Załóżmy, że wylosowano liczbę 5. Na pozycji tej liczbie odpowiadającej jest Tak, zatem tę liczbę już wylosowano. Liczba 5 zostaje odrzucona jako dublet. Copyright Roman Simiński Strona : 31

Wytypuj szóstkę do dużego lotka rejestr wylosowanych liczb Każdy element rejestru odpowiada liczbie kandydatce do szóstki. Jeżeli na danej pozycji w rejestrze ustawiona jest wartość Tak, to dana liczba została już wylosowana. Jeżeli na zadanej pozycji jest wartość Nie, taka liczba jeszcze nie była wylosowana. JuzWylosowane Tak Nie Tak Nie Tak... Tak Nie Tak Tak Nie 1 2 3 4 5 45 46 47 48 49 Z rejestru wylosowanych liczb można wyczytać, które z nich zostały wylosowane: 1 3 5 45 47 48 Copyright Roman Simiński Strona : 32

Jak uzyskać taki rejestr w programie? Taki rejestr to tablica 49 elementów. Każdy element takiej tablicy przyjmuje tylko jedną z dwóch możliwych wartości {Tak, Nie}, odpowiada to typowi Boolean w języku Pascal. JuzWylosowane Tak Nie Tak Nie Tak... Tak Nie Tak Tak Nie 1 2 3 4 5 45 46 47 48 49 Const Zakres = 49; Var JuzWylosowane : Array[ 1.. Zakres ] Of Boolean; Copyright Roman Simiński Strona : 33

Jak sprawdzić, czy liczba już była (lub nie była) wylosowana? (* Losowanie liczby z zakresu *) Liczba := Random( Zakres ) + 1; (* Czy juz te liczbe wylosowano? *) If JuzWylosowane[ Liczba ] Then Begin (* Cos tam, gdy byla wylosowana *) End; (* Losowanie liczby z zakresu *) Liczba := Random( Zakres ) + 1; (* Czy jeszcze tej liczby nie wylosowano? *) If Not JuzWylosowane[ Liczba ] Then Begin (* Cos tam, gdy nie byla wylosowana *) End; Copyright Roman Simiński Strona : 34

Jak oznaczyć, że liczba zostala wylosowana? (* Losowanie liczby z zakresu *) Liczba := Random( Zakres ) + 1; (* Czy jeszcze tej liczby nie wylosowano? *) If Not JuzWylosowane[ Liczba ] Then Begin (* Nie bylo jeszcze takiej liczby, ustawiamy jej "flage" w tablicy *) JuzWylosowane[ Liczba ] := True; (* Cos tam dalej, gdy nie byla wylosowana *) End; Copyright Roman Simiński Strona : 35

Jak wylosować całą szóstkę? (* Zerowanie licznika wylosowanych liczb *) Wylosowanych := 0; Repeat (* Losowanie liczby z zakresu *) Liczba := Random( Zakres ) + 1; (* Czy czasem juz tej liczby nie wylosowano? *) If Not JuzWylosowane[ Liczba ] Then Begin (* Nie bylo jeszcze tej liczby, ustawiamy jej "flage" w tablicy *) JuzWylosowane[ Liczba ] := True; (* Zwiekszamy licznik wylosowanych liczb *) Wylosowanych := Wylosowanych + 1; End; (* Powtarzamy az wylosujemy szostke *) Until Wylosowanych = 6; Copyright Roman Simiński Strona : 36

Jak wyprowadzić szóstkę? (* Wyswietlenie wylosowanej szostki *) WriteLn( 'Wylosowana szostka: ' ); For Liczba := 1 To Zakres Do (* Przejrzyj rejestr liczb z zakresu *) If JuzWylosowane[ Liczba ] Then (* Jezeli liczba wylosowana *) Write( Liczba, ' ' ); (* Wyprowadz liczbe *) Uwaga, żeby to wszystko zadziałało, trzeba wcześniej wyzerować rejestr wylosowanych liczb: (* Jeszcze nie wylosowano zadnej liczby, czyszczenie tablicy *) For Liczba := 1 To Zakres Do JuzWylosowane[ Liczba ] := False; Copyright Roman Simiński Strona : 37

Wytypuj szóstkę do dużego lotka pełna wersja programu Program LosujSzostke; Const (* Losujemy liczby od jeden do wartosci stalej Zakres *) Zakres = 49; Var (* Tablica "flag" dla kazdej liczby z zakresu. Jezeli liczba zostala *) (* wylosowana, to na jej pozycji bedzie wartosc True, False gdy liczba *) (* nie zostala wylosowana *) JuzWylosowane : Array[ 1.. Zakres ] Of Boolean; (* Tutaj wylosowana liczba, kandydat do losowanej szostki *) Liczba : Integer; (* Licznik losowanych liczb *) Wylosowanych : Integer; Begin WriteLn( 'Losuje szostke liczb z 49-ciu.' ); (* Jeszcze nie wylosowano zadnej liczby, czyszczenie tablicy *) For Liczba := 1 To Zakres Do JuzWylosowane[ Liczba ] := False; (* Inicjalizacja generatora liczb pseudolosowych *) Randomize; (* Ciag dalszy >> *) Copyright Roman Simiński Strona : 38

Wytypuj szóstkę do dużego lotka pełna wersja programu, cd. (* Zerowanie licznika wylosowanych liczb *) Wylosowanych := 0; Repeat Liczba := Random( Zakres ) + 1; (* Losowanie liczby z zakresu *) If Not JuzWylosowane[ Liczba ] Then (* Czy wczesniej nie wylosowana? *) Begin (* Jeszcze niewylosowana, ustawiamy jej "flage" w tablicy *) JuzWylosowane[ Liczba ] := True; (* Zwiekszamy licznik wylosowanych liczb *) Wylosowanych := Wylosowanych + 1; End; (* Powtarzamy az wylosujemy szostke *) Until Wylosowanych = 6; (* Wyswietlenie wylosowanej szostki *) WriteLn( 'Wylosowana szostka: ' ); For Liczba := 1 To Zakres Do (* Sprawdz flagi liczb z zakresu *) If JuzWylosowane[ Liczba ] Then (* Jezeli liczba zostala wylosowana *) Write( Liczba, ' ' ); (* Wyprowadz liczbe *) WriteLn; WriteLn( 'Nacisnij Enter by zakonczyc program...' ); ReadLn; End. Copyright Roman Simiński Strona : 39

Wytypuj szóstkę do dużego lotka wersja alternatywna Zdefiniuj zmienną całkowitą licznik losowanych liczb: Wylosowanych Zdefiniuj zmienną całkowitą pamięta aktualnie wylos. liczbę: Liczba Zdefiniuj zmienną będącą zbiorem liczb pamięta wylosowane liczby: Wylosowane Zainicjuj generator liczb pseudolosowych Wylosowane := Potarzaj Wylosuj wartość z przedzialu 1.. 49 i wstaw do zmiennej Liczba Jeżeli Liczba Wylosowane To Wylosowane := Wylosowane Liczba Zwiększ zmienną Wylosowanych o 1 Aż zmienna Wylosowanych = 6 Dla każdej liczby z zakresu Wykonaj Jeżeli Liczba Wylosowane To Wyprowadź Liczba Copyright Roman Simiński Strona : 40

Zbiór jak struktura danych Typ zbiorowy należy do złożonych (strukturalnych) typów danych. Zbiór (zmienna teoriomnogościowa) składa się z elementów tego samego typu podstawowego, musi to być typ porządkowy. Zbiór może być pusty, lub zawierać elementy. Liczba elementów zbioru może się zmieniać. Komputerowa implementacja zbiorów ma ograniczenia. Liczność zbioru nie może przekraczać pewnego limitu, zwykle jest to 256 elementów. Zdefiniowanie takiej zmiennej się nie uda. Typ Integer ma zbyt wiele wartości: Var Wylosowane : Set of Integer; Zdefiniowanie takiej zmiennej się powiedzie. Typ Char ma mniej wartości: Var DozwoloneZnaki : Set of Char; Copyright Roman Simiński Strona : 41

Definiowanie zbiorów Typ podstawowy musi być typem porządkowym. Var TrzyLitery : Set Of 'A'.. 'C'; Zmienna TrzyLitery może mieć wartości: [], [ 'A' ], [ 'B' ], [ 'C' ], [ 'A', 'C' ], [ 'A', 'B' ], [ 'B', 'C' ], [ 'A', 'B, 'C' ] Wszystkie możliwe podzbiory zbioru podstawowego to zbiór potęgowy, Copyright Roman Simiński Strona : 42

Operacje na zbiorach Ustawienie zbioru pustego: TrzyLitery := []; Dopisanie elementu do zbioru: TrzyLitery := TrzyLitery + [ 'A' ]; Sprawdzenie, czy elemet należy do zbioru: Var Litera : 'A'.. 'C';... If Liter In TrzyLitery Then { cos tam }; Na zbiorach działają operatory + (suma zbiorów), (różnica zbiorów), * (przecięcie zbiorów), In (przynależność elementu do zbioru), = (równość zbiorów), <> (nierówność zbiorów), >= oraz <= (zawieranie zbiorów). Copyright Roman Simiński Strona : 43

Definiowanie zbiorów Aby zdefiniować zbiór o elementach typu liczba całkowita, należy wprowadzić typ okrojony: Var Wylosowane : Set Of 1.. 49; Zmienna Wylosowane może mieć przykładowe wartości: Wylosowane [] [ 47, 48, 49 ] [ 1, 2 ] [ 49 ] [ 1, 2 ] [ 5, 21, 33 ] Copyright Roman Simiński Strona : 44

Wytypuj szóstkę do dużego lotka wykorzystanie zbiorów Program LosujSzostke; Const (* Losujemy liczby od jeden do wartosci stalej Zakres *) Zakres = 49; Type (* Typ okrojony odpowiadajacy puli losowanych liczb *) PulaLiczb = 1.. Zakres; Var (* Zbior losowanych liczb *) Wylosowane : Set of PulaLiczb; (* Tutaj wylosowana liczba, kandydat do losowanej szostki *) Liczba : PulaLiczb; (* Licznik losowanych liczb *) Wylosowanych : Integer; (* Ciag dalszy >> *) Copyright Roman Simiński Strona : 45

Wytypuj szóstkę do dużego lotka wykorzystanie zbiorów Begin WriteLn( 'Losuje szostke liczb z 49-ciu.' ); (* Jeszcze nie wylosowano zadnej liczby, zbior wylosowanych ma byc pusty *) Wylosowane := []; (* Inicjalizacja generatora liczb pseudolosowych *) Randomize; (* Zerowanie licznika wylosowanych liczb *) Wylosowanych := 0; Repeat (* Losowanie liczby z zakresu *) Liczba := Random( Zakres ) + 1; (* Czy czasem juz tej liczby nie wylosowano? *) If Not ( Liczba In Wylosowane ) Then Begin (* Nie bylo jeszcze takiej liczby, wstawiamy ja do zbioru *) Wylosowane := Wylosowane + [ Liczba ]; (* Zwiekszamy licznik wylosowanych liczb *) Wylosowanych := Wylosowanych + 1; End; (* Powtarzamy az wylosoujemy szostke *) Until Wylosowanych = 6; (* Ciag dalszy >> *) Copyright Roman Simiński Strona : 46

Wytypuj szóstkę do dużego lotka wykorzystanie zbiorów (* Wyswietlenie wylosowanej szostki *) WriteLn( 'Wylosowana szostka: ' ); (* Sprawdz, ktore liczby z zakresu sa w zbiorze wylosowanych *) For Liczba := 1 To Zakres Do If Liczba In Wylosowane Then (* Jezeli liczba zostala wylosowana *) Write( Liczba, ' ' ); (* Wyprowadz liczbe *) WriteLn; WriteLn( 'Nacisnij Enter by zakonczyc program...' ); ReadLn; End. Copyright Roman Simiński Strona : 47