wyklad nr 4 26 x


POLITECHNIKA WARSZAWSKA
POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
Instytut Automatyki i Robotyki
ZASADY PROGRAMOWANIA STRUKTURALNEGO
ZASADY PROGRAMOWANIA STRUKTURALNEGO
(ZAP)
(ZAP)
Język programowania: C/C++
Język programowania: C/C++
Środowisko programistyczne: Builder C++ v. 6.0
Środowisko programistyczne: Builder C++ v. 6.0
Wykład 4 : Pętla for. Tablice jednowymiarowe (wektory).
Wykład 4 : Pętla for. Tablice jednowymiarowe (wektory).
Pętle while - podsumowanie
Pętle while - podsumowanie
" Warunek w pętli while jest warunkiem, przy którym pętla ma się  kręcić w kółko .
" Warunek w pętli while jest warunkiem, przy którym pętla ma się  kręcić w kółko .
Jest on więc negacją warunku, przy którym należy wyjść z pętli.
Jest on więc negacją warunku, przy którym należy wyjść z pętli.
" Wykonując negację warunku, w którym są operatory logiczne, należy pamiętać,
" Wykonując negację warunku, w którym są operatory logiczne, należy pamiętać,
że negacja sumy logicznej zamienia się w iloczyn negacji - i na odwrót.
że negacja sumy logicznej zamienia się w iloczyn negacji - i na odwrót.
Przykład:
Przykład:
- jeśli pętla ma się wykonywać aż do napotkania małej litery, to z pętli należy
- jeśli pętla ma się wykonywać aż do napotkania małej litery, to z pętli należy
wyjść, gdy (znak>= a && znak<= z ) ,
wyjść, gdy (znak>= a && znak<= z ) ,
- to oznacza zatem, że pętla ma się wykonywać, dopóki znak nie jest małą literą,
- to oznacza zatem, że pętla ma się wykonywać, dopóki znak nie jest małą literą,
czyli:
czyli:
.......
" while (znak< a || znak > z ) .
do {
" while (znak< a || znak > z ) .
cout<< Napisz mala litere\n ;
Warunek ten można też zapisać następująco:
Warunek ten można też zapisać następująco:
cin>>znak;
" while (! (znak>= a && znak<= z )) .
" while (! (znak>= a && znak<= z )) .
}
.......
while (znak< a || znak > z )
do {
// pętla wymusza na użytkowniku
cout<< Napisz mala litere\n ;
// napisanie małej litery
cin>>znak;
........
}
while (znak< a && znak > z )
// warunek powyżej jest zawsze = false
// to typowy błąd logiczny w pętli while
Pętla for - wprowadzenie
Pętla for - wprowadzenie
Wczytać N liczb (N - stała) i obliczyć ich sumę.
Pętla do-while
Pętla while
.......
.......
s=0; i=0;
s=0; i=0;
do {
while (i cin>>a;
cin>>a;
s+ = a;
lepiej:
s+ = a;
i++;
i++;
}
}
while (i// może nie wykonać się ani razu
// pętla zawsze wykona się chociaż raz,
.......
// więc wynik nieprawidłowy, jeśli N<=0
........
Pętla for
.......
s=0;
wersja prostsza,
for ( i=0; irównoważna
cin>>a;
s+ = a;
}
// może nie wykonać się ani razu
.......
Pętla for
Pętla for
Instrukcja for   Dla
Wykorzystywana jest, gdy znana jest liczba powtórzeń.
for (inicjowanie; warunek; krok) instrukcja
" Wykonuj instrukcja dla wyrażeń umieszczonych w nawiasie za for, czyli:
" wykonaj inicjowanie;
" sprawdz warunek;
" jeśli spełniony, wykonaj instrukcję, a potem krok;
" sprawdz warunek;
" jeśli spełniony, wykonaj instrukcję, a potem krok;
" itd.
" Może nie wykonać się ani razu !
for ( i=1; i<=N; i++ ) cout << i << endl;
// drukuje pod sobą liczby od 1 do N
// po wyjściu z pętli i jest równe N+1
Pętla for c.d.
Pętla for c.d.
for (inicjowanie; warunek; krok) instrukcja
" inicjowanie i krok można traktować jak instrukcje, z tą różnicą, że one
same w sobie nie kończą się średnikiem
" zarówno inicjowanie, jak i krok mogą być nawet ciągiem instrukcji - bez
średnika, ale oddzielonych przecinkami (które pełnią rolę operatorów)
" każda z trzech składowych (inicjowanie; warunek; krok) może być pusta,
ale średniki je rozdzielające są konieczne. Pusty warunek uważany jest za
prawdziwy
" instrukcja wykonująca się w pętli też może być pusta ( nic nie rób ), jak
każda inna instrukcja.
UWAGA: warunek (w if-ach, pętlach) może być liczbą
// pętla nieskończona
lub ogólnie wyrażeniem dającym się zamienić na liczbę:
for ( ; ; ) {
" wartość równa 0 traktowana jest jako fałsz
...
" wartość różna od 0 traktowana jest jako prawda.
}
// to też
// i to również
// pętla nieskończona
// pętla nieskończona
while ( true ) {
while ( 1 ) {
...
...
}
}
Pętla for, zasięg zmiennych
Pętla for, zasięg zmiennych
Zmienne inicjowane w pętli for mogą być od razu przy tej okazji definiowane:
for ( int i=1; iUWAGA 1:
zmienna zdefiniowana w pętli for jest dostępna tylko w obszarze tej pętli:
for ( int i=1; icout << " po wyjsciu z petli i= " << i; // tak nie wolno - zmienna i nie jest tu dostępna
UWAGA 2:
zmienne zdefiniowane w jakimś bloku ujętym w klamry {...} są dostępne w całym tym
bloku poczynając od miejsca tej definicji i niedostępne poza klamrami
int main ( ) {
...
int i;
for (i=1; i cout << "po wyjsciu z petli i= " << i;
}
do { ...
char zn; // tak nie wolno...
cout << "czy konczymy?" < cin>>zn;
}
while (zn != 'T' && zn != 't' ); // ... bo zmienna zn nie jest tu dostępna
// zmienną zn trzeba więc zdefiniować przed pętlą do
Pętle zagnieżdżone
Pętle zagnieżdżone
" Jeśli kilka instrukcji ma się wykonywać w pętli, trzeba z nich zrobić jedną,
czyli umieścić w nawiasach {...}
" Instrukcja if, switch, dowolna pętla są pojedynczymi instrukcjami (!) i mogą
być umieszczone w pętli for bez ujmowania ich w nawiasy {...}
W dowolnej pętli może wykonywać się inna pętla, a w niej kolejna...itd.
Kolejność przetwarzania zagnieżdżonych pętli jest taka, że najbardziej
wewnętrzna pętla wykonywana jest w pierwszej kolejności.
Przykład 1:
Dla wszystkich możliwych par (x,y), gdzie x=0, 1...10, zaś y=1,2,4,8,...256 drukować
wartości x, y i wartość funkcji 3x+2y.
// czyli dla każdej wartości x przechodzimy przez wszystkie możliwe wartości y:
for ( x=0; x<=10; x++)
for ( y=1; y<=256; y *=2 )
cout << x << ' \t' << y << ' \t' << 3*x+2*y <// dzięki znakom tabulacji wyniki będą drukowane w równych kolumnach
Pętle zagnieżdżone c.d.
Pętle zagnieżdżone c.d.
Przykład 2:
Wydrukować wszystkie możliwe kombinacje
wartości i, j k, zawartych w przedziale od 0 do N.
for ( i=0; i<=N; i++)
for ( j=0; j<=N; j++)
for ( k=0; k<=N; k++)
cout << i << ' \t' << j << ' \t' << k <" krok pierwszy zmiany i
i=0; j=0; k=0..N;
" krok drugi zmiany i
i=0; j=1; k=0..N;
...
" ...
i=0; j=N; k=0..N;
" krok ostatni zmiany i
i=N; j=0; k=0..N;
i=1; j=0; k=0..N;
i=N; j=1; k=0..N;
i=1; j=1; k=0..N;
...
...
i=N; j=N; k=0..N;
i=1; j=N; k=0..N;
Porównanie a przypisanie - niebezpieczne pułapki
Porównanie a przypisanie - niebezpieczne pułapki
Nie wolno mylić operatorów porównania i przypisania:
= operator przypisania (wykonaj podstawienie)
== operator porównania (sprawdz warunek równości)
Przykład:
x = 10 ; // instrukcja - przypisz wartość 10 zmiennej x (podstaw 10 pod x )
x = 10 // wyrażenie - ma wartość wyrażenia po prawej stronie znaku = ,
// czyli 10 (albo true - zależnie od kontekstu)
x = = 10 // wyrażenie - ma wartość true, jeśli x jest równe 10
Zatem UWAGA: załóżmy, ze chcemy napisać instrukcję warunkową postaci:
jeśli x jest równe 10, to zrób coś tam...
if (x = =10) .... // zapis poprawny - instrukcja za nawiasem wykona się tylko
// wtedy, gdy x bedzie równe 10
if (x = 10) ... // tu jest błąd - instrukcja za nawiasem wykona się zawsze,
// bo wyrażenie w nawiasie ma wartość true,
// taki bląd NIE BDZIE jednak SYGNALIZOWANY !
Pułapki pętli for
Pułapki pętli for
Załóżmy, że chcieliśmy napisać coś takiego:
for (cin >> a ; a==0 ; cin >> a) // wczytaj a, i dopóki wczytane a jest równe 0,
// wypisz tekst i czytaj następne a
cout << "napisz liczbe nierówna zeru"; // ta instrukcja wykonuje się w pętli for
Zobaczmy, co się stanie, jeśli  z rozpędu napisaliśmy średnik na końcu wiersza:
for (cin >> a ; a==0 ; cin >> a) ; // wczytaj a, i dopóki wczytane a jest równe 0,
// wykonuj  nic (instrukcję pustą) i czytaj następne a
cout << "napisz liczbe nierówna zeru"; // ta instrukcja jest poza pętlą for
albo  zgubiliśmy jeden znak równości:
for (cin >> a ; a=0 ; cin >> a) // wczytuje a, i ponieważ wyrażenie a=0 jest false,
// więc nic już więcej się nie wykona
cout << "napisz liczbe nierówna zeru"; // ta instrukcja miała się wykonywać w pętli for
Przykład 1  szukanie elementu największego w ciągu n liczb
Przykład 1  szukanie elementu największego w ciągu n liczb
...
const n=10;
int a, i , max; // max - element aktualnie największy
cin >> a; // wczytanie pierwszej liczby - przed pętlą
max=a; // początkowa wartość max - wartość pierwszego elementu
for (i=1; i cin >> a;
if ( a >max) max=a;
}
cout << max << endl; // drukowanie wartości maksymalnej
// wersja bardziej ogólna - znajdziemy dodatkowo położenie elementu maksymalnego
const n=10;
int a , i , max, imax; // imax - indeks elementu aktualnie największego w ciągu
// zakładamy, że elementy numerujemy (indeksujemy) od zera
cin >> a; // wczytanie pierwszej liczby
max=a; // początkowa wartość max - wartość pierwszego elementu
imax=0; // początkowa wartość imax - indeks pierwszego elementu
for (i=1; i> a;
if ( a >max) { max=a; imax=i; } // obie instrukcje są zależne od warunku
}
cout < cout << imax << endl; // drukowanie indeksu elementu maksymalnego
// (indeksu pierwszego znalezionego elementu, jeśli jest kilka o wartości maksymalnej)
Tablice
Tablice
TABLICE pozwalają za pomocą jednej nazwy zapamiętać wiele elementów tego
samego typu.
Elementy przechowywane są jeden za drugim w pamięci komputera:
i rozróżniane za pomocą indeksów:
3
2 4
1
0
indeks
2
1 -3
7
12
zmienna indeksowana
a[0]
a[4]
a[1]
...
(element tablicy)
" Indeksowanie tablic zaczyna się zawsze od zera
" Indeks musi być wyrażeniem, które ma nieujemną wartość
całkowitą.
Tablice jednowymiarowe - wektory
Tablice jednowymiarowe - wektory
Definicja TABLICY
typ_elementów nazwa_tablicy [rozmiar_tablicy ];
lub:
typ_elementów nazwa_tablicy [rozmiar_tablicy ]= {...,...,..., ,...};
można pominąć wartości początkowe
rozmiar_tablicy - ilość elementów - liczba, albo (lepiej !) stała całkowita
albo (ogólnie) wyrażenie o wartości dodatniej dającej się policzyć na
etapie kompilacji.
Przykłady:
const n=4; const w=5;
int A[n]; // tablica o nazwie A i n elementach całkowitych
// ostatni element ma więc indeks = n-1
char b[10]; // tablica o nazwie b i 10 elementach typu char; ostatni to b[9]
string naz[2*n-1]; // tablica o nazwie naz i 2*n-1 elementach typu string
int a[5] = { 2, 7, 1, -3, 12 }; // tablica o nazwie a i 5 elementach o podanych wartościach
char Z[ ]= {'a', 'd', '?' , 'X', 'q', '!' }; // tablica Z typu char o podanych wartościach
Tablice jednowymiarowe - wektory
Tablice jednowymiarowe - wektory
ELEMENT tablicy ( zmienna indeksowana )
nazwa_tablicy [ indeks]
Indeks musi być wyrażeniem, które ma nieujemną wartość
całkowitą, mniejszą (!) od rozmiaru tablicy.
const n=4; const w=5;
char Z[n]; char p;
...
cout << Z[0]; // wydrukuj pierwszy element tablicy Z
p=Z[1]; // podstaw drugi element tablicy Z pod p
cout << Z[n] // błąd - nie ma elementu o indeksie=n !
cout << Z[n-1] // wydrukuj ostatni element tablicy Z
UWAGA: Błąd przekroczenia zakresu tablicy nie jest sygnalizowany!
Przykład 1a  szukanie elementu największego w tablicy
Przykład 1a  szukanie elementu największego w tablicy
...
const n=10;
int a [n], i , max; // max - element aktualnie największy w tablicy a[n]
for (i=0; i> a[i]; // wczytywanie danych do tablicy;
...
max=a[0]; // początkowa wartość max - wartość pierwszego elementu
for (i=1; i if ( a[i] >max) max=a[i];
cout << max << endl; // drukowanie wartości maksymalnej
// wersja bardziej ogólna - znajdziemy dodatkowo położenie elementu maksymalnego
const n=10;
int a [n], i , imax; // imax - indeks elementu aktualnie największego w tablicy a[n]
for (i=0; i> a[i]; // wczytywanie danych do tablicy;
...
imax=0; // początkowa wartość imax - indeks pierwszego elementu
for (i=1; i if ( a[i] >a[imax]) imax=i; // UWAGA: zmienna max wcale nie jest nam potrzebna
cout << a[imax] << endl; // drukowanie wartości maksymalnej
cout << imax << endl; // drukowanie indeksu elementu maksymalnego
// (indeksu pierwszego znalezionego elementu, jeśli jest kilka o wartości maksymalnej)
Przykład 2  przesunięcie cykliczne wektora w prawo
Przykład 2  przesunięcie cykliczne wektora w prawo


Wyszukiwarka

Podobne podstrony:
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Zarzadzanie strategiczne wyklad nr 2
wyklad nr 2 PK
Wykład nr 6 Decyzja
SS wyklad nr 6 ppt
Sem 4 Wykład nr 9 Interakcje 2013
AUDYT WEWNĘTRZNY Z DNIA 26 LUTY 2011 WYKŁAD NR 1
WYKŁAD NR 5 HYDRAULIKA i HYDROLOGIA (PDF)
wykład nr 6
Wyklad nr 8
WYKŁAD NR 3
Wykład nr 3
OP wyklad nr 4
ET DI2 ObwodySygnaly2 wyklad nr 9 10 czworniki aktywne
Prezentacja Wykład nr 5
Arch wykład nr 5 Ściskanie cz 1
Budownictwo Ogólne wykład nr 4
wykład nr 4 Różnice indywidualne

więcej podobnych podstron