PRG Lab 15

Struktury

Jak wymyślę podtytuł, to go tu umieszczę


Jak wszyscy zapewne pamiętają, tablice przechowują wiele powiązanych ze sobą zmiennych jednego typu. Co jednak w sytuacji, w której z jakiegokolwiek powodu chcielibyśmy przechowywać kilka powiązanych ze sobą zmiennych różnych typów? Załóżmy, że chcielibyśmy przetwarzać w naszym programie informacje o samochodzie, jego markę, model, rocznik i pojemność silnika. Oczywiście możemy to zrobić w ten sposób:

int main(){
    string marka = "Skoda";
    string model = "Karoq";
    int rocznik = 2023;
    double silnik = 1.5;
return 0; }

Ale to niesie za sobą kilka konsekwencji – co musielibyśmy zrobić w sytuacji, w której mielibyśmy do opisania w programie więcej niż jeden samochód? Kolejne 4 zmienne, czyli z naszego kodu tworzymy śmietnisko. Dużo elegantszym rozwiązaniem będzie zastosowanie struktury. Struct pozwala w ramach jednej dużej zmiennej przechowywać więcej zmiennych, porządkując wszystko. Pozwoli też na deklarowanie wielu szerokich zmiennych o takiej samej strukturze:

struct { 
string marka;
string model;
int rocznik;
double silnik;
} myVehicle;
    myVehicle.marka="Skoda";
    myVehicle.model="Karoq";
    myVehicle.rocznik=2023;
    myVehicle.silnik=1.5;
    cout<<myVehicle.marka<<" "<<myVehicle.model<<" "
<<myVehicle.rocznik<<" "<<myVehicle.silnik;
    return 0;

W powyższym przykładzie tworzymy schemat struktury, czyli określamy, jakie cechy będzie miała tworzona zmienna. W tym wypadku 2 stringi opisujące markę i model, integer określający rocznik i double przechowujący informację o pojemności silnika. Deklarację struktury zakończyć należy średnikiem, ale przed nim umieściłem jeszcze nazwę zmiennej, do której się będę odnosił. To jest tzw. Unnamed struct. Stworzyliśmy teraz zmienną o nazwie myVehicle, która przechowuje 4 zmienne. Aby odwołać się konkretnie do tych pól musimy skorzystać z kropki – Jeśli chcemy odnieść się do pola „marka” struktury myVehicle napiszemy:

myVehicle.marka="Skoda";

Możemy też zadeklarować wszystko naraz:

struct{
string marka;
string model;
int rocznik;
double silnik;
} myVehicle={"Skoda","Karoq", 2023, 1.5};

Można tworzyć od razu kilka zmiennych, jeżeli jednej struktury potrzebować będziemy kilkukrotnie:

    double silnik;      // - deklaracja układu struktury
} myVehicle, myVehicle2, myVehicle3;

Osobiście preferowaną przeze mnie opcją są struktury nazwane. W tym wypadku tworzymy de facto nowy typ danych, który składać się będzie z określonych w strukturze pól. W ten sposób, zamiast dla trzech pojazdów deklarować 12 zmiennych deklarujemy tylko 4:

struct car{
        string marka;
        string model;
        int rocznik;
        double silnik;
};
    car myVehicle={"Skoda","Karoq", 2023, 1.5};
    car dadsVehicle={"Citroen", "C5 Aircross", 2019, 2.0};
    cout<<myVehicle.marka<<" "<<myVehicle.model<<"
"<<myVehicle.rocznik<<" "<<myVehicle.silnik<<endl;
    cout<<dadsVehicle.marka<<" "<<dadsVehicle.model<<"
"<<dadsVehicle.rocznik<<" "<<dadsVehicle.silnik<<endl;

Takie zastosowanie, czyli nowa zmienna pozwala nam pójść o kroczek dalej i utworzyć tablicę pojazdów

struct car{
        string owner;
        string make;
        string model;
        int year;
        double engine;
};
    car hylaVehicles[3] = {
        {"Michał", "Skoda","Karoq",2023, 1.5},
        {"Dad", "Citroen", "C5 Aircross", 2019, 2.0},
        {"Mom","Toyota","Yaris", 2018, 1.5}
        };
    for (int i=0; i<3;i++){
        cout<<hylaVehicles[i].owner<<" "
<<hylaVehicles[i].make<<" "<<hylaVehicles[i].model<<" "
<<hylaVehicles[i].year<<" "<<hylaVehicles[i].engine<<" "
<<endl;
}
return 0;

Zadania do laboratorium

  1. Napisz program, który będzie przechowywał informacje o ocenach studentów z jednej grupy z przedmiotu PRG. Każdy student ma predefiniowane imię i nazwisko oraz swój numer indeksu. Program powinien zapytać użytkownika po kolei o ocenę każdego studenta, a następnie wydrukować zestawienie wszystkich ocen w formacie nr_indeksu: ocena s14616: 2.0 s2137: 3.5 Oraz średnią wszystkich ocen za przedmiot. Studentów jest 10;

  2. Zdefiniuj strukturę Samochod, zawierającą pola:

    • marka (łańcuch znaków),
    • model (łańcuch znaków),
    • rokProdukcji (liczba całkowita). Następnie program powinien:
    • Wczytać liczbę samochodów n (np. do 10).
    • Wczytać dane o każdym samochodzie do tablicy struktur.
    • Wyświetlić wszystkie wprowadzone samochody.
    • Policzyć, ile samochodów zostało wyprodukowanych po roku 2000 i wyświetlić tę liczbę.
    • Znaleźć najstarszy samochód (z najmniejszym rokProdukcji) i wypisać jego markę i model.