program 15
Transkrypt
program 15
Program 15 Program zawierający następujące funkcje: • funkcję wczytującą elementy do tablicy liczb całkowitych podanej jako parametr (długość tablicy również ma być podana jako parametr); • funkcję wypisującą zawartość tablicy podanej jako parametr, o długości podanej jako parametr; • funkcję wyszukującą największy element we fragmencie tablicy. Parametrami funkcji mają być: tablica liczb całkowitych oraz początek i koniec obszaru wyszukiwania; funkcja ma zwracać numer miejsca na którym stoi największy element; • funkcję zamieniającą miejscami dwa elementy tablicy. Parametrami funkcji ma być tablica oraz dwie liczby będące numerami miejsc przestawianych elementów; funkcja niczego nie zwraca. Wykorzystać powyższe funkcje do pobrania i posortowania tablicy liczb całkowitych o długości podanej przez użytkownika. Jedna z metod sortowania tablic działa w następujący sposób: • znajdujemy największy element tablicy i przestawiamy go na koniec, a na jego miejsce wstawiamy element, który dotychczas stał na końcu; • powtarzamy powyższą czynność, ale działając tym razem na fragmencie tablicy obejmującym elementy od pierwszego do przedostatniego; • czynność powtarzamy, za każdym razem działając na fragmencie tablicy o jeden krótszym od poprzedniego. Ostatnim krokiem algorytmu jest krok rozpatrujący fragment złożony z dwóch elementów. #include <iostream> using namespace std; void Pobierz(int tab[], int n); void Wypisz(int tab[], int n); int Maksymalny(int tab[], int a, int b); void Zamien(int tab[],int c, int d); int main() { int n,k; cout<<"Podaj dlugosc tablicy: "; cin>>n; int liczby[n]; Pobierz(liczby,n); Wypisz(liczby,n); for(int i=0; i<n-1; i++) { PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ k=Maksymalny(liczby,1,n-i); Zamien(liczby,k,n-i); } cout<<"Tablica posortowana: "<<endl; Wypisz(liczby,n); system("PAUSE"); return 0; } void Pobierz(int tab[],int n) { cout<<"Wprowadz elementy tablicy:"<<endl; for(int i=0;i<n;i++) { cout<<"Element "<<i+1<<": "; cin>>tab[i]; } } void Wypisz(int tab[],int n) { cout<<"Elementy tablicy:"<<endl; for(int i=0;i<n;i++) { cout<<"Element "<<i+1<<": "<<tab[i]<<endl; } } int Maksymalny(int tab[], int a, int b) { int max=tab[a-1]; int k=a-1; for(int i=a-1; i<=(b-1); i++) { if(tab[i]>max) { max=tab[i]; k=i; } } return k+1; } PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ void Zamien(int tab[],int c, int d) { int temp; temp=tab[c-1]; tab[c-1]=tab[d-1]; tab[d-1]=temp; } Omówienie programu W programie są wykorzystane następujące funkcje: Funkcja Pobierz Funkcja Pobierz była omówiona w Programie 11. Funkcja Wypisz Funkcja Wypisz omówioną w Programie 11. Funkcja Maksymalny int Maksymalny(int tab[], int a, int b) { int max=tab[a-1]; int k=a-1; for(int i=a-1; i<=(b-1); i++) { if(tab[i]>max) { max=tab[i]; k=i; } } return k+1; } Działanie tej funkcji polega na znalezieniu numeru miejsca na którym stoi element największy we fragmencie tablicy tab będącej argumentem/parametrem funkcji. Argument a to początek obszaru wyszukiwania, argument b – koniec obszaru wyszukiwania. Parametrami funkcji mają być: tablica liczb całkowitych oraz początek i koniec obszaru wyszukiwania; funkcja ma zwracać numer miejsca na którym stoi największy element. Przykład Przyjmijmy, że tablica tab zawiera liczby: PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ 1, -21, -8, 7, -5, 5, 4, 3, 11, -2 Jeżeli jako początek obszaru wyszukiwania (czyli wartość zmiennej a) podamy 3, a jako koniec (czyli wartość zmiennej b) 7 oznacza to, że interesuje nas największy element tablicy we fragmencie tablicy począwszy od elementu trzeciego (czyli -8), a skończywszy na elemencie siódmym (czyli 4). A zatem interesuje nas element największy spośród liczb oznaczonych na czerwono: 1, -21, -8, 7, -5, 5, 4, 3, 11, -2 Funkcja Maksymalny ma zwracać numer miejsca na którym stoi największy element. A zatem w przypadku powyższej tablicy powinna zwrócić: 4 ponieważ na pozycji czwartej w tablicy stoi liczba 7, która jest największa spośród liczb w zaznaczonym fragmencie tablicy. Algorytm znalezienia elementu maksymalnego we fragmencie tablicy jest modyfikacją algorytmy omówionego w Programie 13. W programie 14 zdefiniowana jest funkcja Minimalny zwracająca element minimalny tablicy. Omawiana funkcja Maksymalny jest zdefiniowana podobnie. Różnice są następujące: • Funkcja wyszukuje element maksymalny, ale tylko we wskazanym fragmencie tablicy, a nie w całej tablicy. Początek interesującego nas fragmentu określony jest przez wartość zmiennej a, koniec – przez wartość zmiennej b. A zatem pętla pozwalająca nam wyszukać element maksymalny jest określona tak aby rozpocząć od elementu tab[a-1] i skończyć na elemencie tab[b-1]: for(int i=a-1; i<=(b-1); i++) { if(tab[i]>max) { max=tab[i]; k=i; } } UWAGA: Przypominam, że do i-tego elementu tablicy tab odwołujemy się, przez tab[i-1]. A zatem pierwszy element tablicy tab to tab[0]. Jeżeli interesują nas elementy tablicy między trzecim i siódmym oznacza to, że interesują nas elementy: tab[2], tab[3], tab[4], tab[5], tab[6] Wewnątrz pętli znajdują się następujące instrukcje: if(tab[i]>max) PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ { max=tab[i]; k=i; } W zmiennej max zapisujemy wartość elementu maksymalnego, w zmiennej k jego pozycję w tablicy tab. • Funkcja Maksymalny zwraca (stąd return) położenie elementu maksymalnego, a nie jego wartość. Zatem w przypadku tablicy omówionej powyżej funkcja zwróci pozycję elementu maksymalnego we wskazanym fragmencie tablicy (czyli 4 – bo element jest na czwartej pozycji w tablicy), a nie wartość tego elementu (czyli 7). W związku z tym na końcu funkcji mamy instrukcję: return k+1; Dzięki niej funkcja Maksymalny zwraca położenie elementu maksymalnego w tablicy tab (czyli, który to jest element w tablicy). Funkcja Zamien Funkcja nie zwraca żadnej wartości zatem przed nazwą mamy słówko void (i dlatego wewnątrz funkcji nie ma instrukcji return). Funkcja posiada 3 argumenty/parametry: int tab[],int a,int b Pierwszy argument to tablica typu int: int tab[] Drugi argument to zmienna typu int: int a. Argument ten określa położenie w tablicy tab elementu, którego położenie będziemy zmieniać. Trzeci argument to zmienna typu int: int b. Argument ten określa położenie w tablicy tab elementu, którego położenie będziemy zmieniać. Funkcja Zamien zamienia miejscami a-ty element tablicy z elementem b-tym. Przykład Załóżmy, że tablica liczby jest następująca: 1, -21, -8, 7, -5, 5, 4, 3, 11, -2 Jeżeli wywołamy funkcję Zamien w następujący sposób: Zamien(liczby,3,5) tablica liczby będzie wyglądała następująco: PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ 1, -21, -5, 7, -8, 5, 4, 3, 11, -2 czyli trzeci element tablicy został zamieniony z elementem piątym. Wewnątrz funkcji Zamien mamy: int temp; temp=tab[c-1]; tab[c-1]=tab[d-1]; tab[d-1]=temp; Zmienna temp jest zmienną w której chwilowo zachowujemy wartość jednego z przenoszonych elementów. Postępujemy następująco: UWAGA: Przypominam, że element 4 (czwarty) tablicy tab to element tab[3]. 1. Wartość elementu c (czyli element tab[c-1]) tablicy zapisujemy w zmiennej temp. 2. Wartość elementu d (czyli element tab[d-1]) tablicy zapisujemy w elemencie c tablicy (czyli elemencie tab[c-1]). 3. Wartość zmiennej temp zapisujemy w elemencie d tablicy (czyli w elemencie tab[d-1]). Wewnątrz funkcji main mamy: int n,k; cout<<"Podaj dlugosc tablicy: "; cin>>n; int liczby[n]; Pobierz(liczby,n); for(int i=0; i<n-1; i++) { k=Maksymalny(liczby,1,n-i); Zamien(liczby,k,n-i); } cout<<"Tablica posortowana: "<<endl; Wypisz(liczby,n); Po wprowadzeniu długości tablicy (zmienna n), wpisaniu liczb do tablicy (funkcja Pobierz) sortujemy tablice według algorytmu: PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ • znajdujemy największy element tablicy i przestawiamy go na koniec, a na jego miejsce wstawiamy element, który dotychczas stał na końcu; • powtarzamy powyższą czynność, ale działając tym razem na fragmencie tablicy obejmującym elementy od pierwszego do przedostatniego; • czynność powtarzamy, za każdym razem działając na fragmencie tablicy o jeden krótszym od poprzedniego. Kolejno w pętli for wykonywane są następujące operacje (załóżmy, że tablica liczby ma 10 elementów czyli n=10): Dla i=0: Położenie elementu maksymalnego w tablicy liczby zwracane jest przez funkcję Maksymalny. Położenie to zapisujemy w zmiennej k: k=Maksymalny(liczby,1,10); Następnie zamieniamy miejscami element ostatni tablicy liczby (czyli 10-ty bo tablica jest 10-elementowa) i znaleziony element maksymalny, który jest elementem k-tym: Zamien(liczby,k,10); Dla i=1: Położenie elementu maksymalnego we fragmencie tablicy liczby począwszy od elementu pierwszego (stąd 1), a skończywszy na elemencie przedostatnim (stąd 9) zwracane jest przez funkcję Maksymalny. Położenie to zapisujemy w zmiennej k: k=Maksymalny(liczby,1,9); Następnie zamieniamy miejscami przedostatni element tablicy liczby (czyli 9-ty bo tablica jest 10 elementowa) i znaleziony element maksymalny, który jest elementem k-tym: Zamien(liczby,k,9); ……………………… ……………………… Dla i=8: PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/ Położenie elementu maksymalnego we fragmencie tablicy liczby począwszy od elementu pierwszego (stąd 1), a skończywszy na drugim (stąd 2) zwracane jest przez funkcję Maksymalny. Położenie to zapisujemy w zmiennej k: k=Maksymalny(liczby,1,2); Następnie zamieniamy miejscami drugi element tablicy liczby i znaleziony element maksymalny, który jest elementem k-tym: Zamien(liczby,k,2); Po posortowaniu wypisujemy zawartość tablicy liczby korzystając z funkcji Wypisz: cout<<"Tablica posortowana: "<<endl; Wypisz(liczby,n); PDF stworzony przez wersję demonstracyjną pdfFactory Pro www.pdffactory.pl/