Program 14 Napisać: * funkcję słuŝącą do losowego wypełniania tablicy liczbami całkowitymi z podanego zakresu (*). Parametrami funkcji mają być tablica, jej długość oraz dwie liczby stanowiące krańce przedziału z którego mają być losowane elementy tablicy; * funkcję zwracającą najmniejszy element tablicy podanej jako parametr o długości podanej jako parametr; * funkcję zwracającą wartość logiczną informującą, czy tablica zawiera powtórzenia. Wykorzystać powyŝsze funkcje w programie generującym tablicę losowych liczb całkowitych z przedziału podanego przez uŝytkownika, o długości podanej przez uŝytkownika. Program ma wypisywać uzyskaną tablicę, a następnie - w zaleŝności od decyzji uŝytkownika - albo informować jaka jest najmniejsza liczba w tej tablicy, albo informować, czy tablica zawiera powtórzenia. #include <iostream> #include <ctime> using namespace std; void Losuj(int t[],int r,int a,int b); void Wypisz(int tab[],int n); int Minimalny(int tab[],int n); bool Powtorzenia(int tab[],int r); int main () int n; char znak; int pp,kp; cout<<"podaj rozmiar tablicy: "; cin>>n; int liczby[n]; cout<<"podaj poczatek przedzialu z ktorego maja byc losowane liczby: "; cin>>pp; cout<<"podaj koniec przedzialu z ktorego maja byc losowane liczby: "; cin>>kp; cout<<"losuje liczby z przedzialu ["<<pp<<","<<kp<<"]"<<endl;
Losuj(liczby,n,pp,kp); Wypisz(liczby,n); cout<<"znalezienie elementu minimalnego - m"<<endl; cout<<"sprawdzenie czy tablica zawiera powtorzenia - p"<<endl; cout<<"koniec programu - inny klawisz"<<endl; cin>>znak; if(znak=='m') cout<<"element minimalny tablicy to" <<Minimalny(liczby,n)<<endl; else if(znak=='p') if(powtorzenia(liczby,n)) cout<<"tablica zawiera powtorzenia"<<endl; else cout<<"tablica nie zawiera powtorzen"<<endl; system("pause"); void Losuj(int tab[],int r,int a,int b) int temp,przedzial; przedzial=b-a; srand(time(null)); for (int i=0; i<r; i++) temp=rand(); tab[i]=temp%przedzial+a; void Wypisz(int tab[],int r)
cout<<"elementy tablicy:"<<endl; for(int i=0;i<r;i++) cout<<"element "<<i+1<<": "<<tab[i]<<endl; int Minimalny(int tab[],int r) int min=tab[0]; for(int i=1;i<r;i++) if(min>tab[i]) min=tab[i]; return min; bool Powtorzenia(int tab[],int r) bool powt=false; int temp; for(int i=0;i<r-1;i++) for(int j=0;j<r-1;j++) if(tab[j]<tab[j+1]) temp=tab[j]; tab[j]=tab[j+1]; tab[j+1]=temp; for(int j=0;j<4;j++) if(tab[j]==tab[j+1]) powt=true; return powt;
Omówienie programu Na początku programu mamy następujące deklaracje funkcji (powtórzenie o funkcjach patrz opis Programu 6): void Losuj(int t[],int r,int a,int b); void Wypisz(int tab[],int n); int Minimalny(int tab[],int n); bool Powtorzenia(int tab[],int r); Definicje powyŝszych znajdują się poniŝej funkcji main. Funkcja Losuj void Losuj(int tab[],int r,int a,int b) int temp,przedzial; przedzial=b-a; srand(time(null)); for (int i=0; i<r; i++) temp=rand(); tab[i]=temp%przedzial+a; Funkcja nie zwraca Ŝadnej wartości zatem przed nazwą mamy słówko void (i dlatego wewnątrz funkcji nie ma instrukcji return). Funkcja posiada 4 argumenty/parametry: int tab[],int r,int a,int b Pierwszy argument to tablica typu int: int tab[] Drugi argument to zmienna typu int: int r (argument ten określa rozmiar tablicy tab) Trzeci argument to zmienna typu int: int a (argument ten określa początek przedziału z którego będziemy losowali liczby) Czwarty argument to zmienna typu int: int b (argument ten określa koniec przedziału z którego będziemy losowali liczby) Wewnątrz funkcji mamy: int temp,przedzial; przedzial=b-a; srand(time(null)); for (int i=0; i<r; i++)
temp=rand(); tab[i]=temp%przedzial+a; Pierwsza linijka: int temp,przedzial; to deklaracja dwóch zmiennych typu int o nazwach temp i przedzial. Następnie zmiennej przedział przyporządkowujemy róŝnicę b-a: przedzial=b-a; Wartość zmiennej (lokalnej) a to początek przedziału z którego będą losowane liczby, wartość zmiennej (lokalnej) b to koniec przedziału z którego będą losowane liczby. A zatem wartość zmiennej przedział to długość przedziału z którego będą losowane liczby (np. jeŝeli mamy przedział [4,9] to jego długość wynosi 5). O generowaniu liczb losowych moŝna przeczytać na stronie: http://math.uni.lodz.pl/~polrola/strony/0607l-podyplom/losowanie_liczb.html (O generowaniu liczb losowych patrz teŝ Program 5) po zapoznaniu się z powyŝszą stroną wiemy, Ŝe aby wygenerować liczbę z przedziału [0,k] powinniśmy wziąć resztę z dzielenia temp (temp=rand()) przez k czyli temp%k W naszym przypadku chcemy wygenerować liczby z przedziału [a,b]. Aby otrzymać taką liczbę wystarczy wylosować liczbę z przedziału [0,b-a] i do wyniku dodać liczbę a (jeŝeli np. losujemy liczbę z przedziału [0,4] i do wyniku dodamy 6 to w efekcie otrzymamy liczbę z przedziału [6,10]). A zatem bierzemy resztę z dzielenia temp przez b-a: temp%przedzial bo wartość zmiennej przedział to b-a. Następnie do otrzymanej wartości dodajemy a czyli mamy: temp%przedzial+a; Zapisanie w i-tym elemencie tablicy tab liczby losowej z przedziału [a,b]:
tab[i]=temp%przedzial+a; Instrukcje: temp=rand(); tab[i]=temp%przedzial+a; znajdują się w pętli: for (int i=0; i<r; i++) poniewaŝ chcemy wpisać liczby losowe do całej tablicy tab (o rozmiarze r). A zatem generowanie liczby losowej odbywa się dla kaŝdego elementu tablicy oddzielnie. Funkcja Wypisz Funkcja ta została omówiona w Programie 11. Funkcja Minimalny int Minimalny(int tab[],int r) int min=tab[0]; for(int i=1;i<r;i++) if(min>tab[i]) min=tab[i]; return min; Funkcja zwraca wartości typu int zatem przed jej nazwą mamy słówko int (i dlatego wewnątrz funkcji mamy instrukcję return). Funkcja posiada 2 argumenty/parametry: int tab[],int r Pierwszy argument to tablica typu int: int tab[] Drugi argument to zmienna typu int: int r (argument drugi określa rozmiar tablicy tab) Wewnątrz funkcji mamy:
int min=tab[0]; for(int i=1;i<r;i++) if(min>tab[i]) min=tab[i]; return min; Instrukcje: int min=tab[0]; for(int i=1;i<r;i++) if(min>tab[i]) min=tab[i]; to wyszukanie element minimalnego w tablicy tab i zapisanie go w zmiennej min. Sposób wyszukania elementu minimalnego jest analogiczny do wyszukania elementu maksymalnego, który jest omówiony w Programie 13 (podstawowa róŝnica to znak > zamiast <). Ostania linijka funkcji Minimalny to: return min; Instrukcja ta powoduje, Ŝe funkcja zwraca wartość zmiennej min (czyli najmniejszy element tablicy tab). Co to znaczy, Ŝe funkcja zwraca wartość? - powtórzenie JeŜeli funkcja zwraca wartość wówczas przed jej nazwą musimy umieścić typ wartości zwracanej. JeŜeli funkcja nie zwraca wartości wówczas przed jej nazwą pojawia się słowo void. Funkcje, która nie zwraca wartości nazywamy procedurą. RozwaŜmy funkcję: void fun() cout<< sroda ; PoniewaŜ, przed nazwą funkcji (fun) mamy słówko void zatem funkcja ta nie zwraca wartości. Jej działanie polega na wypisaniu na ekranie słowa sroda. A zatem po wywołaniu: fun();
na ekranie będzie wypisane słowo sroda. RozwaŜmy teraz inną funkcję: int fun2() int a=5; return a; PoniewaŜ, przed nazwą funkcji (fun2) mamy słówko int zatem funkcja ta zwraca wartość całkowitą. Jej działanie polega na: Zdefiniowaniu zmiennej a i nadaniu jej wartości 5: int a=5; Zwróceniu wartości zmiennej a: return a; Co oznacza to zwracanie wartości? Aby to wyjaśnić spróbujmy wywołać funkcję fun2: fun2(); Na ekranie nic się nie pojawi dlatego, Ŝe po wywołaniu funkcji wykonywane są instrukcje wewnątrz funkcji, a wewnątrz tej funkcji nie ma instrukcji zaczynającej się od: cout<< która to instrukcja słuŝy do wypisywania na ekran. Wywołajmy teraz funkcję fun2 inaczej: cout<<fun2(); Na ekranie będzie coś wypisane (mamy cout<<). Co to będzie? Okazuje się, Ŝe będzie to wartość zwracana przez funkcję fun2! Wartość zwracana przez funkcję fun2 to wartość zmiennej która pojawia się po słowie return czyli wartość zmiennej a (poniewaŝ mamy return a), która ma wartość 5. I to właśnie wartość tej zmiennej będzie wypisana na ekranie. Czyli na ekranie pojawi się liczba 5. UWAGA: jeŝeli funkcja zwraca wartość wówczas musi się w jej definicji pojawić instrukcja return po której następuje nazwa zmiennej, której wartość jest zwracana przez funkcję np.
return x; lub wprost wartość zwracana przez funkcję np. return 5; RozwaŜmy teraz funkcję: void fun3() int a=5; PoniewaŜ funkcja ta nie zwraca wartości zatem nie ma sensu instrukcja: cout<<fun3(); RozwaŜmy jeszcze funkcję: int fun4() return 7; Funkcja zwraca wartość całkowita (int przed nazwą funkcji). Jaka to jest wartość? Wiemy juŝ, Ŝe jest to zmienna lub liczba występująca po return. W powyŝszej funkcji mamy: return 7; czyli funkcja zwróci wartość 7. Czyli jeŝeli wywołamy funkcję fun4 następująco: cout<<fun4(); na ekranie zostanie wypisana liczba 7. A co się stanie jeŝeli funkcję ta wywołamy następująco: fun4(); Teraz na ekranie nie będzie nic wypisane. Mimo, Ŝe funkcja zwraca wartość 7 to jednak nic nie robimy z tą wartością, w szczególności nie wypisujemy jej na ekranie (instrukcją cout<<).
Funkcja Powtorzenia bool Powtorzenia(int tab[],int r) bool powt=false; int temp; for(int i=0;i<r-1;i++) for(int j=0;j<r-1;j++) if(tab[j]<tab[j+1]) temp=tab[j]; tab[j]=tab[j+1]; tab[j+1]=temp; for(int j=0;j<4;j++) if(tab[j]==tab[j+1]) powt=true; return powt; Funkcja zwraca wartość typu bool (typ logiczny patrz omówienie Programu 3) zatem przed jej nazwą mamy słówko bool (i dlatego wewnątrz funkcji mamy instrukcję return). Funkcja posiada 4 argumenty/parametry: int tab[],int r Pierwszy argument to tablica typu int: int tab[] Drugi argument to zmienna typu int: int r (argument drugi określa rozmiar tablicy tab) Działanie funkcji sprowadza się do sprawdzenia czy w tablicy przesłanej do niej jako argument (tab) o rozmiarze r występuję powtórzenie jakiegoś elementu. Sprawdzenie czy powtórzenie występuje odbywa się analogicznie jak w Programie 13 tzn. sortujemy tablicę a następnie sprawdzamy czy w tablicy występują obok siebie dwa identyczne elementy (szczegóły metody patrz Program 13).
Omówienie zawartości funkcji main() Deklaracje zmiennych wykorzystanych w programie: int n; char znak; int pp,kp; Następnie wprowadzamy rozmiar tablicy i definiujemy tablice: cout<<"podaj rozmiar tablicy: "; cin>>n; int liczby[n]; Następnie wprowadzamy początek i koniec przedziału z którego maja być losowane liczby: cout<<"podaj poczatek przedzialu z ktorego maja byc losowane liczby: "; cin>>pp; cout<<"podaj koniec przedzialu z ktorego maja byc losowane liczby: "; cin>>kp; cout<<"losuje liczby z przedzialu ["<<pp<<","<<kp<<"]"<<endl; Tablicę liczby przesyłamy do funkcji Losuj. W efekcie tablica ta zostanie wypełniona liczbami losowymi. Wywołanie funkcji Losuj: Losuj(liczby,n,pp,kp); Zawartość tablicy liczby zostanie wypisana na ekranie: Wypisz(liczby,n); Następnie na ekranie pojawia się komunikat: Znalezienie elementu minimalnego - m Sprawdzenie czy tablica zawiera powtorzenia - p Koniec programu - inny klawisz Litera, którą wciśniemy zapisywana jest w zmiennej znak (typu char):
cin>>znak; W zaleŝności od tego jaką literę wybierzemy wykonywane są odpowiednie instrukcje: if(znak=='m') cout<<"element minimalny tablicy to" <<Minimalny(liczby,n)<<endl; else if(znak=='p') if(powtorzenia(liczby,n)) cout<<"tablica zawiera powtorzenia"<<endl; else cout<<"tablica nie zawiera powtorzen"<<endl; Instrukcja warunkowa: if(powtorzenia(liczby,n)) cout<<"tablica zawiera powtorzenia"<<endl; else cout<<"tablica nie zawiera powtorzen"<<endl; Warunek to: Powtorzenia(liczby,n) Warunek ten jest spełniony jeŝeli wartość zwracana przez funkcję Powtorzenia to true (prawda). Oznacza to (patrz omówienie funkcji Powtorzenia), ze tablica liczby zawiera powtórzenia.