Program 14 Napisać: * funkcję słuŜącą do losowego wypełniania

Transkrypt

Program 14 Napisać: * funkcję słuŜącą do losowego wypełniania
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.