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/