Program 22 Zadeklarować strukturę Osoba przechowującą dane osoby: imię, nazwisko (ciągi znaków), płeć (pojedynczy znak) oraz rok urodzenia (liczba całkowita). Napisać następujące funkcje: funkcje pobierającą zawartość tablicy osób podanej jako parametr, o długości podanej jako parametr; funkcje wypisującą dane osoby podanej jako parametr; funkcje wypisującą wszystkie dwuosobowe zespoły złoŝone z osób urodzonych w tym samym roku, jakie moŝna utworzyć mając do dyspozycji osoby zapamiętane w tablicy podanej jako parametr o długości podanej jako parametr. Wykorzystać powyŝsze funkcje do napisania programu tworzącego tablice osób o podanej przez uŝytkownika długości, pobierającego dane do tej tablicy i wypisującego wszystkie dwuosobowe zespoły złoŝone z osób znajdujących sie w tablicy i mających jednakowy rok urodzenia. #include <iostream> using namespace std; struct Osoba string Imie; string Nazwisko; char Plec; int RokUr; ; void Pobierz(Osoba t[],int r); void Wypisz(Osoba a); void Zesp2Osob(Osoba t[],int r); int main() int n; cout<<"podaj liczbe studentow: "; cin>>n; Osoba *tab=new Osoba[n]; Pobierz(tab,n); Zesp2Osob(tab,n); delete [] tab; system("pause"); return 0;
void Pobierz(Osoba t[],int r) for(int i=0;i<r;i++) cin>>t[i].imie; cin>>t[i].nazwisko; cin>>t[i].plec; cin>>t[i].rokur; void Wypisz(Osoba a) cout<<"imie: "<<a.imie<<endl; cout<<"nazwisko: "<<a.nazwisko<<endl; cout<<"plec: "<<a.plec<<endl; cout<<"rokur: "<<a.rokur<<endl; void Zesp2Osob(Osoba t[],int r) for(int i=0;i<r-1;i++) for(int j=i+1;j<r;j++) if(t[i].rokur==t[j].rokur) cout<<"zespol "<<endl; cout<<"osoba 1:"<<endl; Wypisz(t[i]); cout<<"osoba 2:"<<endl; Wypisz(t[j]);
Omówienie programu Na początku programu deklarujemy strukturę Osoba (o strukturach moŝesz przeczytać w omówieniu Programu 6): struct Osoba string Imie; string Nazwisko; char Plec; int RokUr; ; Struktura ma 4 pola: Imie, Nazwisko (ciągi znaków - string), Plec (pojedynczy znak) i RokUr (liczba całkowita). W programie wykorzystane są 4 funkcje. Funkcja Pobierz void Pobierz(Osoba t[],int r) for(int i=0;i<r;i++) cin>>t[i].imie; cin>>t[i].nazwisko; cin>>t[i].plec; cin>>t[i].rokur; Funkcja nie zwraca Ŝadnej wartości (słówko void przed nazwą funkcji). Funkcja posiada dwa argumenty/parametry. Pierwszy to tablica typu Osoba o nazwie t, argument drugi to liczba całkowita (int) będąca rozmiarem tablicy t. Wewnątrz funkcji mamy pętlę for: for(int i=0;i<r;i++)
cin>>t[i].imie; cin>>t[i].nazwisko; cin>>t[i].plec; cin>>t[i].rokur; Pętla ta umoŝliwia wpisanie danych (imienia, nazwiska, płci i roku urodzenia) do tablicy osób t o rozmiarze r. Dla i=0 wpisujemy dane do pierwszego elementu tablicy (tab[0]): cin>>t[0].imie; cin>>t[0].nazwisko; cin>>t[0].plec; cin>>t[0].rokur; Dla pozostałych wartości i (1,2,3,,r-1) wprowadzamy wartości do pozostałych elementów tablicy. Funkcja Wypisz void Wypisz(Osoba a) cout<<"imie: "<<a.imie<<endl; cout<<"nazwisko: "<<a.nazwisko<<endl; cout<<"plec: "<<a.plec<<endl; cout<<"rokur: "<<a.rokur<<endl; Funkcja Wypisz wypisuje wartości pól Imie, Nazwisko, Plec i RokUr osoby przesłanej do niej jako parametr a.
Funkcja Zesp2Osob void Zesp2Osob(Osoba t[],int r) for(int i=0;i<r-1;i++) for(int j=i+1;j<r;j++) if(t[i].rokur==t[j].rokur) cout<<"zespol "<<endl; cout<<"osoba 1:"<<endl; Wypisz(t[i]); cout<<"osoba 2:"<<endl; Wypisz(t[j]); Funkcja nie zwraca Ŝadnej wartości (słówko void przed nazwą funkcji). Funkcja posiada dwa argumenty/parametry. Pierwszy to tablica typu Osoba o nazwie t, argument drugi to liczba całkowita (int) będąca rozmiarem tablicy t. Działanie funkcji polega na wypisaniu wszystkich dwuosobowych zespołów złoŝonych z osób urodzonych w tym samym roku, jakie moŝna utworzyć mając do dyspozycji osoby zapamiętane w tablicy podanej jako parametr o długości podanej jako parametr. Wewnątrz funkcji mamy dwie pętle for. Przyjmijmy, Ŝe i=0 (zewnętrzna pętla for). Wówczas zmienna j (wewnętrzna pętla for) przyjmuje wartości 1,2,3,,r-1 gdzie r jest rozmiarem tablicy t. Dla j=1 wewnątrz pętli mamy: if(t[0].rokur==t[1].rokur) Dla j=2 wewnątrz pętli mamy: if(t[0].rokur==t[2].rokur)
itd Dla j=r-1 wewnątrz pętli mamy: if(t[0].rokur==t[r-1].rokur) A zatem dla i=0 (zewnętrzna pętla for) porównujemy rok urodzenia pierwszej osoby w tablicy z rokiem urodzenia kaŝdej następnej osoby (j=1,2,3,,r-1). Analogicznie dla i=1 (zewnętrzna pętla for) porównujemy rok urodzenia drugiej osoby w tablicy z rokiem urodzenia kaŝdej następnej osoby (j=2,3,4,r-1). (UWAGA: nie porównujemy juŝ roku urodzenia osoby drugiej i pierwszej osoby w tablicy bo zrobiliśmy to dla i=0) itd. Dla maksymalnej wartości i=r-2 (zewnętrzna pętla for) porównujemy rok urodzenia przedostatniej osoby w tablicy z rokiem urodzenia ostatniej osoby (j=r-1). W ten sposób porównamy rok urodzenia kaŝdych dwóch osób zapisanych w tablicy. Schematycznie (r rozmiar tablicy czyli liczba osób): i=0, j=1 porównujemy rok urodzenia pierwszego elementu tablicy i drugiego elementu. i=0, j=2 porównujemy rok urodzenia pierwszego elementu tablicy i trzeciego elementu. itd i=0, j=r-1 porównujemy rok urodzenia pierwszego elementu tablicy i ostatniego elementu.
i=1, j=2 porównujemy rok urodzenia drugiego elementu tablicy i trzeciego elementu. i=1, j=3 porównujemy rok urodzenia drugiego elementu tablicy i czwartego elementu. itd i=1, j=r-1 porównujemy rok urodzenia drugiego elementu tablicy i ostatniego elementu. JeŜeli rok urodzenia dwóch porównywanych osób (osoby t[i] i osoby t[j]) jest ten sam wówczas spełniony jest warunek: t[i].rokur==t[j].rokur Oznacza to, Ŝe osoby te mogą utworzyć zespół - wypisywane są informacje o tych osobach (przy uŝyciu funkcji Wypisz). if(t[i].rokur==t[j].rokur) cout<<"zespol "<<endl; cout<<"osoba 1:"<<endl; Wypisz(t[i]); cout<<"osoba 2:"<<endl; Wypisz(t[j]);