Problem z zadaniem domowym

0

Otóż mam problem z zadaniem ze struktur. Polecenie:
Napisz program, w którym zadeklarujesz tablicę struktur przelot zawierających następujące pola:
trasa - określenie, dokąd leci samolot(na przykład Warszawa - Londyn),
cena - cena jednego biletu na określony przelot samolotem,
ilosc - długość trasy przelotu ( w kilometrach),
czas - czas przelotu samolotem na danej trasie ( w godzinach),
linia - nazwa linii lotniczej.
Typy pól należy określić samodzielnie.
W programie należy podać maksymalny rozmiar tablicy struktur jako stałą oraz wprowadzić z klawiatury aktualną liczbę struktur, nie większąod ustalonego maksimum.
Program powinien wykonywać następujące operacje:
a) wczytanie danych z klawiatury do tablicy struktur,
b)wypisywanie na ekranie wczytanych danych;
c) wypisywanie trasy i ceny dla wszystkich przelotów;
d) obliczanie średnie ceny wszystkich biletów na przelot samolotem;
e) obliczenie ceny przelotu samolotem za 1 km dla pierwszego wczytanego przelotu;
f) wypisywanie wszystkich tras, których czas przelotu nie przekracza dwóch godzin oraz nazwa linii lotniczej rozpoczyna się literą 'L'.

Problem w tym, że gdy wprowadzi się do zmiennej maxi - 5, to niby się wszystko zainicjowało, ale potem podczas wypisywania danych wychodzą kosmiczne liczby.
Drugim problemem jest, że podczas wpisywania danych do tablicy, po czasie od razu przeskakuje do trasy i nie można wpisać linii.
Z góry dzięki za każdą odpowiedź.
Mój kod:

#include <iostream>

using namespace std;

int main()
{
    struct przelot
    {
        string trasa;
        double cena;
        int ilosc;
        int czas;
        string linia;
    };
    int maxi;
    cout<<"Podaj ilosc lotow ile chcesz wprowadzic(1-5): "<<endl;
    cin>>maxi;
    if (maxi>5 || maxi<1)
    {
        cout<<"Nieprawidlowa wartosc! Program zakonczy teraz swoje dzialanie."<<endl;
        return 0;
    }
//A
    cin.get();
    cout<<"a) "<<endl;
    cin.get();
    cout<<"Wczytanie danych..."<<endl;
    przelot tab[maxi];
    if (maxi==5) //jesli wielkosc tablicy wynosi 5 to nie trzeba podawac danych z klawiatury
    {
        przelot tab[5]=
        {
            {"Warszawa-Krakow",790.30,200,2,"PLL LOT"},
            {"Londyn-Dubaj",3000.50,1000,9,"Emirates Airline"},
            {"Kuwejt-Hong Kong",2500.30,500,6,"Hong Kong Airlines"},
            {"Warszawa-Bangkok",1400.20,600,1,"Lufthansa"},
            {"Praga-Hanoi",2100.60,700,8,"KLM"},
        };
    }
    else
    {
        for (int i=0; i<maxi ; i++)
        {
            cout<<"Podaj trase: "<<endl;
            getline(cin,tab[i].trasa);
            cout<<"Podaj cene: "<<endl;
            cin>>tab[i].cena;
            cout<<"Podaj dlugosc trasy: "<<endl;
            cin>>tab[i].ilosc;
            cout<<"Podaj czas przelotu: "<<endl;
            cin>>tab[i].czas;
            cout<<"Podaj nazwe linii lotniczej: "<<endl;
            getline(cin,tab[i].linia);
            cout<<endl;
        }
    }
//B
    cin.get();
    cout<<"b) "<<endl;
    cin.get();
    cout<<"Wypisanie danych..."<<endl;
    for (int i=0; i<maxi; i++)
    {
        cout<<"Dane "<<i+1<<" lotu:"<<endl;
        cout<<tab[i].trasa<<endl;
        cout<<tab[i].cena<<endl;
        cout<<tab[i].ilosc<<endl;
        cout<<tab[i].czas<<endl;
        cout<<tab[i].linia<<endl;
        cout<<endl;
    }
//C
    cin.get();
    cout<<"c) "<<endl;
    cin.get();
    for (int i=0; i<maxi; i++)
    {
        cout<<"Trasa i cena "<<i+1<<" przelotu: "<<endl;
        cout<<tab[i].trasa<<endl;
        cout<<tab[i].cena<<endl;
        cout<<endl;
    }
//D
    cin.get();
    cout<<"d) "<<endl;
    cin.get();
    double srednia=0.0;
    for (int i=0; i<maxi; i++)
    {
        srednia+=tab[i].cena;
    }
    srednia=srednia/maxi;
    cout<<"Srednia cena wszystkich lotow wynosi: "<<srednia<<endl;
//E
    cin.get();
    cout<<"e) "<<endl;
    cin.get();
    double cena1=tab[0].cena/tab[0].ilosc;
    cout<<"Cena przelotu za 1 km dla 1 przelotu wynosi: "<<cena1<<endl;
//F
    cin.get();
    cout<<"f) "<<endl;
    cin.get();
    for (int i=0; i<maxi; i++)
    {
        if (tab[i].czas<=2 && tab[i].linia.at(0)=='L')
            cout<<tab[i].trasa;
    }
    return 0;
}
1

W C++ nie ma VLA tak jak chcesz zrobić tutaj przelot tab[maxi]; Użyj klasy std::vector. Poza tym tych cin.get(); stanowczo za dużo i niepotrzebnie porobiłeś.

W ogóle powiem, Ci że robisz tutaj straszne cuda:

  • W tym miejscu np. przelot tab[5] tworzysz tablicę, z którą dalej już niczego nie zrobisz, bo po wyjściu z zakresu jej obiekt przestanie istnieć. Myślisz pewnie, że tutaj wpisujesz dane do oryginału ale nic podobnego. To jest całkiem nowy obiekt, który nie istnieje kiedy chcesz odczytać z niego dane. Dlatego Ci nie działa i masz krzaczki.
  • Ładujesz do main całą logikę aplikacji, zamiast podzielić to na części i powrzucać do funkcji.
  • Używasz magic-numbers np. tutaj przelot tab[5]. Co to jest to pięć? To nic nie znaczy. Powinna tutaj być zmienna, abstrahując od tego, że w C++ to nieprawidłowy zapis.
  • endl używasz tyle samo co wcześniej tych cin.get()'ów. Niepotrzebnie, bo wystarczy zwykłe \n na końcu łańcucha.
  • Na poziomie akademickim można by się doczepić używania i++ zamiast ++i przez to niepotrzebnie powstaje kopia obiektu i. https://stackoverflow.com/questions/484462/difference-between-i-and-i-in-a-loop

1 użytkowników online, w tym zalogowanych: 0, gości: 1