Informatyka MPZI Wykład 4 Podprogramy Pliki Typ zbiorowy Rekurencja.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Katarzyna Szafrańska kl. II ti
Wstęp do strumieni danych
Język C/C++ Funkcje.
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
PASCAL (3) dr Anna Kwiatkowska.
PROGRAMOWANIE STRUKTURALNE
PROGRAMOWANIE STRUKTURALNE
ZŁOŻONOŚĆ OBLICZENIOWA
Turbo pascal – instrukcje warunkowe, iteracyjne,…
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 6: Tablice, rekordy, zbiory.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 5: Typy porządkowe, wyliczeniowe i okrojone. Definiowanie.
Rekurencja Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Rekurencja Copyright, 2001 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Kurs Pascala – spis treści
Ogólne jednostki programowe 1
Tablice jednowymiarowe 1
Wykład 2 struktura programu elementy języka typy zmienne
PASCAL Dr Anna Kwiatkowska.
Wprowadzenie do programowania w języku Turbo Pascal
Pliki. Pliki Pliki jako pamięć nieulotna Pliki jako pamięć nieulotna Nazwy, atrybuty i prawa dostępu Nazwy, atrybuty i prawa dostępu atrybuty atrybuty.
Typy wyrażenia, schematy blokowe, writeln, readln, if, pętle
Typy wskaźnikowe, dynamiczne struktury danych
Podprogramy.
Typy złożone, case, stałe. Typ zbiorowy type typ_zb = set of typ_podstawowy; Typem podstawowym może być tylko typ porządkowy. Typem podstawowym może być
Schemat Hornera Mgr inż. Michał Szucki.
Programowanie w języku Fortran 95
AWK Zastosowania Informatyki Wykład 1 Copyright, 2003 © Adam Czajka.
Podstawy programowania
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Programowanie strukturalne i obiektowe
Pliki tekstowe. Operacje na plikach. mgr inż. Agata Pacek.
Andrzej Jędryczkowski Nie da się napisać większego programu bez podziału go na części zwane podprogramami. Podprogram to wyróżniona część programu.
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Algorytmy z przykładami w Turbo Pascal 7.0
20 września 2003r. Centrum Kształcenia Ustawicznego im. St. Staszica w Koszalinie Wstęp do algorytmiki Autor: Marek Magiera.
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
TABLICE C++.
Wyrażenia w Turbo Pascalu.
Procedury i funkcje.
Definicja pliku tekstowego Operacje wykonywane na plikach tekstowych
1. Język ObjectPascal - typ tablicowy (array)
Pliki Pojęcie i rodzaje plików Definicja typu plikowego Operacje wykonywane na plikach elementowych.
Pliki tekstowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików tekstowych. Pliki takie zawierają informację niezakodowaną
1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z.
Zbiory i rekordy mgr inż. Agata Pacek. Deklaracja typu zbiorowego (określa ilość elementów w zbiorze) type biegi=set of 0..6; Definiowanie zmiennej typu.
Podstawy informatyki 2013/2014
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Informatyka MZT1 Wykład 6 Iteracje while i repeat Tablice Rekordy
Wykład 10 typ zbiorowy rekurencja.
Ogólna struktura programu w TP
PL/SQL – dalsza wędrówka
Informatyka 2 MPDI Wykład 9 Delphi tablice, rekordy.
Informatyka MPDI2 Wykład 10 DELPHI cd. - zmienne tablicowe,
Podstawowe struktury danych. Typy danych.
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Podsumowanie wiedzy MPDI2 sem.3 INFORMATYKA. tworzenie nowego pliku i katalogu, nawigacja po katalogach, listowanie zawartości katalogu, zmiana nazw,
Wykład 11 Informatyka MPDI Podprogramy Zmienne typu zbiorowego Rekurencja Typ obiektowy Zmienne dynamiczne.
Wykład 2 Programowanie obiektowe. Programowanie obiektowe wymaga dobrego zrozumienia działania funkcji definiowanych przez użytkownika, w ten sposób będziemy.
P ASCAL Definicje, deklaracje, podstawowe instrukcje 1.
Wykład 1 Informatyka II MPZI2 sem.letni. Tablice Tablice deklarujemy array [ lista typów indeksów ] of typ bazowy (składowych) np. var t1,t2:array [1..5,
 Formuła to wyrażenie algebraiczne (wzór) określające jakie operacje ma wykonać program na danych. Może ona zawierać liczby, łańcuchy znaków, funkcje,
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Dane, zmienne, instrukcje
POJĘCIE ALGORYTMU Wstęp do informatyki Pojęcie algorytmu
Zapis prezentacji:

Informatyka MPZI Wykład 4 Podprogramy Pliki Typ zbiorowy Rekurencja

Podprogramy korzyści: Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) nazwane niezależne od pozostałych części z określonym sposobem wymiany informacji z innymi częściami (przekazywanie danych) korzyści: krótszy zapis źródłowy efektywniejsze wykorzystanie pamięci operacyjnej czytelność łatwiejsze uruchamianie i testowanie tworzenie bibliotek i korzystanie z nich

Podprogramy – celem jest upraszczanie kodu dla wielokrotnych wykonań pewnych grup instrukcji ze zmienianymi danymi wejściowymi Podział procedury funkcje różnice - sposób definiowania - funkcja przyjmuje wartość, a procedura nie - sposób inicjacji wykonania

elementy listy są dwóch typów Nagłówki Procedura procedure nazwa_proc (deklaracje_parametrów_formalnych ); Funkcja  function nazwa_fun ( deklaracje_param._formal. ): typ_wartości; lista deklaracji w nawiasie elementy listy są dwóch typów lista_nazw_parametrów_formalnych: nazwa_typu  var lista_nazw_parametrów_ formalnych : nazwa_typu różnią się mechanizmem przekazywania danych elementy listy oddzielane ;

Czyli musimy zdefiniować: sposób otrzymywania przez podprogram danych ewentualny zwrot wyników operacje wykonawcze podprogramu podprogram wyniki dane

Definicje funkcji i procedury (umieszczamy w części definicyjnej programu) dane typ wyniku function nazwa (parametry formalne): typ funkcji ; definicje, deklaracje lokalne begin .... nazwa := wyrażenie; //albo result:=wyrażenie; end ; wynik w JavaScript return procedure nazwa (parametry formalne) ; definicje, deklaracje begin .... instrukcje end ; dane i ewentualne wyniki

Wywołanie (wykonanie) podprogramu procedura – osobna instrukcja wykonania: nazwa_procedury( lista_parametrów_aktualnych ); funkcja – najczęściej w wyrażeniu (jako składniku instrukcji) – w zależności od typu zwracanej wartości, ale może być też osobną instrukcją, gdy nie zależy nam na zwracanej wartości Uwagi: parametry aktualne muszą być zgodne z parametrami formalnymi: - co do liczby - co do typu - co do kolejności parametry aktualne oddzielane są przecinkami ,

Przykład funkcji obliczającej średnią arytmetyczną definicja funkcji program p1; typ wyniku parametry formalne (ogólne) function srednia (x1, x2 : real): real ; begin result := (x1 + x2)/2 ; //albo srednia:= (x1 + x2)/2 ; end ; {koniec definicji funkcji} var a, b, c:real; begin a:=2; c:= srednia (6.7, 2*a);// użycie funkcji w przypisaniu writeln(c:5:2) ; readln; end. parametry aktualne (konkretne)

Przekazywanie danych z/do podprogramu przez wartość parametr formalny bez var jest zmienną lokalną - wartość początkowa w momencie wywołania argument aktualny - wyrażenie typu zgodnego przekazywanie danych tylko na wejściu do podprogramu przez zmienną (adres) - określonego typu (referencyjnie) parametr formalny z var !!!! faktycznie nie dane lecz adres argumentu aktualnego argument aktualny - zmienna tego samego typu przekazywanie danych na wyjściu (czyli w większości przypadków zwrot wyniku lub wyników) - ale może być także na wejściu

Przykład program x; procedure alfa(x1,x2:real; var wynik:real); begin wynik:=ln(x1-x2)/5; end; var w:real; //dodatkowa zmienna alfa(5,2,w); //wykonanie procedury (osobna instrukcja) writeln(w) ; alfa(4,2,w); readln; definicja procedury

Przykład procedury obliczającej średnią arytmetyczną parametry formalne var !! procedure srednia (liczba1, liczba2 : real ; var wynik : real) ; begin wynik := (liczba1 + liczba2)/2 ; end ; {koniec definicji procedury} var a, b, c:real; begin a:=2; b:=3; srednia (6.7, 2*a, c); {trzeci parametr aktualny musi być zmienną} writeln(c)) ; {c jest równe (6.7+2*2)/2=5.35} srednia (a, b, c) ; //wykonanie procedury writeln(c) ; {c jest równe (2+3)/2=2.5} srednia (a, c, c) ;// wykonanie procedury writeln(c) ; {c jest równe (2+2.5)/2=2.25} srednia (c, b, a) ; //wykonanie procedury writeln(a) ; {a jest równe (2.25+3)/2=2.67.. end; parametry aktualne

Obsługa plików Pojęcie i istota stosowania elementy Pojęcie i istota stosowania składowe takiego samego dowolnego typu - prostego, strukturalnego - nie pliki dostęp sekwencyjny - operacje np.: czytaj pierwszy | czytaj następny zapisz na początku | zapisz na końcu brak selektora (adresacji) rozmiar dynamiczny istnieje wewnętrzny wskaźnik elementu bieżącego, automatycznie modyfikowany po każdej operacji odczyt | zapis fizycznie - w pamięci zewnętrznej: dysk, dyskietka, CD-ROM, - znakowe urządzenia wej/wyj: (monitor), drukarka

Uwagi: Po otwarciu do odczytu wskaźnik ustawia się na początku pliku, każdy odczyt lub zapis przesuwa wskaźnik o jedną pozycję. Otwarcie nowego (nieistniejącego) pliku powoduje utworzenie pustego pliku, jeśli plik istniał jego zawartość zostaje usunięta, Można sprawdzić czy wskaźnik jest na końcu pliku Można przewinąć wskaźnik na początek – jeśli wtedy stwierdzimy, że jesteśmy na końcu pliku to plik jest pusty, Zapis nowego elementu zalecany tylko na końcu pliku (w środku można, ale wtedy zmienimy (nadpiszemy) wartość elementu). Dopisanie „w środku” pliku wykonuje się przez etapowe przepisywanie do innego pliku.

textFile - plik tekstowy czyli file of string istotne cele - gromadzenie dużej ilości informacji w sposób trwały - przenoszenie danych między programami | komputerami Opis typu plikowego file of Tb - plik elementowy ( binarny, zdefiniowany ) o składowych typu Tb textFile - plik tekstowy czyli file of string Wprowadza się tzw. zmienne plikowe służące do komunikowania programu z plikami fizycznymi deklaracja: var lista_nazw_zmiennych: Tp; - Tp jest opisem typu plikowego lub nazwą typu są zmienne całościowe - reprezentują cały plik nie ma zmiennych składowych - brak selektora są operacje dotyczące składowych pliku (procedury, funkcje), korzystamy ze zmiennych odpowiadających składowym plików

Przykłady deklaracji zmiennych plikowych: type osoba = record nazw: string[ 20 ]; imie: array[1..2] of string[ 15 ]; data_ur: data; pensja: real end; dwa_napisy = array[1..2] of string[15]; var oceny: file of real; nazwiska: file of string[20]; zaloga: file of osoba; adresy: file of dwa_napisy; wyniki: textFile; obraz: file;

!!! skojarzenie zmiennej plikowej z plikiem fizycznym Kolejność operacji plikaowych: !!! skojarzenie zmiennej plikowej z plikiem fizycznym otwarcie pliku (do zapisu lub odczytu) operacje (czytanie, zapis) zamknięcie

Reguły obsługi plików W części deklaracyjnej opis zmiennych plikowych type osoba = .....; var grupa: file of osoba; W bloku wykonawczym skojarzenie - f  ’d:\ścieżka\plik’ otwarcie pliku f do - zapisu - odczytu - dodawania (tylko tekstowe) operacje - zapis | odczyt zamknięcie pliku f usunięcie pliku f | zmiana położenia (nazwy)

..istnieje grupa standardowych procedur i funkcji, m.in. procedura: assignFile( f, Wt ) - skojarzenie f zmienna plikowa tekstowy opis położenia na dysku np.: assignFile( grupa, ' C:\ROK_II\grupa_1.bin ' ); procedura : reset( f ) - otwarcie do odczytu /zapisu (zastępowanie) - jeśli plik istnieje!!! - plik staje się aktywny - wskaźnik na początku pliku - gdy plik nie istnieje  błąd wykonania procedura : rewrite( f ) - otwarcie do zapisu - gdy plik nie istniał  jest tworzony - gdy plik istniał  jest zerowany - wskaźnik na początku-końcu pliku pustego procedura: append( f ) - otwarcie do zapisu na końcu pliku (tylko tekstowego texfile)

Odczyt z pliku f zmienna plikowa zapis do pliku procedura : read( f, zmienna) f zmienna plikowa zmienna takiego samego typu jak element pliku zapis do pliku procedura : write( f, zmienna ) Można korzystać z readln i writeln, ale tylko dla zmiennych plikowych typu Textfile

Także operacje systemu plików – np. procedura procedura : closeFile( f ) - zamknięcie pliku - dopisuje zawartość bufora do pliku, zwalnia go - powinno się odbyć przed zakończeniem programu funkcja: eof( f ) - badanie końca pliku (end of file) - wartość logiczna: true - wskaźnik po ostatniej wartości (na końcu) false - wskaźnik w środku Także operacje systemu plików – np. procedura erase(plik) – usunięcie pliku

Przykład: Zapis liczby do pliku tekstowego program test; var p1:TextFile; z:real; begin z:=7.5; assignfile(p1,'d:\dane\a.txt'); rewrite(p1); //otwarcie do zapisu writeln(p1,z:2:0); //wpisze do pliku 8 closeFile(p1); end. nazwa fizycznego pliku (wraz z ewentualną ścieżką dostępu)

Przykład: odczyt jednej liczby z pliku tekstowego program test; var p1:TextFile; z:real; begin assignFile(p1,'a.txt'); reset(p1); readln(p1,z); //czytanie z pliku do zmiennej CloseFile(p1); writeln(z:10:3); //wypisanie na konsoli readln end.

Jeśli więcej liczb w wierszach w pliku i nie wiemy ile, zwykle stosuje się konstrukcję WHILE..DO program test; var p1:TextFile; z:real; begin assignFile(p1,'a.txt'); reset(p1); while not eof(p1) do readln(p1,z); //czytanie z pliku do zmiennej writeln(z:10:3); //wypisanie na konsoli end; CloseFile(p1); readln end. pętla - dopóki nie ma końca pliku wykonuj...

Prosty zapis do pliku elementowego program pliki; type osoba = record nazw, imie: string[ 20 ]; stypendium: real end; var student:osoba; plik:file of osoba; begin assignfile(plik,'spis.bin'); //skojarzenie rewrite(plik); //utworzenie pliku readln(student.nazw); //czytamy podawane elementy readln(student.imie); readln(student.stypendium); write(plik,student); //zapis do pliku całego rekordu!!!! closeFile(plik); readln end.

Prosty odczyt z pliku elementowego program pliki2; type osoba = record nazw, imie: string[ 20 ]; stypendium: real end; var student:osoba; plik:file of osoba; begin assignfile(plik,'spis.bin'); //skojarzenie reset(plik); //otwarcie pliku read(plik,student); //odczyt z pliku całego rekordu!!!! writeln(student.nazw); //wypisujemy na ekranie writeln(student.imie); writeln(student.stypendium); closeFile(plik); readln; end.

Typ zbiorowy type nazwa_typu = set of typ_porządkowy ;   Typ zbiorowy to zbiór potęgowy danego typu porządkowego, czyli zbiór wszystkich podzbiorów tego typu. Zmienna typu zbiorowego może zatem zawierać zbiór pusty, jedno- lub wieloelementowy. Definicja typu zbiorowego: type nazwa_typu = set of typ_porządkowy ;   typ zbiorowy typ bazowy Liczba elementów nie może przekraczać 256 – czyli typ bazowy może być: typem Byte (podtyp liczb całkowitych – zakres 0 do 255), okrojonym całkowitym, np. 1..56 znakowym (w tym okrojonym np. 'a'..'z' ) wyliczeniowym logicznym Zmienna typu zbiorowego zawierać może dowolny podzbiór elementów typu bazowego, od zbioru pustego do zbioru zawierającego wszystkie elementy.

var zbior: set of liczby; Czyli: Zmienna typu integer może mieć wartość 1 lub 100 a nie może jednocześnie 1 i 100! Zmienna typu array może zawierać wiele wartości, ale zawsze ma statyczny rozmiar i nawet jak komórki są puste to rezerwują pamięć komputera Zmienna typu zbiorowego może zawierać zero, jedną lub wiele wartości z danego zbioru type liczby: 1..100; var zbior: set of liczby; Zmienne typu zbiorowego 1 5 7 19 4 8 34 67 69 88 100

Przykłady definicji typu zbiorowego: type dni = set of (pon,wto,sro,czw,pia,sob,nie) ; znaki = set of 'a'..'z' ; miesiac = (sty,lut,mar,kwi,maj,cze,lip,sie,wrz,paz,lis,gru) ; zbior_miesiecy = set of miesiac ; var nazwa_miesiaca : miesiac ;//zmienna typu wyliczeniowego zbior_nazw : zbior_miesiecy ; //zmienna typu zbiorowego UWAGA: nazwa_miesiaca może przyjąć wartość tylko jednej z nazw – typ wyliczeniowy; zbior_nazw może przyjąć wartość dowolnego podzbioru z nazw bazowych – typ zbiorowy

Zmiennych typu zbiorowego nie wolno używać w instrukcjach czytania i wyprowadzania wyników, używa się ich jedynie w operacjach wykonawczych, testujących itp. Operacje logiczne wykonywane na zbiorach to relacje (porównania): A = B równość zbiorów, te same elementy w obu zbiorach, A < > B różność zbiorów, różne elementy w obu zbiorach (chociaż niektóre mogą się powtarzać) A <= B zawieranie zbioru A w zbiorze B (true jeśli każdy element zbioru A jest w zbiorze B) A >= B zawieranie zbioru B w zbiorze A (true jeśli każdy element zbioru B jest w zbiorze A) c in A czy element c jest w zbiorze A

Stałe typu zbiorowego Wartości stałych typu zbiorowego zapisujemy w nawiasach kwadratowych w postaciach: [lista wartości podzbioru] np. [1, 5, 7], [okrojenie ze zbioru] np. [1..3], lub łącznie: np. [1..3, 5, 7],

Przykład 1: type x=(alfa, beta, gamma, delta) ; {typ wyliczeniowy} var z : set of x ; begin z := [alfa, beta] ; {lista - wybór podzbioru alfa, beta} z := [alfa..gamma] ; {okrojenie - wybór podzbioru alfa, beta, gamma} end;

Przykład 2: program zbiory; type miesiace = set of 1..12 ; var v, x, y, z: miesiace ; lit: char ; begin x :=[1..12] ; {cały rok} y := [1..6] ; {pierwsze półrocze} z := [1, 3, 5 , 7 , 8, 10, 12] ; {miesiące posiadające 31 dni} lit := 'a' ; if x<>y then writeln('tak') else writeln('nie'); {tak} if x<=y then writeln('tak') else writeln('nie'); {nie} if x>=y then writeln('tak') else writeln('nie'); {tak} if x = y then writeln('tak') else writeln('nie'); {nie} if 1 in x then writeln('tak') else writeln('nie'); {tak} if 9 in z then writeln('tak') else writeln('nie'); {nie} if lit in ['a'..'z'] then writeln('tak') else writeln('nie'); {tak} readln; end .

Czcionka w aplikacjach Windows Przykład 3: Czcionka w aplikacjach Windows var x: set of (italic, podgrubiony, podkreslony); begin x:= [ ]; x:= [italic, podkreslony]; x:= [italic, pogrubiony]; x:= [podkreslony]; //…

 iloczyn zbiorów (zbiór wspólny!!!) Operatory działań na zmiennych typu zbiorowego (znaczenie jak w teorii mnogości): + suma zbiorów – różnica zbiorów  iloczyn zbiorów (zbiór wspólny!!!) Przykład: type zbiorowy = set of 1..6 ; var x , y, v : zbiorowy ; begin x :=[2, 3, 4] + [4, 5, 6] ; {wynik [2,3,4,5,6] } y := [2, 3, 4] - [4, 5, 6] ; {wynik [2,3] } v := [2, 3, 4] * [4, 5, 6] ; {wynik [4] (zbiór wspólny) } y := v * x ; { przeanalizować wynik} {….} end.

Algorytmy rekurencyjne Wiele problemów obliczeniowych można zdefiniować rekurencyjnie. Rekurencja oznacza takie zdefiniowanie zagadnienia, gdzie w trakcie formułowania definicji odwołujemy się do niej samej. Przykładem definicji rekurencyjnej może być zapis całkowitej, nieujemnej potęgi rzędu n liczby rzeczywistej x: xn-1*x dla n > 0 (tu użycie definiowanej potęgi) xn = 1 dla n = 0

Rekurencja w językach programowania jest realizowana za pomocą podprogramów wywołujących kolejno same siebie ze zmienianymi parametrami wywołania. Aby podprogramy rekurencyjne działały poprawnie powinny zawierać warunek zakończenia rekurencji, aby wywołanie wykonywane było skończoną liczbę razy. Rekurencja daje proste programy lecz ma także wadę: każde wywołanie podprogramu wymaga wykonania przez procesor dodatkowych czynności, co spowalnia działanie programu oraz powoduje odłożenie na stos systemowy dużej liczby danych

function potega_n (x:real ; n:integer):real ; begin program rekurencja; function potega_n (x:real ; n:integer):real ; { funkcja wyznacza n-tą potęgę n dla liczby x } begin if n=0 then potega_n := 1 else potega_n := potega_n(x, n – 1)*x ; {w definicji funkcji wykorzystanie samej funkcji} end ; var x:real; begin {program główny} x:= potega_n (2,10) ; {obliczenie 210} writeln(x); readln; end.

program silnia1; function silnia_x (x: integer): longint ; {zastosowano typ longint ze względu na duże wartości funkcji silnia} begin if x = 1 then silnia_x := 1 else silnia_x := silnia_x(x-1)*x ; end ; //przykładowe użycie var alfa : integer ; alfa:=5; write( 'Silnia wynosi:',silnia_x(alfa)); readln; end.