• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd w programie

0 głosów
450 wizyt
pytanie zadane 16 października 2017 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam pisałem program który ma wpisać ilość samochodów skatalogowania, następnie wypisać ich dane(nazwe, i rok produkcji). Szukam błędu w pętli.

#include <iostream>

int main()
{
    struct salon
    {
        char nazwa[25];
        int rok;
    };

    int ilosc;
    std::cout << "Ile samochodow do skatalogowania: ";
    std::cin >> ilosc;
    salon car;
    for(int i=0; i < ilosc; i++)
        {
            std::cin.get(car.nazwa, i);
            std::cin >> car.rok;
        }//for

    std::cout << "Marka: "<< car.nazwa[25] << "\nRok produkcji: " << car.rok << std::endl;
    std::cin.get();
    return 0;
}

 

5 odpowiedzi

+1 głos
odpowiedź 16 października 2017 przez Patryk Krajewski Nałogowiec (26,170 p.)
Na początek tworzysz obiekt car, potem kilka razy coś do niego przypisujesz, a następnie wypisujesz 25 znak jego nazwy. Przemyśl ten kod. I używaj std::string zamiast tablicy charów
+1 głos
odpowiedź 16 października 2017 przez Dexterim Dyskutant (8,370 p.)
Deklaracje struktury powinieneś raczej wyrzucić poza maina. Popatrz jak działa u Cb funkcja cin::get(gdzie ma wstawić, ile znaków) w Twoim przypadku zaczynasz od 0. Poza tym jesli chcesz miec kilka samochodów to musisz utworzyć tablice struktur. W innym przypadku caly czas nadpisujesz to co miałes. Dalej idąc poza petla chcesz wyprintowac car.nazwa[25] co jest wyjściem poza tablice.
+1 głos
odpowiedź 16 października 2017 przez obl Maniak (51,300 p.)

Chcesz wczytać ileś tam samochodów do bazy danych a tworzysz miejsce tylko na jeden rekord tej bazy:

salon car;

To po pierwsze, po drugie nie rozumiesz najwyraźniej jak działa ta linijka:

std::cin.get(car.nazwa, i);

pierwszy argument metody get to zmienna, do której wczytane zostaną dane wpisane z klawiatury przez użytkownika. Natomiast i w tym przypadku oznacza ilość wczytanych znaków.

Poza tym w tej pętli ciągle nadpisujesz jeden i ten sam rekord co delikatnie mówiąc nie ma sensu.

Powinieneś utworzyć albo dynamicznie tablicę struktur salon albo wykorzystać kontener vector.

+1 głos
odpowiedź 17 października 2017 przez obl Maniak (51,300 p.)
edycja 17 października 2017 przez obl

To spróbuj tak:

#include <iostream>
#include <string>
 
struct salon
    {
        std::string nazwa;
        int rok;
    };
 
int main()
{
    int ilosc;
    std::cout << "Ile samochodow do skatalogowania: ";
    std::cin >> ilosc;
    salon * car = new salon[ilosc];
    for(int i=0; i < ilosc; i++)
        {
            std::cout << "\nPodaj marke: ";
			std::cin.ignore(1);
            //std::cin >> car[i].nazwa;    // dziala poprawnie
            std::getline(std::cin, car[i].nazwa); //nie mozna wpisac danych
            std::cout << "Podaj rok produkcji: ";
			std::cin >> car[i].rok;
        }//for
    std::cout << std::endl;
    for(int i=0; i < ilosc; i++)
        std::cout << "Marka: "<< car[i].nazwa << "\nRok produkcji: " << car[i].rok << std::endl;
	std::cin.ignore(1);
    std::cin.get();
    return 0;
}

Bo łapie ci ten znak nowej linii, więc go z bufora usuwasz za pomocą cin.ignore(1)

Zapomniałem dodać, że na koniec ładnie by było pamiętać o zwolnieniu dynamicznie przydzielonej pamięci.

komentarz 17 października 2017 przez Sic Dyskutant (8,510 p.)
Dziękuję nie znałem tej metody.

Tak zrobiłem zupełnie o tym zapomniałem.
0 głosów
odpowiedź 17 października 2017 przez Sic Dyskutant (8,510 p.)

Poprawiłem program według wytycznych. Dziękuję bardzo. Wszystko działa poprawnie, jednak przy wpisywaniu danych za pomocą std::cin, próbowałem zrobić to za pomocą std::cin.get() lub std::getline(), program nie pozwala na wpisanie tekstu. Dlaczego ?.


#include <iostream>
#include <string>

struct salon
    {
        std::string nazwa;
        int rok;
    };

int main()
{
    int ilosc;
    std::cout << "Ile samochodow do skatalogowania: ";
    std::cin >> ilosc;
    salon * car = new salon[ilosc];
    for(int i=0; i < ilosc; i++)
        {
            std::cout << "\nPodaj marke: ";
            std::cin >> car[i].nazwa;    // dziala poprawnie
            //std::getline(std::cin, car[i].nazwa); //nie mozna wpisac danych
            std::cout << "Podaj rok produkcji: ";
            std::cin >> car[i].rok;
        }//for
    std::cout << std::endl;
    for(int i=0; i < ilosc; i++)
        std::cout << "Marka: "<< car[i].nazwa << "\nRok produkcji: " << car[i].rok << std::endl;
    std::cin.get();
    return 0;
}
komentarz 17 października 2017 przez Huberti Gaduła (4,500 p.)

Ponieważ kod 

std::cin >> car[i].nazwa;

zostawia po sobie znak nowego wiersza, a linijka 

std::getline(std::cin, car[i].nazwa);

go wczytuje. Powinieneś wczytać ten znak np. za pomocą cin.get ();

komentarz 17 października 2017 przez Sic Dyskutant (8,510 p.)

próbowałem już tym sposobem:

std::cin.get(car[i].nazwa,25);

jednak cały czas pokazuje mi błąd sprawdzałem co on oznacza i dotyczy to parametrów.

komentarz 17 października 2017 przez Huberti Gaduła (4,500 p.)
std::cin.get(car[i].nazwa,25);

cin.get() pobiera zmienne typu char, a ty masz zdefiniowaną string. Musiałbyś zamienić zmienną nazwa na tablicę znaków. Ewentualnie możesz zapisać to tak:

std::cin>>nazwa;

lub jeżeli chcesz pobrać całą linię:

std::getline(cin,nazwa);

 

Podobne pytania

0 głosów
2 odpowiedzi 302 wizyt
pytanie zadane 27 listopada 2017 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
0 odpowiedzi 867 wizyt
pytanie zadane 30 kwietnia 2017 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 649 wizyt

93,599 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,082 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...