Program 19 Zadeklarować strukturę Student o polach: Imie
Transkrypt
Program 19 Zadeklarować strukturę Student o polach: Imie
Program 19 Zadeklarować strukturę Student o polach: Imie, Nazwisko (ciągi znaków), Oceny (pięcioelementowa tablica wartości rzeczywistych reprezentujących oceny studenta) i Semestr_zaliczony (wartość logiczna informująca, czy semestr jest zaliczony, czy nie). A. Napisać: • funkcję pobierającą dane studenta podanego jako parametr, "pilnującą" prawidłowego podania danych (ocena nie moŜe być liczbą inną niŜ 2, 3, 3.5, 4, 4.5, 5) i nadającą polu Semestr_zaliczony wartość fałszywą; • funkcję wypisującą wszystkie dane studenta podanego jako parametr, program wykorzystujący powyŜsze funkcje do wczytania i wypisania tablicy studentów o długości podanej przez uŜytkownika. B. Rozszerzyć program z punktu A o funkcję Ustaw_zaliczenia, której parametrami są: tablica studentów i długość tej tablicy, zaliczającą (poprzez ustawienie pola Semestr_zaliczony, bez wypisywania jakichkolwiek komunikatów) semestr studentom posiadającym ze wszystkich przedmiotów oceny wyŜsze niŜ 2. Wykorzystać powyŜszą funkcję w programie z punktu A, zaliczając semestr studentom w utworzonej wcześniej tablicy. C. Rozszerzyć program z punktów A-B o funkcję Wypisz_najlepszych o parametrach: tablica uczniów, długość tej tablicy i liczba rzeczywista reprezentująca próg średniej ocen, wypisującą (przy uŜyciu funkcji z punktu A) studentów o średniej nie mniejszej od podanego progu. Funkcję wykorzystać w programie. #include <iostream> using namespace std; struct Student { string Imie; string Nazwisko; float Oceny[5]; bool Semestr_zaliczony; }; void void void void Pobierz(Student &a); Wypisz(Student a); Ustaw_zaliczenia(Student t[],int r); Wypisz_najlepszych(Student t[],int r, float prog); int main() { int n; cout<<"Podaj liczbe studentow: "; cin>>n; Student tab[n]; for(int i=0;i<n;i++) { cout<<"Wprowadz dane studenta "<<i+1<<": "<<endl; Pobierz(tab[i]); } Ustaw_zaliczenia(tab,n); for(int i=0;i<n;i++) { cout<<"Dane studenta "<<i+1<<": "<<endl; Wypisz(tab[i]); } Wypisz_najlepszych(tab,n,3.6); system("PAUSE"); return 0; } void Pobierz(Student &a) { cout<<"Imie: "; cin>>a.Imie; cout<<"Nazwisko: "; cin>>a.Nazwisko; for(int i=0;i<5;i++) { cout<<"Ocena "<<i+1<<": "; cin>>a.Oceny[i]; if((a.Oceny[i]!=2)&&(a.Oceny[i]!=3)&&(a.Oceny[i]!=3.5)&& (a.Oceny[i]!=4)&&(a.Oceny[i]!=4.5)&&(a.Oceny[i]!=5)) { cout<<"Ocena nieprawidlowa - wprowadz ponownie"<<endl; i--; } } a.Semestr_zaliczony=false; } void Wypisz(Student a) { cout<<"Imie: "<<a.Imie<<endl; cout<<"Nazwisko: "<<a.Nazwisko<<endl; for(int i=0;i<5;i++) { cout<<"Ocena "<<i+1<<": "<<a.Oceny[i]<<endl; } cout<<"Semestr zaliczony: "<<a.Semestr_zaliczony<<endl; } void Ustaw_zaliczenia(Student t[],int r) { for(int i=0;i<r;i++) { if((t[i].Oceny[0]>2)&&(t[i].Oceny[1]>2)&& (t[i].Oceny[2]>2)&&(t[i].Oceny[3]>2)&&(t[i].Oceny[4]>2)) { t[i].Semestr_zaliczony=true; } } } void Wypisz_najlepszych(Student t[],int r, float prog) { float suma_ocen, float srednia; cout<<"Studenci majacy srednia ocen nie mniejsza niz " <<prog<<endl; for(int i=0;i<r;i++) { suma_ocen=0; for(int j=0;j<5;j++) { suma_ocen=suma_ocen+t[i].Oceny[j]; } srednia=suma_ocen/5; if(srednia>=prog) { Wypisz(t[i]); } } } Omówienie programu Na początku programu definiujemy strukturę Student (o strukturach moŜesz przeczytać w omówieniu Programu 6): struct Student { string Imie; string Nazwisko; float Oceny[5]; bool Semestr_zaliczony; }; Struktura ma 4 pola: Imie, Nazwisko (ciągi znaków - string), Oceny (pięcioelementowa tablica wartości rzeczywistych – float - reprezentujących oceny studenta) i Semestr_zaliczony (wartość logiczna – bool - informująca, czy semestr jest zaliczony (true), czy nie (false)). W programie wykorzystane są 4 funkcje. Funkcja Pobierz void Pobierz(Student &a) { cout<<"Imie: "; cin>>a.Imie; cout<<"Nazwisko: "; cin>>a.Nazwisko; for(int i=0;i<5;i++) { cout<<"Ocena "<<i+1<<": "; cin>>a.Oceny[i]; if((a.Oceny[i]!=2)&&(a.Oceny[i]!=3)&&(a.Oceny[i]!=3.5)&& (a.Oceny[i]!=4)&&(a.Oceny[i]!=4.5)&&(a.Oceny[i]!=5)) { cout<<"Ocena nieprawidlowa - wprowadz ponownie"<<endl; i--; } } a.Semestr_zaliczony=false; } Funkcja nie zwraca Ŝadnej wartości (słówko void przed nazwą funkcji). Do funkcji Pobierz przesyłany jest przez referencję jeden argument typu Student (o przesyłaniu argumentów do funkcji – patrz omówienie Programu 6). Dzięki przesłaniu przez referencję funkcja moŜe modyfikować przesłaną do niej zmienną typu Student. Stąd: void Pobierz(Student &a) Wewnątrz funkcji mamy: cout<<"Imie: "; cin>>a.Imie; cout<<"Nazwisko: "; cin>>a.Nazwisko; czyli wprowadzamy wartości pól Imie i Nazwisko zmiennej a typu Student przesłanej do funkcji przez referencję. Następnie w funkcji Pobierz mamy pętlę for umoŜliwiającą wprowadzenie wartości ocen do tablicy Oceny (będącej polem zmiennej a): for(int i=0;i<5;i++) { cout<<"Ocena "<<i+1<<": "; cin>>a.Oceny[i]; if((a.Oceny[i]!=2)&&(a.Oceny[i]!=3)&&(a.Oceny[i]!=3.5)&& (a.Oceny[i]!=4)&&(a.Oceny[i]!=4.5)&&(a.Oceny[i]!=5)) { cout<<"Ocena nieprawidlowa - wprowadz ponownie"<<endl; i--; } } a.Semestr_zaliczony=false; W powyŜszej pętli zmienna i przyjmuje kolejno wartości 0,1,2,3,4. Wprowadzenie oceny do i-tego elementu tablicy Oceny: cin>>a.Oceny[i]; PoniewaŜ funkcja ma "pilnować" prawidłowego podania danych dalej mamy instrukcję warunkową: if((a.Oceny[i]!=2)&&(a.Oceny[i]!=3)&&(a.Oceny[i]!=3.5)&& (a.Oceny[i]!=4)&&(a.Oceny[i]!=4.5)&&(a.Oceny[i]!=5)) { cout<<"Ocena nieprawidlowa - wprowadz ponownie"<<endl; i--; } Instrukcja ta sprawdza czy ocena wprowadzona do a.Oceny[i] jest róŜna od 2,3.5,4,4.5,5. Stąd implikacja (&&) warunków: a.Oceny[i]!=2 a.Oceny[i]!=3 a.Oceny[i]!=3.5 a.Oceny[i]!=4 a.Oceny[i]!=4.5 a.Oceny[i]!=5 W efekcie otrzymujemy warunek: (a.Oceny[i]!=2)&&(a.Oceny[i]!=3)&&(a.Oceny[i]!=3.5)&& (a.Oceny[i]!=4)&&(a.Oceny[i]!=4.5)&&(a.Oceny[i]!=5) Spełnienie powyŜszego warunku oznacza, Ŝe wprowadzona ocena nie jest poprawna (bo jest róŜna od 2,3.5,4,4.5,5). Wówczas na ekranie pojawia się komunikat: Ocena nieprawidlowa - wprowadz ponownie i wartość zmiennej i jest zmniejszana o 1: i--; Dzięki temu w następnym obiegu pętli moŜemy jeszcze raz wprowadzić ocenę do tego samego elementu tablicy: a.Oceny[i] Ostatnia linijka definicji funkcji Pobierz to: a.Semestr_zaliczony=false; czyli wartość pola Semestr_zaliczony zmiennej a ustawiamy na false (fałsz). UWAGA: PoniewaŜ zmienna a jest przesłana do funkcji Pobierz przez referencję zatem wartości wprowadzonych pól zmiennej a nie ulegną zmianie po zakończeniu działania tej funkcji. Funkcja Wypisz void Wypisz(Student a) { cout<<"Imie: "<<a.Imie<<endl; cout<<"Nazwisko: "<<a.Nazwisko<<endl; for(int i=0;i<5;i++) { cout<<"Ocena "<<i+1<<": "<<a.Oceny[i]<<endl; } cout<<"Semestr zaliczony: "<<a.Semestr_zaliczony<<endl; } Funkcja Wypisz ma definicję podobną do funkcji Pobierz. RóŜnica polega na tym, Ŝe funkcja ta wypisuje (i nie zmienia ich!) wartości pól Imie, Nazwisko, Oceny (tablica – dlatego w funkcji mamy pętlę for) i Semestr_zaliczony zmiennej a. UWAGA: PoniewaŜ funkcja Wypisz nie modyfikuje pól przesłanej do niej zmiennej a typu Student dlatego zmienna ta jest przesłana przez wartość, a nie przez referencję. Funkcja Ustaw_zaliczenia Działanie funkcji Ustaw_zaliczenia polega na zaliczeniu (poprzez nadanie polu Semestr_zaliczony wartości true) semestru studentom posiadającym ze wszystkich przedmiotów oceny wyŜsze niŜ 2. void Ustaw_zaliczenia(Student t[],int r) { for(int i=0;i<r;i++) { if((t[i].Oceny[0]>2)&&(t[i].Oceny[1]>2)&& (t[i].Oceny[2]>2)&&(t[i].Oceny[3]>2)&&(t[i].Oceny[4]>2)) { t[i].Semestr_zaliczony=true; } } } Funkcja nie zwraca Ŝadnej wartości (słówko void przed nazwą funkcji). Funkcja posiada dwa argumenty. Pierwszy to tablica typu Student 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++) { if((t[i].Oceny[0]>2)&&(t[i].Oceny[1]>2)&& (t[i].Oceny[2]>2)&&(t[i].Oceny[3]>2)&&(t[i].Oceny[4]>2)) { t[i].Semestr_zaliczony=true; } } W powyŜszej pętli zmienna i przyjmuje kolejno wartości 0,1,2,…,r-1. Dzięki temu mamy dostęp do wszystkich elementów tablicy t. Działanie pętli for jest następujące: Przyjmijmy, Ŝe i jest równe 0 UWAGA: oceny (jest ich 5 i zapisane są w tablicy Oceny) pierwszego elementu tablicy t to: t[0].Oceny[0] t[0].Oceny[1] t[0].Oceny[2] t[0].Oceny[3] t[0].Oceny[4] Sprawdzamy czy spełniony jest warunek: (t[0].Oceny[0]>2)&&(t[0].Oceny[1]>2)&& (t[0].Oceny[2]>2)&&(t[0].Oceny[3]>2)&&(t[0].Oceny[4]>2) JeŜeli tak, oznacza to, Ŝe wszystkie oceny pierwszego elementu tablicy t (czyli t[0]) są wyŜsze od 2. Wówczas wartość pola Semestr_zaliczony elementu t[i] ustawiamy na true (prawda): t[i].Semestr_zaliczony=true; Działanie funkcji Ustaw_zaliczenia dla pozostałych elementów tablicy t (i pozostałych wartości zmiennej i) jest analogiczne. Funkcja Wypisz_najlepszych void Wypisz_najlepszych(Student t[],int r, float prog) { float suma_ocen, srednia; cout<<"Studenci majacy srednia ocen nie mniejsza niz " <<prog<<endl; for(int i=0;i<r;i++) { suma_ocen=0; for(int j=0;j<5;j++) { suma_ocen=suma_ocen+t[i].Oceny[j]; } srednia=suma_ocen/5; if(srednia>=prog) { Wypisz(t[i]); } } } Funkcja nie zwraca Ŝadnej wartości (słówko void przed nazwą funkcji). Funkcja posiada trzy argumenty/parametry. Pierwszy to tablica typu Student o nazwie t, argument drugi to zmienna całkowita (int) będąca rozmiarem tablicy t, argument trzeci to zmienna typu float o nazwie prog. Funkcja Wypisz_najlepszych ma za zadanie wypisać studentów o średniej nie mniejszej od podanego progu określonego przez wartość zmiennej prog. Wewnątrz funkcji mamy kolejno: • Definicje dwóch zmienny typu float: float suma_ocen, srednia; • Instrukcję wypisującą na ekran komunikat Studenci majacy srednia ocen nie mniejsza niŜ i wartość średniej będącej progiem (zmienna prog): cout<<"Studenci majacy srednia ocen nie mniejsza niz " <<prog<<endl; • Pętlę for dla zmiennej i przyjmującej wartości 0,1,2,…,r-1: for(int i=0;i<r;i++) { suma_ocen=0; for(int j=0;j<5;j++) { suma_ocen=suma_ocen+t[i].Oceny[j]; } srednia=suma_ocen/5; if(srednia>=prog) { Wypisz(t[i]); } } Działanie pętli jest następujące: Przyjmijmy, Ŝe i jest równe 0 UWAGA: oceny (jest ich 5 i zapisane są w tablicy Oceny) pierwszego elementu tablicy t to: t[0].Oceny[0] t[0].Oceny[1] t[0].Oceny[2] t[0].Oceny[3] t[0].Oceny[4] Na początku sumujemy wszystkie oceny elementu t[0] (pierwszy student „w tablicy” t) i wartość tej sumy zapisujemy w zmiennej suma_ocen: suma_ocen=0; for(int j=0;j<5;j++) { suma_ocen=suma_ocen+t[0].Oceny[j]; } Następnie obliczmy średnią ocen studenta t[0] czyli wartość zmiennej suma_ocen dzielimy przez 5 i otrzymany wynik zapisujemy w zmiennej srednia: srednia=suma_ocen/5; JeŜeli otrzymana średnia ocen elementu t[0] jest nie mniejsza od wartości zmiennej prog wówczas wykorzystując funkcję Wypisz wypisujemy informacje o elemencie t[0]: if(srednia>=prog) { Wypisz(t[0]); } Działanie pętli for dla pozostałych elementów tablicy t (i pozostałych wartości zmiennej i) jest analogiczne. Jak widać powyŜsza pętla umoŜliwia obliczenie średniej ocen kaŜdego elementu tablicy t i jeŜeli średnia ta dla któregoś elementu jest wyŜsza od wartości zmiennej prog na ekranie wypisywane są informacje o tym elemencie. Omówione powyŜej funkcje są wykorzystane w następującym programie: int main() { int n; cout<<"Podaj liczbe studentow: "; cin>>n; Student tab[n]; for(int i=0;i<n;i++) { cout<<"Wprowadz dane studenta "<<i+1<<": "<<endl; Pobierz(tab[i]); } Ustaw_zaliczenia(tab,n); for(int i=0;i<n;i++) { cout<<"Dane studenta "<<i+1<<": "<<endl; Wypisz(tab[i]); } Wypisz_najlepszych(tab,n,3.6); system("PAUSE"); return 0; } Na początku wprowadzamy liczbę studentów i zapisujemy ją w zmiennej n: int n; cout<<"Podaj liczbe studentow: "; cin>>n; Definiujemy tablicę o nazwie tab typu Student: Student tab[n]; Wykorzystując pętlę for i funkcję Pobierz (omówiona powyŜej) wprowadzamy dane do tablicy tab: for(int i=0;i<n;i++) { cout<<"Wprowadz dane studenta "<<i+1<<": "<<endl; Pobierz(tab[i]); } Następnie wywołujemy omówioną powyŜej funkcję Ustaw_zaliczenia (z argumentami tab i n), której działanie polega na zaliczeniu (poprzez nadanie polu Semestr_zaliczony wartości true) semestru studentom posiadającym ze wszystkich przedmiotów oceny wyŜsze niŜ 2: Ustaw_zaliczenia(tab,n); Pętla: for(int i=0;i<n;i++) { cout<<"Dane studenta "<<i+1<<": "<<endl; Wypisz(tab[i]); } umoŜliwia wypisanie informacji o wszystkich elementach tablicy tab (o wszystkich studentach). Na końcu programu mamy wywołanie funkcji Wypisz_najlepszych: Wypisz_najlepszych(tab,n,3.6); Funkcja ta wypisuje informacje o studentach (których dane są zapisane w tablicy tab) posiadających średnią nie mniejszą niŜ 3.6.