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

Lekcja 11

Struktury w C++

  1. schemat
  2. deklarowanie
  3. mleczarnia
  4. rozwiązania

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:

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");
}