Podstawy
Podstawy
programowania
programowania
Tablice — koncepcja, deklaracje,
podstawowe zastosowania
Część czwarta
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. Roman Simiński
roman.siminski@us.edu.pl
www.programowanie.siminskionline.pl
Autor
Przetwarzanie ciągu liczb
Przetwarzanie ciągu liczb
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 2
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Napisać program obliczający sumaryczny, roczny dochód. Program wczytuje
dochody z kolejnych 12-stu miesięcy, następnie wyprowadza dochód sumaryczny
oraz dochody z kolejnych miesięcy uporządkowane rosnąco.
Przetwarzanie ciągu liczb
Przetwarzanie ciągu liczb
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 3
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Właściwie problem nie wydaje się trudny — taki program już był omawiany.
Wystarczy iteracja while, trzy zmienne..., ale jak uporządkować ciąg liczb, kiedy są
one przetwarzane na bieżąco?
Analiza
. . . suma = 0; nr_miesiaca = 1; while( nr_miesiaca <= 12 ) { cout << nr_miesiaca << ": "; cin >> dochod; suma += dochod; ++nr_miesiaca; } . . .W danym przebiegu iteracji pamiętany jest
tylko dochód z bieżącego miesiąca.
Przetwarzanie ciągu liczb ― musimy pamiętać wszystkie jego elementy
Przetwarzanie ciągu liczb ― musimy pamiętać wszystkie jego elementy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 4
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Rozwiązanie „siłowe”― niby działa ale...
double dochod1; double dochod2; . . .
double dochod11; double dochod12;
cout << ”1: ”; cin >> dochod1; cout << ”2: ”; cin >> dochod2; . . .
cout << ”12: ”; cin >> dochod12;
suma = dochod1 + dochod2 + ... + dochod11 + dochod12; . . .
Dochód z każdego miesiąca przechowywany jest w osobnej zmiennej, w nazwach
takich zmiennych występuje numer miesiąca. Obliczenie sumy polega na
Przetwarzanie ciągu liczb ― musimy pamiętać wszystkie jego elementy
Przetwarzanie ciągu liczb ― musimy pamiętać wszystkie jego elementy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 5
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i e
Świat użytkownika
Świat programisty
1 2 3 4 5 6 7 8 9 10 11 12 Dochód ze stycznia Dochód ze stycznia Dochód z lutego Dochód z lutego Dochód z grudnia Dochód z grudniaZsumuj, posortuj, wyświetl
Przetwarzanie ciągu liczb ― niech numeracja startuje od 0-ra
Przetwarzanie ciągu liczb ― niech numeracja startuje od 0-ra
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 6
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i e
Świat użytkownika
Świat programisty
1 2 3 4 5 6 7 8 9 10 110 Dochód ze styczniaDochód ze stycznia
Dochód z lutego
Dochód z lutego
Dochód z grudnia
Dochód z grudnia
Zsumuj, posortuj, wyświetl
Zsumuj, posortuj, wyświetl
Numeracja elementów od wartości 0 Numeracja elementów od wartości 0
Tablice — zmienne do przechowywania kolekcji danych tego samego typu
Tablice — zmienne do przechowywania kolekcji danych tego samego typu
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 7
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Jak zmagazynować wiele liczb i jednocześnie wygodnie nimi manipulować?
Zmienna składająca się z 12-tu elementów
(„szufladek”). Każda z szufladek jest liczbą
rzeczywistą.
Zmienna składająca się z 12-tu elementów
(„szufladek”). Każda z szufladek jest liczbą
rzeczywistą.
dochody
dochody
1200 1000 1300 500 1500 2000 1200 1800 1000 1400 1500 2300
0 1 2 3 4 5 6 7 8 9 10 11
Każda z szufladek posiada swój unikatowy
numer — od
0
do
11
.
Każda z szufladek posiada swój unikatowy
Tablice — zmienne do przechowywania kolekcji danych tego samego typu
Tablice — zmienne do przechowywania kolekcji danych tego samego typu
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 8
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Jak zmagazynować wiele liczb i jednocześnie wygodnie nimi manipulować?
double dochody[ 12 ];
Taka złożona zmienna, będąca kolekcją ponumerowanych elementów takiego
samego typu nazywana jest zmienną tablicą lub w skrócie tablicą.
Deklaracja zmiennej będącej tablicą może mieć postać:
const int LB_MIESIECY = 12; double dochody[ LB_MIESIECY ];
lub z wykorzystaniem liczby elementów określonej parametrycznie:
dochody
dochody
1200 1000 1300 500 1500 2000 1200 1800 1000 1400 1500 2300
Tablice — zmienne do przechowywania kolekcji danych tego samego typu
Tablice — zmienne do przechowywania kolekcji danych tego samego typu
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 9
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Deklaracja zmiennej tablicowej — jak to czytać?
double dochody [
LB_MIESIECY
];
Nazwa zmiennej tablicowej
Nazwa zmiennej tablicowej
Typ elementów tablicy
Typ elementów tablicy const int LB_MIESIECY = 12;
Liczba elementów tablicy
Liczba elementów tablicy
Numery elementów tablicy nazywane są indeksami. Pierwszy element tablicy w
językach C/C++ ma zawsze indeks
0
, drugi
1
, itd. … .
Tablice a element tablicy
Tablice a element tablicy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 10
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
dochody [ 1 ]
Tablica
Tablica
Element
Element
1 2 3 4 5 6 7 8 9 10 11 0
Tablice a różne standardy C i C++
Tablice a różne standardy C i C++
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 11
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Według standardu C89 i C++
03
:
tablica zawsze składa się z ustalonej, i znanej na etapie kompilacji liczby
elementów,
liczba elementów tablicy nie ulega zmianie w trakcie działania programu ―
tablice są statyczne.
W standardzie C99 istnieją tablice VLA (ang. variable length array):
liczba elementów tablicy może być zdefiniowany w trakcie wykonania
programu — może być określona wartością zmiennej, ta wartość nie musi być
znana na etapie kompilacji,
liczba elementów tablicy nie ulega zmianie w trakcie działania programu ― raz
stworzona tablica zachowuje swój rozmiar.
Parametryzacja rozmiaru tablicy — C a C++
Parametryzacja rozmiaru tablicy — C a C++
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 12
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
#define LB_MIES 12
double dochody[ LB_MIES ]; #define MAKS_DL 80
char bufor[ MAKS_DL ];
const int LB_MIES = 12; double dochody[ LB_MIES ]; const int MAKS_DL = 80; char bufor[ MAKS_DL ];
C , ANSI89
C , ANSI89
C++
C++
Parametryzacja liczby elementów tablicy pozwala na łatwiejszą modyfikację
liczby przetwarzanych elementów. Jest mocno zalecana! Dlaczego? Okaże się już
za parę slajdów... .
Kwalifikator typu const może wystąpić z każdą specyfikacją typu. Zmienna
z const powinna być zainicjowana a potem nie może zmieniać wartości.
Zmienna z kwalifikatorem const w języku C nie jest traktowana jako wartość
stała i nie może być wykorzystywana do określania rozmiaru tablicy.
Zmienna z kwalifikatorem const w języku C++ może być wykorzystywana do
określania rozmiaru tablicy.
Odwoływanie się do elementów tablicy
Odwoływanie się do elementów tablicy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 13
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Przypisanie wartości do elementu tablicy
dochody[ 0 ] = 0; dochody[ 2 ] = 1000; dochody[ 10 ] = 2000;
dochody[ 0 ] = 0; dochody[ 2 ] = 1000; dochody[ 10 ] = 2000;
Nazwa zmiennej tablicowej Krócej: nazwa tablicy
Nazwa zmiennej tablicowej Krócej: nazwa tablicy Numer elementu tablicy
Krócej: indeks
Numer elementu tablicy Krócej: indeks
dochody [ 1 ] = 0
Tablica
Tablica
Element
Element
Warto ć wstawiana do
ś
elementu tablicy
Warto ć wstawiana do
ś
Pojedynczy element tablicy
Pojedynczy element tablicy
dochody
dochody
jest jak zwykła zmienna rzeczywista
jest jak zwykła zmienna rzeczywista
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 14
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Można przypisywać jej wartości
dochody[ 3 ] = 0;
dochody[ 3 ] = 0;
Można wstawić do niej wartość wczytaną z klawiatury
cout << ”Podaj dochód styczniowy: ”;
cin >> dochody[ 0 ];
cout << ”Podaj dochód styczniowy: ”;
cin >> dochody[ 0 ];
Można ją wykorzystywać w wyrażeniach
dochodBrutto = dochody[ 0 ] * 1.22;
dochodBrutto = dochody[ 0 ] * 1.22;
Można wyprowadzić jej wartość do strumienia wyjściowego
cout << 'Dochód styczniowy wynosi: ” << dochody[ 0 ];
cout << 'Dochód styczniowy wynosi: ” << dochody[ 0 ];
Dzięki tablicom przetwarzanie ciągów liczbowych jest elastyczniejsze
Dzięki tablicom przetwarzanie ciągów liczbowych jest elastyczniejsze
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 15
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Załóżmy że zadeklarowaną zmienną — jest to tzw. zmienna indeksowa
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
Zerowanie wartości wszystkich dochodów — zero do każdego elementu tablicy
int nr_miesiaca;int nr_miesiaca;
Rozwija się w trakcie wykonania programu w:
dochody[ 0 ] := 0; dochody[ 1 ] := 0; dochody[ 2 ] := 0; dochody[ 3 ] := 0; . . . dochody[ 11 ] := 0; dochody[ 0 ] := 0; dochody[ 1 ] := 0; dochody[ 2 ] := 0; dochody[ 3 ] := 0; . . . dochody[ 11 ] := 0;
Dzięki tablicom przetwarzanie ciągów liczbowych jest elastyczniejsze
Dzięki tablicom przetwarzanie ciągów liczbowych jest elastyczniejsze
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 16
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
Zatem jedna iteracja zeruje wszystkie elementy tablicy
Dochody
Dochody
Zmienna
nr_miesiacamaszeruje po kolejnych numerach
elementów tablicy:
0, 1, 2, 3, 4, ..., 11
.
dochody[ nr_miesiaca ] = 0
zeruje kolejne elementy tablicy.
Zmienna
nr_miesiacamaszeruje po kolejnych numerach
elementów tablicy:
0, 1, 2, 3, 4, ..., 11
.
dochody[ nr_miesiaca ] = 0
zeruje kolejne elementy tablicy.
0 0 0 0 0 0 0 0 0 0 0 0
Dzięki tablicom przetwarzanie ciągów liczbowych jest elastyczniejsze
Dzięki tablicom przetwarzanie ciągów liczbowych jest elastyczniejsze
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 17
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
Zatem jedna iteracja zeruje wszystkie elementy tablicy
Dochody
Dochody
Zmienna
nr_miesiacamaszeruje po kolejnych numerach
elementów tablicy:
0, 1, 2, 3, 4, ..., 11
.
dochody[ nr_miesiaca ] = 0
zeruje kolejne elementy tablicy.
Zmienna
nr_miesiacamaszeruje po kolejnych numerach
elementów tablicy:
0, 1, 2, 3, 4, ..., 11
.
dochody[ nr_miesiaca ] = 0
zeruje kolejne elementy tablicy.
0 0 0 0 0 0 0 0 0 0 0 0
Wypełnienie tablicy danymi wczytanymi ze strumienia wejściowego
Wypełnienie tablicy danymi wczytanymi ze strumienia wejściowego
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 18
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; } cout << 1 << ": "; cin >> dochody[ 0 ]; cout << 2 << ": "; cin >> dochody[ 1 ]; cout << 3 << ": "; cin >> dochody[ 3 ]; . . . cout << 12 << ": "; cin >> dochody[ 11 ]; cout << 1 << ": "; cin >> dochody[ 0 ]; cout << 2 << ": "; cin >> dochody[ 1 ]; cout << 3 << ": "; cin >> dochody[ 3 ]; . . . cout << 12 << ": "; cin >> dochody[ 11 ];
Wyprowadzenie zawartości tablicy do strumienia wyjściowego
Wyprowadzenie zawartości tablicy do strumienia wyjściowego
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 19
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca )
cout << endl << nr_miesiaca + 1 << ”: ” << dochody[ nr_miesiaca ];
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca )
cout << endl << nr_miesiaca + 1 << ”: ” << dochody[ nr_miesiaca ];
cout << endl << 1 << ”: ” << dochody[ 0 ]; cout << endl << 2 << ”: ” << dochody[ 1 ]; cout << endl << 3 << ”: ” << dochody[ 2 ]; .
. .
cout << endl << 12 << ”: ” << dochody[ 11 ];
cout << endl << 1 << ”: ” << dochody[ 0 ]; cout << endl << 2 << ”: ” << dochody[ 1 ]; cout << endl << 3 << ”: ” << dochody[ 2 ]; .
. .
cout << endl << 12 << ”: ” << dochody[ 11 ];
Sumowanie elementów tablicy
Sumowanie elementów tablicy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 20
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
for( suma = 0, nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) suma += dochody[ nr_miesiaca ];
for( suma = 0, nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) suma += dochody[ nr_miesiaca ];
suma += dochody[ 0 ]; suma += dochody[ 1 ]; suma += dochody[ 2 ]; . . . suma += dochody[ 11 ]; suma += dochody[ 0 ]; suma += dochody[ 1 ]; suma += dochody[ 2 ]; . . . suma += dochody[ 11 ];
Ogólny schemat iteracyjnego przetwarzania tablic
Ogólny schemat iteracyjnego przetwarzania tablic
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 21
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
for( i = 0; i < LB_ELEM_TABLICY; ++i )
Jaka operacja na elemencie i-tym tablicy t:
ś
t[ i ]
for(
i = 0
;
i < LB_ELEM_TABLICY
;
++i
)
Jaka operacja na elemencie i-tym tablicy t:
ś
t[ i ]
Do iteracyjnego przetwarzania tablic potrzebna jest zmienna indeksowa. Jest
to zmienna całkowita, nazwa jest dowolna, najczęściej stosuje się jednak
zmienne o nazwach i, j, k, l, m, n, … .
Najlepiej gdy rozmiar tablicy jest określony nazwaną stałą — wtedy łatwiej jest
modyfikować rozmiar tablicy bez potencjalnie wielu zmian w programie.
Zmienna indeksowa w C++ może być deklarowana w obrębie iteracji for,
uwaga wg aktualnego standardu nie jest wtedy dostępna poza iteracją:
for( int i = 0; i < LB_ELEM_TABLICY; ++i )
Jaka operacja na elemencie i-tym tablicy t: t[ i ]
ś
i = 0; // zmienna i nie jest dost pna w tym zasi gu!
ę
ę
for(
int i = 0
; i < LB_ELEM_TABLICY; ++i )
Jaka operacja na elemencie i-tym tablicy t: t[ i ]
ś
Pierwsza przymiarka do programu — jeszcze bez porządkowania tablicy
Pierwsza przymiarka do programu — jeszcze bez porządkowania tablicy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 22
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i e #include <iostream> using namespace std; int main() {
const int LB_MIESIECY = 12; double dochody[ LB_MIESIECY ]; double suma = 0;
int nr_miesiaca;
// Krotka informacja o programie
cout << "\nObliczam sumaryczny dochod z 12 miesiecy"; cout << "\nWprowadz dochody z kolejnych miesiecy\n"; // Zerowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
#include <iostream> using namespace std; int main()
{
const int LB_MIESIECY = 12; double dochody[ LB_MIESIECY ]; double suma = 0;
int nr_miesiaca;
// Krotka informacja o programie
cout << "\nObliczam sumaryczny dochod z 12 miesiecy"; cout << "\nWprowadz dochody z kolejnych miesiecy\n"; // Zerowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
1/2
Pierwsza przymiarka do programu — jeszcze bez porządkowania tablicy
Pierwsza przymiarka do programu — jeszcze bez porządkowania tablicy
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 23
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
// Sumowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) suma += dochody[ nr_miesiaca ];
cout << "\nSuma przychodow: " << suma;
// Uwaga – tutaj brakuje porzadkowania tablicy!
// Wyprowadzenie elementow tablicy do strumienia wyjsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) cout << endl << dochody[ nr_miesiaca ];
cout << endl << "Nacisnij Enter by zakonczyc..." << endl; cin.ignore(); cin.get(); return EXIT_SUCCESS; }
// Sumowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) suma += dochody[ nr_miesiaca ];
cout << "\nSuma przychodow: " << suma;
// Uwaga – tutaj brakuje porzadkowania tablicy!
// Wyprowadzenie elementow tablicy do strumienia wyjsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) cout << endl << dochody[ nr_miesiaca ];
cout << endl << "Nacisnij Enter by zakonczyc..." << endl; cin.ignore(); cin.get(); return EXIT_SUCCESS; } 2/22/2
Uwaga — pierwsza optymalizacja
Uwaga — pierwsza optymalizacja
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 24
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
// Zerowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
// Zerowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
W tym przypadku zerowanie tablicy można pominąć. Za chwilę w całości zostanie wypełniona danymi wczytanymi ze strumienia wejściowego programu.
W tym przypadku zerowanie tablicy można pominąć. Za chwilę w całości zostanie wypełniona danymi wczytanymi ze strumienia wejściowego programu.
Uwaga — eliminacja zbędnej iteracji
Uwaga — eliminacja zbędnej iteracji
Podstawy programowaniaPodstawy programowania
Copyright © Roman Simiński Strona : 25
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
// Sumowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) suma += dochody[ nr_miesiaca ];
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; }
// Sumowanie elementow tablicy
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) suma += dochody[ nr_miesiaca ];
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; suma += dochody[ nr_miesiaca ]; }
// Wczytanie danych ze strumienia wejsciowego
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) {
cout << nr_miesiaca + 1 << ": "; cin >> dochody[ nr_miesiaca ]; suma += dochody[ nr_miesiaca ]; }
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 26
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Jak uporządkować tablicę dochodów?
Jak uporządkować tablicę dochodów?
Jak to ułożyć te liczby
w kolejności
rosnącej?
dochody
dochody
500 1000 1000 1200 1200 1300 1400 1500 1500 1800 2000 2300 0 1 2 3 4 5 6 7 8 9 10 11dochody
dochody
1200 1000 1300 500 1500 2000 1200 1800 1000 1400 1500 2300 0 1 2 3 4 5 6 7 8 9 10 11Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 27
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Jak uporządkować tablicę dochodów — sortowanie
Jak uporządkować tablicę dochodów — sortowanie
Zagadnienie porządkowania elementów tablicy wg pewnego kryterium nazywa
się sortowaniem.
Istnieje wiele metod sortowania zawartości tablic — przyjmują postać
algorytmów sortowania dobrze opisanych w literaturze związanej
z programowaniem i algorytmiką.
Biblia algorytmów sortowania to książka N. Wirtha:
Algorytmy + struktury danych = programy
Istnieją proste i intuicyjnie zrozumiałe algorytmy
sortowania — te nie są zwykle efektywne.
Efektywne algorytmy sortowania stosują sprytne
choć nie od razu zrozumiałe rozwiązania.
Do sortowania niewielkich tablic wystarczą proste
algorytmy sortowania — nie strzelamy a armaty
do wróbelka :)
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 28
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowaneWśród nieuporządkowanych elementów będziemy wyszukiwać najmniejszy i
odkładać go do puli uporządkowanych.
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 29
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
Wybieramy element minimalny
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowanePodstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 30
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
Przenosimy do zbioru elementów uporządkowanych
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowanePodstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 31
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
Z pozostałych, nieuporządkowanych elementów wybieramy minimalny
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowanePodstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 32
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowanePrzenosimy do zbioru elementów uporządkowanych
4
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 33
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 34
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
Przenosimy do zbioru elementów uporządkowanych
5
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 35
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 36
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
Przenosimy do zbioru elementów uporządkowanych
6
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 37
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
6
6
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 38
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
6
6
8
8
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 39
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
6
6
8
8
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 40
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
6
6
8
8
9
9
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 41
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
6
6
8
8
9
9
Dwa zbiory, dwie
„półki” na elementy...
Podstawy programowania
Podstawy programowania
Copyright © Roman Simiński Strona : 42
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Sortowanie przez wybieranie — koncepcja
Sortowanie przez wybieranie — koncepcja
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane1
1
Elementy uporządkowane4
4
5
5
6
6
8
8
9
9
A może użyć tylko
jednej „półki”?
Copyright © Roman Simiński Strona : 43 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 44 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
Wybieramy element minimalny...
1
1
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 45 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
... i przenosimy na początek części nieuporządkowanej...
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane1
1
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 46 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
… ale co zrobić z elementem, który jest na początku?
4
4
8
8
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane1
1
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 47 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
A może po prostu zamienić ze sobą elementy... ?
4
4
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane1
1
8
8
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 48 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
A może po prostu zamienić ze sobą elementy... ?
4
4
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane8
8
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 49 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
Teraz najmniejszy element jest na swoim miejscu. On jest już „uporządkowany”.
4
4
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane8
8
T a b l i c e i i c h w y k o r z y s t a n i e T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 50 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
4
4
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane8
8
Z pozostałych, nieuporządkowanych elementów wybieramy minimalny.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 51 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
4
4
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane8
8
Przenosimy na początek części nieuporządkowanej.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 52 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane4
4
Teraz znaleziony element jest na swoim miejscu. Rozrasta się część uporządkowana.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 53 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane4
4
Z pozostałych, nieuporządkowanych elementów wybieramy minimalny. W tym
przypadku jest on akurat na swoim miejscu.
T a b l i c e i i c h w y k o r z y s t a n i e
Copyright © Roman Simiński Strona : 54 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane4
4
Teraz znaleziony element jest na swoim miejscu. Rozrasta się część uporządkowana.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 55 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane4
4
Z pozostałych, nieuporządkowanych elementów wybieramy minimalny.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 56 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
9
9
6
6
Elementy nieuporządkowane Elementy uporządkowane4
4
Przenosimy na początek części nieuporządkowanej.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 57 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
6
6
9
9
Elementy nieuporządkowane Elementy uporządkowane4
4
Teraz znaleziony element jest na swoim miejscu. Rozrasta się część uporządkowana.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 58 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
6
6
9
9
Elementy nieuporządkowane Elementy uporządkowane4
4
Z pozostałych, nieuporządkowanych elementów wybieramy minimalny.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 59 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
8
8
1
1
5
5
6
6
9
9
Elementy nieuporządkowane Elementy uporządkowane4
4
Przenosimy na początek części nieuporządkowanej.
T a b l i c e i i c h w y k o r z y s t a n i eCopyright © Roman Simiński Strona : 60 Podstawy programowania
Podstawy programowania
Sortowanie przez wybieranie — tylko jedna „półka”
Sortowanie przez wybieranie — tylko jedna „półka”
9
9
1
1
5
5
6
6
8
8
Elementy nieuporządkowane Elementy uporządkowane4
4
Wszystkie elementy — za wyjątkiem ostatniego — są uporządkowane... to znaczy, że
i ostatni jest na swoim miejscu.
T a b l i c e i i c h w y k o r z y s t a n i e
Copyright © Roman Simiński Strona : 61 Podstawy programowania
Podstawy programowania
Zanim posortujemy — wyszukiwanie minimum, przypomnienie
Zanim posortujemy — wyszukiwanie minimum, przypomnienie
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
double minimalny; // Minimalny
int nr_minimalnego; // Indeks minimalnego elementu
Ustal początkową wartość elementu minimalnego:
minimalny = dochody[ 0 ]Ustal początkowy numer elementu minimalnego:
nr_minimalnego = 0// Sprawd kolejne elementy, wymie minimum gdy trzeba ź ń
Dla każdego elementu tablicy począwszy od drugiego
if( aktualny odwiedzony < minimalny ) {
minimalny = aktualny odwiedzony;
nr_minimalnego = numer aktualnie odwiedzonego; }
double minimalny; // Minimalny
int nr_minimalnego; // Indeks minimalnego elementu
Ustal początkową wartość elementu minimalnego:
minimalny = dochody[ 0 ]Ustal początkowy numer elementu minimalnego:
nr_minimalnego = 0// Sprawd kolejne elementy, wymie minimum gdy trzeba ź ń
Dla każdego elementu tablicy począwszy od drugiego
if( aktualny odwiedzony < minimalny ) {
minimalny = aktualny odwiedzony;
nr_minimalnego = numer aktualnie odwiedzonego; }
Copyright © Roman Simiński Strona : 62 Podstawy programowania
Podstawy programowania
Zanim posortujemy — wyszukiwanie minimum, przypomnienie
Zanim posortujemy — wyszukiwanie minimum, przypomnienie
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
double minimalny; // Minimalny
int nr_minimalnego; // Indeks minimalnego elementu
// Ustalenie wartosci poczatkowych dla elementu minimalnego minimalny = dochody[ 0 ];
nr_minimalnego = 0;
// Sprawdz kazdy nast pny i zapamietaj indeks i wartosc gdy mniejszyę for( int i = 1; i < LB_MIESIECY; i++ )
if( dochody[ i ] < minimalny ) {
minimalny = dochody[ i ]; nr_minimalnego = i;
}
double minimalny; // Minimalny
int nr_minimalnego; // Indeks minimalnego elementu
// Ustalenie wartosci poczatkowych dla elementu minimalnego
minimalny = dochody[ 0 ]; nr_minimalnego = 0;
// Sprawdz kazdy nast pny i zapamietaj indeks i wartosc gdy mniejszyę for( int i = 1; i < LB_MIESIECY; i++ )
if( dochody[ i ] < minimalny ) {
minimalny = dochody[ i ]; nr_minimalnego = i;
Copyright © Roman Simiński Strona : 63 Podstawy programowania
Podstawy programowania
Sortowanie — krok pierwszy
Sortowanie — krok pierwszy
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
double minimalny; // Minimalny
int nr_minimalnego; // Indeks minimalnego elementu
// Ustalenie wartosci poczatkowych dla elementu minimalnego minimalny = dochody[ ? ];
nr_minimalnego = ? ;
// Sprawdz kazdy nast pny i zapamietaj indeks i wartosc gdy mniejszyę for( int i = 1; i < LB_MIESIECY; i++ )
if( dochody[ i ] < minimalny ) {
minimalny = dochody[ i ]; nr_minimalnego = i;
}
double minimalny; // Minimalny
int nr_minimalnego; // Indeks minimalnego elementu
// Ustalenie wartosci poczatkowych dla elementu minimalnego
minimalny = dochody[ ? ]; nr_minimalnego = ? ;
// Sprawdz kazdy nast pny i zapamietaj indeks i wartosc gdy mniejszyę for( int i = 1; i < LB_MIESIECY; i++ )
if( dochody[ i ] < minimalny ) {
minimalny = dochody[ i ]; nr_minimalnego = i;
}
Sortowanie polega na wyznaczaniu minimum spośród jeszcze nieposortowanych. Początek części
nieposortowanej się zmienia...
Sortowanie polega na wyznaczaniu minimum spośród jeszcze nieposortowanych. Początek części
Copyright © Roman Simiński Strona : 64 Podstawy programowania
Podstawy programowania
Sortowanie — krok pierwszy
Sortowanie — krok pierwszy
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
double minimalny; // Minimalny wsrod nieposortowanych int nr_minimalnego; // Indeks minimalnego elementu
int do_posortowania; // Indeks poczatku czesci nieposortowanej
for( do_posortowania = 0; do_posortowania < LB_MIESIECY-1; ++do_posortowania ) {
Znajdź minimum wśród elementów od do_posortowania do końca tablicy
// Zamieniamy minimalny z pierwszym nieposortowanymdochody[ nr_minimalnego ] = dochody[ do_posortowania ]; dochody[ do_posortowania ] = minimalny;
}
double minimalny; // Minimalny wsrod nieposortowanych int nr_minimalnego; // Indeks minimalnego elementu
int do_posortowania; // Indeks poczatku czesci nieposortowanej
for( do_posortowania = 0; do_posortowania < LB_MIESIECY-1; ++do_posortowania ) {
Znajdź minimum wśród elementów od do_posortowania do końca tablicy
// Zamieniamy minimalny z pierwszym nieposortowanym
dochody[ nr_minimalnego ] = dochody[ do_posortowania ]; dochody[ do_posortowania ] = minimalny;
Copyright © Roman Simiński Strona : 65 Podstawy programowania
Podstawy programowania
Sortowanie — krok pierwszy
Sortowanie — krok pierwszy
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
double minimalny; // Minimalny wsrod nieposortowanych int nr_minimalnego; // Indeks minimalnego elementu
int do_posortowania; // Indeks poczatku czesci nieposortowanej
for( do_posortowania = 0; do_posortowania < LB_MIESIECY-1; ++do_posortowania ) {
// Poczatkowe minimum -- pierwszy nieposortowany minimalny = dochody[ do_posortowania ];
nr_minimalnego = do_posortowania;
// Sprawdz kazdy nast pny i zapamietaj indeks i wartosc gdy mniejszyę for( int i = do_posortowania + 1; i < LB_MIESIECY; i++ )
if( dochody[ i ] < minimalny ) {
minimalny = dochody[ i ]; nr_minimalnego = i;
}
// Przepisujemy pierwszy nieposortowany w miejsce minimum dochody[ nr_minimalnego ] = dochody[ do_posortowania ]; dochody[ do_posortowania ] = minimalny;
}
double minimalny; // Minimalny wsrod nieposortowanych int nr_minimalnego; // Indeks minimalnego elementu
int do_posortowania; // Indeks poczatku czesci nieposortowanej
for( do_posortowania = 0; do_posortowania < LB_MIESIECY-1; ++do_posortowania ) {
// Poczatkowe minimum -- pierwszy nieposortowany minimalny = dochody[ do_posortowania ];
nr_minimalnego = do_posortowania;
// Sprawdz kazdy nast pny i zapamietaj indeks i wartosc gdy mniejszyę for( int i = do_posortowania + 1; i < LB_MIESIECY; i++ )
if( dochody[ i ] < minimalny ) {
minimalny = dochody[ i ]; nr_minimalnego = i;
}
// Przepisujemy pierwszy nieposortowany w miejsce minimum
dochody[ nr_minimalnego ] = dochody[ do_posortowania ]; dochody[ do_posortowania ] = minimalny;
}
Ten fragment wstawiamy do programu ze str. 22-23 w miejsce czerwonego komentarza
Copyright © Roman Simiński Strona : 66 Podstawy programowania
Podstawy programowania
Suplement — „kompresja” iteracji
Suplement — „kompresja” iteracji
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Poniższa iteracja:
może być zapisana w krótszej postaci:
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; ++nr_miesiaca ) dochody[ nr_miesiaca ] = 0;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; dochody[ nr_miesiaca++ ] = 0 ) ;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; dochody[ nr_miesiaca++ ] = 0 ) ;
Copyright © Roman Simiński Strona : 67 Podstawy programowania
Podstawy programowania
Suplement — „kompresja” iteracji
Suplement — „kompresja” iteracji
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Wersja przedrostkowa zwiększa (zmniejsza) wartość argumentu przed użyciem
jego wartości.
Wersja przyrostkowa zwiększa (zmniejsza) wartość argumentu po użyciem jego
wartości.
int a = 5, b; b = ++a; a == 6, b == 6 int a = 5, b; b = a++; a == 6, b == 5 int licznik = 0;cout << ”Licznik: ” << licznik; licznik++;
...
licznik++;
cout << ”Licznik: ” << licznik;
int licznik = 0;
cout << ”Licznik: ” << licznik++; ...
Copyright © Roman Simiński Strona : 68 Podstawy programowania
Podstawy programowania
Suplement — „kompresja” iteracji
Suplement — „kompresja” iteracji
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
Uwaga! Średnika nie można pominąć — oznacza on instrukcję pustą.
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; dochody[ nr_miesiaca++ ] = 0 ) ;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; dochody[ nr_miesiaca++ ] = 0 ) ;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; nr_miesiaca++ ) suma += dochody[ nr_miesiaca ];
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; nr_miesiaca++ ) suma += dochody[ nr_miesiaca ];
Inny przykład:
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; suma += dochody[ nr_miesiaca++ ] ) ;
for( nr_miesiaca = 0; nr_miesiaca < LB_MIESIECY; suma += dochody[ nr_miesiaca++ ] ) ;
Copyright © Roman Simiński Strona : 69 Podstawy programowania
Podstawy programowania
Suplement — „kompresja” iteracji
Suplement — „kompresja” iteracji
T a b l i c e i i c h w y k o r z y s t a n i e
T a b l i c e i i c h w y k o r z y s t a n i e
nr_miesiaca = LB_MIESIECY; while( --nr_miesiaca >= 0 ) dochody[ nr_miesiaca ] = 0;
Gdy kolejność wykonywania operacji na tablicy nie ma znaczenia, np. iteracja while:
for( nr_miesiaca = LB_MIESIECY; --nr_miesiaca>=0 ; tab[ nr_miesiaca ] = 0 ) ;
Copyright © Roman Simiński Strona : 70
Napisać program rejestrujący czasy przejazdu
zawodników startujących w slalomie.
Wymagania dla programu:
Liczba zawodników — zwykle 30.
Wyświetlenie czasów uporządkowanych rosnąco — od
najlepszego do najgorszego.
Wyznaczenie i wyświetlenie statystyki czasów: czasu średniego, wartości
środkowej (mediany), wariancji i odchylenia standardowego.
Wpisywanie danych na bieżąco, wyniki po
wpisaniu wszystkich czasów.
Podstawy programowania
Podstawy programowania T a b l i c e i i c h w y k o r z y s t a n i eT a b l i c e i i c h w y k o r z y s t a n i e
Problem do rozwiązania — statystyka czasów przejazdu slalomu
Problem do rozwiązania — statystyka czasów przejazdu slalomu
Copyright © Roman Simiński Strona : 71
Na wejściu mamy
30
-ci liczb rzeczywistych — każdy z nich to czas
przejazdu odpowiedniego zawodnika.
• • • 1 2 3 30 14.5 14.8 13.5 • • • 16 1 2 3 30 Podstawy programowania Podstawy programowania T a b l i c e i i c h w y k o r z y s t a n i eT a b l i c e i i c h w y k o r z y s t a n i e
Analiza problemu — co mamy na wejściu?
Analiza problemu — co mamy na wejściu?
Copyright © Roman Simiński Strona : 72
Czasy przejazdów
30
zawodników startujących w slalomie można zapamiętać
w
30
-to elementowej tablicy.
• • • 1 2 3 30 14.5 14.8 13.5 • • • 16 // Liczba zawodnikow
const int LB_ZAWOD = 30;
// Tablica do przechowywania czasow
double czasy[ LB_ZAWOD ];
0 1 2 29
Podstawy programowania
Podstawy programowania T a b l i c e i i c h w y k o r z y s t a n i eT a b l i c e i i c h w y k o r z y s t a n i e
Analiza problemu — jak zapamiętać dane wejściowe?
Analiza problemu — jak zapamiętać dane wejściowe?
Copyright © Roman Simiński Strona : 73 14.5 14.8 13.5 • • • 16 0 1 2 29 13.5 14.5 14.8 • • • 16 Dane wejściowe Dane wejściowe Dane uporządkowane Dane uporządkowane
Sortowanie
Sortowanie
Uwaga! Aby można było posortować dane, trzeba je po wczytaniu zmagazynować
w pamięci operacyjne — najlepiej w tablicy. Algorytmów sortowania tablic jest wiele.
Uwaga! Aby można było posortować dane, trzeba je po wczytaniu zmagazynować
w pamięci operacyjne — najlepiej w tablicy. Algorytmów sortowania tablic jest wiele.
Wystarczy wykorzystać dowolny z algorytmów sortowania — dla
30
elementów może
to być jakikolwiek z prostych algorytmów sortowania.
0 1 2 29
Podstawy programowania
Podstawy programowania T a b l i c e i i c h w y k o r z y s t a n i eT a b l i c e i i c h w y k o r z y s t a n i e
Analiza problemu — czasy należy uporządkować narastająco
Analiza problemu — czasy należy uporządkować narastająco
Copyright © Roman Simiński Strona : 74
Czasy tworzą ciąg
30
-stu danych liczbowych. Załóżmy, że tych liczb jest n.
a
śr=
a
1+ a
2+ a
3+ … + a
nn
to środkowy wyraz ciągu (dla n nieparzystego),
to średnia arytmetyczna środkowych wyrazów ciągu (dla n parzystego).
Mediana uporządkowanego rosnąco ciągu n liczb a
1≤
a
2≤
a
3≤
…
≤
a
n:
Średnia arytmetyczna a
śrto:
Możemy wtedy powiedzieć, że mamy n danych liczbowych
a
1, a
2, a
3, ..., a
n.
Podstawy programowania
Podstawy programowania T a b l i c e i i c h w y k o r z y s t a n i eT a b l i c e i i c h w y k o r z y s t a n i e