mgr inż. Wacław Libront * Bobowa 2019
ZSO Bobowa, ul. Długoszowskich 1, 38-350 Bobowa, tel: 0183514009, fax: 0183530221, email: sekretariat@zsobobowa.eu, www: zsobobowa.eu
Schemat struktury
W tabelach przechowujemy dane tego samego typu. A co zrobić, jeśli mamy do czynienia z typową bazodanową tabelą, w której znajdują się nazwiska i imiona, adresy z numerem domu, numerem telefonu, datą, itd. Przechowywanie takich danych w wielu tablicach jest niewygodne.
Z pomocą przychodzą struktury, które pozwalają na zorganizowanie danych w wygodniejszy sposób i które potrafią przechowywać różne typy danych. Pojedyncze elementy struktury przechowywane są w typowych tablicach.
struct nazwa{
typ zmienna;
…
};
//definicja struktury struct OSOBA{ string nip; string haslo; string urodzony; int wzrost; }; //deklaracja zmiennej strukturalnej i przypisanie OSOBA os; os.nip="738-10-10-200"; os.haslo="abrakadabra"; os.urodzony="2000-10-30"; os.wzrost=185; //zmienna i przypisanie podczas deklaracji OSOBA os1={"738-10-10-240", "mama","2000-12-12",165}; |
Deklarowanie i przypisywanie do zmiennej strukturalnej
Dane do zmiennej strukturalnej wpisujemy za pomocą „kropki”. Przypisywać możemy do pojedynczych elementów struktury lub inicjować od razu całą strukturę.
Jeżeli typową tablicę wypełnimy obiektami strukturalnymi będziemy mogli odwoływać się do poszczególnych elementów struktury poprzez indeksowanie.
Przykład ramce: do tablicy Tos z elementami struktury OSOBA wstawiamy losowo dobrany wzrost 10 osób, a następnie wypisujemy te elementy na ekranie.
//definicja struktury tablicowej OSOBA Tos[10]; for (int i=0; i < 10; i++) Tos[i].wzrost=rand()%30+150; for (int i=0; i < 10; i++) cout << Tos[i].wzrost << endl; |
Zadanie - Mleczarnia
Dyrektor mleczarni zwrócił się do Ciebie z prośbą, abyś napisał program, który będzie przechowywał fane o rolnikach i oddanym przez nich mleko do mleczarni. Przechowywać mamy następujące dane: numer rolnika (liczba całkowita), nazwa rejonu (napis), nazwisko (napis), imię(napis), datę urodzenia(napis w formacie RRRR-MM-DD), ilość litrów (liczba całkowita), zawartość tłuszczu (liczba rzeczywista) i tzw, klasę mleka (napis)
1) Zaprojektuj strukturę, w której będą przechowywane dane
2) Zadeklaruj zmienną tablicową 10-elementową i przypisz do jej pierwszych 9 elementów dane z ramki
1 Bielawa Kalisz Eugenia 1972-12-18 155 4.1 I 83 Olszyna Gora Lucyna 1971-09-13 158 3.7 II 208 Strzelin Hudzik Anna 1977-01-05 149 3.7 E 270 Czernicha Las Maria 1976-04-14 189 3.8 P 381 Brodnica Janas Jan 1976-10-15 562 3.6 II 415 Koronowo Knapik Jan 1973-08-05 323 3.8 E 457 Lipno Dynda Henryk 1974-08-22 266 3.7 I 515 Radomin Wojna Jacek 1971-09-03 108 3.6 I 636 Pruszcz Mika Zofia 1973-07-13 125 3.8 I 828 Wysokie Janik Dorota 1974-01-29 558 3.5 I |
3) Do ostatniego elementu tablicy wpisz dane z klawiatury (ostatni wiersz z ramki)
4) Wypisz na ekranie nazwiska, imiona i oddane litry wszystkich rolników
5) Policz sumaryczną liczbę oddanych litów mleka
6) Wylicz średnią zawartość tłuszczu w mleku
7) Wylicz średnią ważoną tłuszczu w mleku według wzoru: ważona=(suma iloczynów litry*tłuszcz) / (suma litrów)
8) Wylicz wypłatę dla każdego rolnika (oraz łączną) jeżeli:
za każdy litr rolnik otrzymuje 1.15 zł
jeżeli oddał ponad 150 litrów mleka, to do każdego litra otrzymuje 0,5 zł dopłaty
jeżeli mleko zawiera mniej niż 3.8 tłuszczu, to do każdego litra otrzymuje 0,4 zł dopłaty
jeżeli klasa mleka jest równa „E” lub „I”, to do każdego litra otrzymuje 0,3 zł dopłaty
9) Zapisz tablicę z danymi do pliku tekstowego, a następnie odczytaj ją i wypisz wyniki na ekranie
10) Wypisz na ekranie nazwiska i imiona rolników, którzy urodzili się we wrześniu
11) Policz litry mleka osobno dla kobiet i mężczyzn (imiona kobiet kończą się na „a”)
Przykładowe rozwiązania zadań
Jedynie ciężka umysłowa praca i zrozumienie działania
programu może nauczyć programowania!
//zadanie 1 struct MLEKO{ int num; string rej; string naz; string imi; string uro; int lit; double tlu; string kla; }; |
//zadanie 2 MLEKO Tml[10]; Tml[0]={1, "Bielawa", "Kalisz", "Eugenia", "1972-12-18", 155, 4.1, "I"}; Tml[1]={83, "Olszyna", "Gora", "Lucyna", "1971-09-13", 158, 3.7, "II"}; Tml[2]={208, "Strzelin", "Hudzik", "Anna", "1977-01-05", 149, 3.7, "E"}; Tml[3]={270, "Czernicha", "Las", "Maria", "1976-04-14", 189, 3.8, "P"}; Tml[4]={381, "Brodnica", "Janas", "Jan", "1976-10-15", 562, 3.6, "II"}; Tml[5]={415, "Koronowo", "Knapik", "Jan", "1973-08-05", 323, 3.8, "E"}; Tml[6]={457, "Lipno", "Dynda", "Henryk", "1974-08-22", 266, 3.7, "I"}; Tml[7]={515, "Radomin", "Wojna", "Jacek", "1971-09-03", 108, 3.6, "I"}; Tml[8]={636, "Pruszcz", "Mika", "Zofia", "1973-07-13", 125, 3.8, "I"}; |
//zadanie 3 cout << "WPISZ" << endl; cout << "numer:"; cin >> Tml[9].num; cout << "rejon:"; cin >> Tml[9].rej; cout << "nazwisko:"; cin >> Tml[9].naz; cout << "imię:"; cin >> Tml[9].imi; cout << "datę urodzenia RRRR-MM-DD:"; cin >> Tml[9].uro; cout << "ilość litrów:"; cin >> Tml[9].lit; cout << "zawartość tłuszczu:"; cin >> Tml[9].tlu; cout << "klasę:"; cin >> Tml[9].kla; |
//zadanie 4 for (int i=0; i < 10; i++){ cout.width(10); cout << Tml[i].naz; cout.width(10); cout << Tml[i].imi; cout.width(5); cout << Tml[i].lit << endl; } |
//zadanie 5 int suma=0; for (int i=0; i < 10; i++){ suma=suma+Tml[i].lit; } cout << "SUMA litrów=" << suma << endl; |
//zadanie 6 double tlu=0; for (int i=0; i < 10; i++){ tlu=tlu+Tml[i].tlu; } cout << "ŚREDNIA tłuszczu=" << tlu/10 << endl; |
//zadanie 7 double lit=0; double sum=0; for (int i=0; i < 10; i++){ lit=lit+Tml[i].lit; sum=sum+Tml[i].lit * Tml[i].tlu; } double waz=sum/lit; cout << "ŚREDNIA ważona tłuszczu=" << waz << endl; |
//zadanie 8 cout << "WYPŁATA" << endl; for (int i=0; i < 10; i++){ double L=Tml[i].lit; double dop0=L*1.15; double dop1=0; if (L > 150) dop1=L*0.5; double dop2=0; if (Tml[i].tlu < 3.8) dop2=L*0.4; double dop3=0; if (Tml[i].kla == "E" || Tml[i].kla == "I") dop3=L*0.3; double wyp=dop0+dop1+dop2+dop3; cout.width(10); cout << Tml[i].naz; cout.width(10); cout << Tml[i].imi; cout << fixed << setprecision(2); cout.width(10); cout << wyp << endl; } |
//zadanie 9 ofstream Po("zadanie.txt"); for (int i=0; i < 10; i++){ Po << Tml[i].num << " "; Po << Tml[i].rej << " "; Po << Tml[i].naz << " "; Po << Tml[i].imi << " "; Po << Tml[i].uro << " "; Po << Tml[i].lit << " "; Po << Tml[i].tlu << " "; Po << Tml[i].kla << endl; } Po.close(); ifstream Pi("zadanie.txt"); string w; while (!Pi.eof()){ getline(Pi,w); cout << w << endl; } Pi.close(); |
//zadanie 10 cout << "WRZESIEŃ" << endl; for (int i=0; i < 10; i++){ string ur=Tml[i].uro; string mi=ur.substr(5,2); if (mi == "09") cout << mi << " " << Tml[i].naz << " " << Tml[i].imi << endl; } |
//zadanie 11 cout << "PŁEĆ-MLEKO" << endl; int liM=0; int liK=0; for (int i=0; i < 10; i++){ string im=Tml[i].imi; int dl=im.length(); if (im[dl-1] == 'a') liK=liK+Tml[i].lit; else liM=liM+Tml[i].lit; } cout << "M " << liM << endl; cout << "K " << liK << endl; |
//SZABLON #include <iostream> //cout #include <iomanip> //fixed #include <stdlib.h> //rand() #include <ctime> //time #include <fstream> //ofstream using namespace std; int main(){ setlocale(LC_ALL, ""); srand(time(NULL)); //ustawienie generatora system("pause"); } |