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.