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

Rozwiązanie ćwiczenia dotyczącego tworzenia struktur C++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
935 wizyt
pytanie zadane 24 lutego 2018 w Rozwój zawodowy, nauka, praca przez Archeon Początkujący (480 p.)
edycja 25 lutego 2018 przez ScriptyChris

Witam, jestem w trakcie czytania i przerabiania ksiązki od Stephen'a Prata i utknąłem na tym zadaniu..

Zaprojektuj strukturę car zawierającą następujące informacje o samochodzie: markę jako tablicę znakową lub obiekt string, rok budowy jako liczbę całkowitą. Napisz program który spyta użytkownika o liczbę katalogowanych aut. Następnie za pomocą operatora new stwórz dynamiczną tablice struktur car, poproś użytkownika o podanie marki (może mieć więcej niż jedno słowo) oraz o rok. Należy zachować tu ostrożność, gdyż na zmianę odczytujemy łańcuchy znakowe i liczby. Na koniec wyświetl zawartości wszystkich struktur. Oto przykładowy przebieg sesji z programem:

 

Ile samochodów chcesz skatalogować? 2
Samochód #1:
Proszę podać markę: Hudson Hornet
Rok produkcji: 1952
Samochód #2:
Proszę podać markę: Kaiser
Rok produkcji: 1951
1952 Hudson Hornet
1951 Kaiser

Mój kod :

#include <iostream>
#include <string>
using namespace std;




int main(int argc, char** argv) {
	int i;
	
	struct car {
		string marka;
		int rok_budowy;
	};
	
	int ile_razy;
	
	cout<<"Ile razy chcesz wpisać ? \n";
	cout<<"Podaj liczbe : ";
	cin>>ile_razy;
	car * ps = new car[ile_razy];
	for(i = 0; i < ile_razy; i++){
		cout<<"Podaj marke samochodu : \n";
		cin>>ps->marka;
		cout<<"Podaj rok budowy : \n";
		cin>>ps->rok_budowy;
		
	}
for (i = 0; i< ile_razy; i++){
	cout<<"Samochod #"<<car;
}
	
	return 0;
}

Możecie mi pomóc ?

1 odpowiedź

0 głosów
odpowiedź 25 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

poproś użytkownika o podanie marki (może mieć więcej niż jedno słowo) 

Czyli innymi słowy użyj std::getline.

Wskaźnik ps wskazuje na tablicę, a nie pojedynczy element. Więc zamiast 

ps->marka

ma być

ps[i].marka

 

komentarz 25 lutego 2018 przez Archeon Początkujący (480 p.)

Zmienione, co dalej ? 

#include <iostream>
#include <string>
using namespace std;




int main(int argc, char** argv) {
	int i;
	
	struct car {
		string marka;
		int rok_budowy;
	};
	
	int ile_razy;
	
	cout<<"Ile razy chcesz wpisać ? \n";
	cout<<"Podaj liczbe : ";
	cin>>ile_razy;
	car * ps = new car[ile_razy];
	for(i = 0; i < ile_razy; i++){
		cout<<"Podaj marke samochodu : \n";
		getline(cin,ps[i].marka);
		cout<<"Podaj rok budowy : \n";
			cin>>ps[i].rok_budowy;
		
	}

	return 0;
}

 

komentarz 25 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Należy zachować tu ostrożność, gdyż na zmianę odczytujemy łańcuchy znakowe i liczby.

Po wczytaniu liczby całkowitej operatorem >> w strumieniu wejściowym zostaje znak '\n', którego należałoby się pozbyć przed wczytywaniem getlinem. Przez to, że teraz tego nie robisz "przeskakuje" tego getline'a i przechodzi do roku budowy.

komentarz 25 lutego 2018 przez Archeon Początkujący (480 p.)
Jak się go pozbyć ?
komentarz 25 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
cin.ignore() przed getlinem.
komentarz 25 lutego 2018 przez Archeon Początkujący (480 p.)

Program działa, ale na samym końcu wywala błąd :/ 

#include <iostream>
#include <string>
using namespace std;




int main(int argc, char** argv) {
	int i;
	
	struct car {
		string marka;
		int rok_budowy;
	};
	
	int ile_razy;
	
	cout<<"Ile razy chcesz wpisac? \n";
	cout<<"Podaj liczbe : ";
	cin>>ile_razy;
	cout<<endl;
	car * ps = new car[ile_razy];
	
	
	for(i = 0; i < ile_razy; i++){
		cout<<"Podaj marke samochodu : ";
		cin.ignore() ;
		getline(cin, ps[i].marka);
		cout<<endl;
		
		cout<<"Podaj rok budowy : \n";
			cin>>ps[i].rok_budowy;
	}

for(int i=0;i<ile_razy; i++)
{
cout << ps[i].marka << " " << ps[i].rok_budowy << endl;
}
delete ps;


	return 0;
}

 

komentarz 25 lutego 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Źle zwalniasz pamięć. Alokowałeś tablicę, nie pojedynczy element.
komentarz 25 lutego 2018 przez Archeon Początkujący (480 p.)
Dziękuję za pomoc :)

Podobne pytania

0 głosów
0 odpowiedzi 166 wizyt
0 głosów
1 odpowiedź 412 wizyt
pytanie zadane 24 lutego 2017 w C i C++ przez Dooky Początkujący (480 p.)

93,430 zapytań

142,427 odpowiedzi

322,652 komentarzy

62,793 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

...