INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl Instrukcje powtórzeń Często pisząc kod konieczne jest kilkukrotne wykonanie fragmentu kodu W większości języków programowania dostępne są instrukcję wykonywania kodu w pętli sterowanej parametrem zmieniającym się w sposób iteracyjny Istnieją także pętle warunkowe powtarzające wykonanie kodu po spełnieniu określonego warunku Pętle można realizować za pomocą instrukcji warunkowej if i funkcji skoku goto 2 Zakres wykładu Pętle ze współczynnikiem rosnącym i malejącym Pętle na zmiennej wektorowej Pętle warunkowe Operacje na ciągach tekstowych 3 1
Pętla rosnąca Podstawową instrukcją iteracyjną jest pętla o współczynniku rosnącym for początke to koniec do //kod powtarzany Współczynnik jest zmienną całkowitą przyjmującą wartości od początkowej do końcowej ze wzrostem o jeden Zmienna iteracyjna może być wykorzystana w kodzie 4 Pętle i:=1; skok: writeln(i); i:=i+1; if i<=1000 then goto skok; for i:=1 to 1000 do writeln(i); Zmienna i musi zostać zadeklarowana jako zmienna całkowita 5 Pętla malejąca W pewnych sytuacjach wymagane jest aby zmienna iteracyjna zmieniała się od wartości maksymalnej do minimalnej for początek downto koniec do //kod powtarzany Analogicznie jak w pierwotnej wersji pętli zmienna iteracyjna nie musi być wykorzystywana w kodzie pętli 6 2
Pętle - zagnieżdżanie Pętle można dowolnie zagnieżdżać Wewnątrz jednej pętli może być druga, wewnątrz niej następna Nie ma limitu zagnieżdżeń pętli Każda z zagnieżdżonych pętli musi posiadać indywidualną zmienną iteracyjną 7 Program generuje tabliczkę mnożenia Użytkownik podaje zakres liczb jakie definiują macierz tabliczki Wyniki wyświetlane są na ekranie i przechowywane w zmiennej tablicowej 8 {$mode objfpc} program tabliczka; uses crt, sysutils; var tab:array of array of single; i,j,a,b:byte; z: array[1..4] of integer; clrscr; a:=0; b:=0; 9 3
writeln('program generuje tabliczkę mnożenia liczb w zakresie.'); writeln('podaj wartoci graniczne:'); for i:=1 to 4 do write('z(',i,')='); readln(z[i]); clrscr; SetLength(tab,z[2]-z[1]+1,z[4]- z[3]+1); 10 for i:=z[3] to z[4] do a:=0; for j:=z[1] to z[2] do write(j*i,' '); tab[a,b]:=i*j; a:=a+1; b:=b+1; writeln; delay(10000); end. 11 12 4
Pętle warunkowe Nie zawsze z góry wiadomo ile razy ma zostać powtórzona pętla W sytuacjach takich wygodnie jest korzystać z pętli warunkowych W Pascalu i wielu innych językach programowania dostępne są dwie podstawowe pętle warunkowe Pętla w której warunek sprawdzany jest na początku pętli: while do Pętla w której warunek sprawdzany jest na końcu pętli: repeat until 13 Pętla warunkowa Wybór instrukcji pętli warunkowej uzależniony jest od tego czy kod pętli musi być wykonany chociaż raz czy nie repeat kod pętli; until warunek; while warunek do kod petli Z pętlą while w sytuacji dłuższego kodu konieczne jest stosowanie bloku. 14 Program przeliczający liczbę w systemie dziesiętnym na binarny W programie wykorzystano pętle warunkową sprawdzającą warunek na końcu pętli Poszczególne elementy liczby binarnej przechowuje się w zmiennej tablicowej Do zapisania liczby na ekranie wykorzystano pętle o iteracji malejącej 15 5
{$mode objfpc} program konwersja; uses crt, math, sysutils; var i,j,k:integer; n: array of integer; clrscr; writeln('program konwertuje liczbe cakowita z postaci dziesietnej na binarna'); 16 1 write('podaj liczbe cakowita wieksza od zera:'); readln(i); k:=0; repeat setlength(n,k+1); j:=i mod 2; i:=i div 2; n[k]:=j; k:=k+1; until i=0; 17 2 write('podaj liczbe calkowita wieksza od zera:'); readln(i); k:=0; while i>0 do setlength(n,k+1); j:=i mod 2; i:=i div 2; n[k]:=j; k:=k+1; 18 6
write('postac binarna liczby to:'); for i:=high(n) downto 0 do write(n[i]); writeln; delay(10000); end. 19 Przerwanie pętli Pętle iteracyjne jak i pętle warunkowe w zależności od sytuacji mogą zostać przerwane. Możliwe jest także warunkowe pominięcie wybranych iteracji Pascal dostarcza dwóch funkcji realizujących te zadania break przerywa działanie pętli continue przerywa działanie aktualnej iteracji i przechodzi do następnej 20 program przerwanie; var i : LongInt; i := 0; while i<100000 do i := i + 1; WriteLn('Pela wykonuje sie po raz ', i); if keypressed then break; end. 21 7
program przerwanie; uses sysutils, crt; var i : LongInt; i := 0; while i<100000 do i := i + 1; if i mod 136 <> 0 then continue; WriteLn('Petla wykonuje sie po raz ', i); end. 22 Pętla po elementach Pętla for może działać nie tylko w oparciu o zmienną iteracyjną w zadanym zakresie, ale także na podstawie elementów podpiętej do pętli tablicy for zmienna in tablica do kod pętli; W takiej sytuacji zmienna przyjmuje wartości kolejnych elementów tablicy 23 program tablica; uses sysutils, crt; var tab:array of integer; n,i:integer; clrscr; write('podaj rozmiar tablicy:'); readln(n); randomize; setlength(tab,n); 24 8
for i:=0 to n-1 do tab[i]:=random(n); write('wylosowano ',n,' liczb: '); for i in tab do write(i,' '); writeln; readln(); end. 25 Pętle warunkowe z IN Analogicznie jak przy pętli for i instrukcji warunkowej if, w petlach warunkowych while do oraz repeat until także można korzystać ze zbiorów i wskaźnika in while zmienna in zbiór do kod; repeat kod; until zmienna in zbiór; 26 Z wykorzystaniem informacji o pętlach napisać program symulujący grę w lotto Program sprawdza po ilu losowaniach gracz trafi główną wygraną Jako podsumowanie przedstawia ile wygrał i jakie poniósł koszty Jako szczegółowe wyniki podaje ile w międzyczasie miał trafień 3, 4 i 5 27 9
{$mdule objfpc} program lotto; uses crt, sysutils; type TLos = set of 1..49; var zaklad,losowanie,wygrana: TLos; i,j: integer; w,k,x: int64; trafienia: array[3..5] of integer; 28 clrscr; writeln('program symuluje gre w lotto do czasu wygrania nagrody glownej'); writeln('program podaje ile bylo wygranych 3, 4 i 5 stopnia.'); writeln('program podaje po ilu losowaniach wygrano 6,'); writeln('jakie poniesiono koszty i koncowy bilans.'); writeln('za 3-10zl, 4-300zl, 5-7 000zl, 6-1 000 000zl.'); writeln; 29 randomize; i:=1; write('twoje liczby to:'); repeat j:=random(49)+1; if j in zaklad then continue else include(zaklad,j); write(j,' '); i:=i+1; until i>6; 30 10
writeln; writeln; k:=0; trafienia[3]:=0; trafienia[4]:=0; trafienia[5]:=0; 31 //Losowanie repeat losowanie:=[]; i:=1; repeat j:=random(49)+1; if j in losowanie then continue else include(losowanie,j); i:=i+1; end until i>6; 32 //Sprawdzenie wygrana:=losowanie*zaklad; w:=0; for i:=1 to 49 do if i in wygrana then w:=w+1; case w of 3:trafienia[3]:=trafienia[3]+1; 4:trafienia[4]:=trafienia[4]+1; 5:trafienia[5]:=trafienia[5]+1; k:=k+1; until w=6; 33 11
writeln; writeln('wygrana 6 stopnia uzyskano po:',k,' losowaniach.'); write('losowanie z 6 to: '); for i:=1 to 49 do if i in losowanie then write(i,' '); writeln; writeln('podsumowanie:'); writeln('kwota wydana na losy:',k*2.5:10:2,' zl.'); writeln('wygranych 3 stopnia bylo ',trafienia[3],', uzyskano:',trafienia[3]*10,' zl'); writeln('wygranych 4 stopnia bylo ',trafienia[4],', uzyskano:',trafienia[4]*300,' zl'); writeln('wygranych 5 stopnia bylo ',trafienia[5],', uzyskano:',trafienia[5]*7000,' zl'); x:=1000000 + 10*trafienia[3] + 300*trafienia[4] + 7000*trafienia[5]; writeln('razem wygrano:',x,' zl'); writeln('bilans koncowy:',(x-k*2.5):10:2,' zl'); readln(); end. 34 35 36 12
Tekst Zarządzanie i przetwarzanie tekstu z poziomu kodu programu za pomocą wyspecjalizowanych funkcji jest jedna z podstawowych cech większości języków programowania Tekst przechowywany i przetwarzany jest za pomocą zmiennych typu String, do 255 znaków, natomiast AnsiString ma limit ograniczony rozmiarem pamięci Pojedynczy znak może być przechowywany w zmiennej typu char 37 Zmienna tekstowa Tekst przechowywany w zmiennej typu String ma postać tablicy, której indeks 0 przechowuje informacje o liczbie znaków, natomiast poszczególne znaki tekstu w pozostałych komórkach jako elementy typu char. napis: String = Ala ma kota ; Nr bajtu 0 1 2 3 4 5 6 7 8 9 10 11 napis 11 A l a m a k o t a 38 Zestaw znaków ASCII W trybie konsolowym aplikacji pisanych w pascalu dostępnych jest 255 znaków, zależnych od wybranej czcionki 39 13
Kopiowanie Funkcja kopiowania tekstu umożliwia pobranie wybranych znaków z tekstu źródłowego i użycie go do utworzenia nowej zmiennej lub innych operacji copy(zmienna, index_start, index_end) s:='adres webpage: http://lanczont.pollub.pl'; f:=copy(s,1,6)+ 'e-mail: m.lanczont@pollub.pl'; writeln(f); writeln(s); 40 Kopiowanie Pascal zawiera funkcje umożliwiające kopiowanie określonej liczby znaków z lewej lub prawej strony tekstu Leftstr(zmienna, liczba_znaków); Rightstr(zmienna, liczba_znaków); Obydwie funkcje, jak i wiele innych umożliwiających przetwarzanie tekstu zgrupowane są w bibliotece StrUtils 41 Długość tekstu Długość analizowanego tekstu jest często istotna informacją Długość czyli liczbę znaków analizowanej zmiennej zwraca funkcja n:=length(zmienna); Inną metodą jest skorzystanie z właściwości zmiennej tekstowej i wykorzystanie informacji zapisanej w komórce o indeksie 0 zmiennej tekstowej n:=byte(zmienna[0]); 42 14
Pozycjonowanie Pozycjonowanie, czyli określanie pozycji wybranego znaku lub ciągu znaków w tekście Funkcja pos( znaki, zmienna) zwraca informacje o współrzędnej pierwszego wystąpienia znaku (ciągu znaków) od początku tekstu Funkcja posex( znaki,zmienna,start) spełnia analogiczne funkcje jak pos, jednakże można zdefiniować od którego znaku zaczyna poszukiwanie 43 Program możliwa poszukiwanie we wprowadzonym tekście wybranego znaku (ciągu znaków) Użytkownik wprowadza tekst, a następnie znak/ki jakie chce poszukiwać Jako wynik działania program zwraca informacje o pozycji poszukiwanego znaku oraz podaje ile razy w danym tekście wystapił 44 {$mode objfpc} program lokalizator; uses crt, strutils; var s,x:string; i,j:integer; clrscr; write('podaj tekst do analizy:'); readln(s); write('podaj poszukiwany znak/ki:'); readln(x); 45 15
writeln(); if pos(x,s)>0 then write('poszukiwany znak "',x,' wystapil na pozycjach:'); i:=pos(x,s); write(i,' '); j:=1; 46 while posex(x,s,i+1)>0 do i:=posex(x,s,i+1); j:=j+1; write(i,' '); writeln('poszukiwany znak wystapil ',j,' razy'); end else writeln('poszukiwany znak nie wystepuje w tekscie'); Readln; end. 47 48 16
Kasowanie Funkcja kasowania umożliwia usunięcie z wskazanej zmiennej tekstowej określonej liczby znaków począwszy od wskazanego znaku s:='ala ma kota, a Ela ma psa.'; 1 15 writeln(s); delete(s,1,15); writeln(s); 49 Wstawienie Procedura wstawienie umożliwia dodanie we wskazane miejsce w zmiennej tekstowej wybranego znaku lub ciągu znaków s:='ala ma kota, a Ela ma psa.'; writeln(s); delete(s,16,4); writeln(s); insert('wanda ',s,16); writeln(s); 50 Małe i duże litery Zmiana liter na duże lub małe w ciągu tekstowym (zmiennej typu string) realizowana jest przez dwie funkcje konwertujące Funkcje są dostępne w bibliotece SysUtils S:= Ala ma kota, a Ela ma psa. ; A:=UpperCase(s); B:=LowerCase(s); 51 17
Kolejność odwrotna Zmiana kolejności znaków w zmiennej tekstowej na odwrotną realizowana jest przez funkcję z biblioteki StrUtils S:= Ala ma kota, a Ela ma psa. A:=ReverseString(s) 52 Program pobiera od użytkownika tekst dowolnej długości Program analizuje liczbę wystąpień poszczególnych znaków w analizowanym tekście Program wyświetla poszczególne znaki występujące w tekście podając liczbę ich występowania 53 {$mode objfpc} program maleduze; uses crt, strutils, sysutils; var a:ansistring; i,j,k:integer; ile:array of integer; lit:array of char; w:boolean; 54 18
clrscr; write('wprowadz tekst do analizy znakowej: '); readln(a); writeln(); writeln('w analizowanym tekscie jest ',length(a),' znakow.'); k:=1; for i:=0 to 255 do j:=1; w:=false; 55 while posex(char(i),a,j)>0 do if w=false then SetLength(ile,k); SetLength(lit,k); lit[k-1]:=char(i); ile[k-1]:=0; w:=true; k:=k+1; 56 j:=posex(char(i),a,j); ile[k-2]:=ile[k-2]+1; j:=j+1; if j>=length(a) then break; writeln('wykryto nastepujace znaki:'); 57 19
writeln(' '); writeln(' znak licz. '); for i:=0 to k-2 do writeln(' ',lit[i],' ',ile[i]:3,' '); writeln('------------'); readln(); end. 58 59 Zadanie Napisać program analizujący wprowadzony tekst. Program przedstawia w podsumowaniu statystykę zawierającą informacje: Liczbie znaków w tekście Liczbie samogłosek Liczbie spółgłosek Liczbie innych znaków Liczbie wyrazów Szczegółowa statystyka wyrazów: (liczba znaków w wyrazie liczba wyrazów tej długości w tekście) 60 20