Forum: Inmantning dynamisk vektorstruktur, hur?

Forum huvudsida -> Programmering -> Inmantning dynamisk vektorstruktur, hur?

Sidor: 1

Till botten

Just1ce 20:17 - 24:e Juli 2007 | Post #1
Medlem
Inlägg: 15


Skicka PM
  1. #include <iostream>
  2. struct bil {
  3. std::string namn;
  4. int tillverkningsaar; };
  5. int main() {
  6. using namespace std;
  7. cout << "Hur många bilar vill du katalogisera? ";
  8. int katalogisera;
  9. cin >> katalogisera;
  10. cin.get();
  11. bil *Bil = new bil [katalogisera];
  12. for(int count = 0; count <= katalogisera; count++) {
  13. cout << "Skriv in bil att katalogisera: ";
  14. cin.get(Bil->namn[count]).get();
  15. cout << "Skriv in årsmodell för katalogiserad bil: ";
  16. cin >> Bil[count].tillverkningsaar;
  17. }
  18. cout << "nnn";
  19. for(int count = 0; count <= katalogisera; count++) {
  20. cout << "Bil nummer " << count + 1 << " är: " <<(Bil->namn[count]);
  21. cout << Bil[count].tillverkningsaar;
  22. }
  23. delete [] Bil;
  24. system("PAUSE");
  25. return 0;
  26. }


När jag skriver in namnet på den första bilen hoppar programmet över resten av inmatningen.

Blir även problem vid utmatning.

-------------------------
Ingen signatur!

Senast redigerad 21:26 - 24:e Juli 2007


Nissebosselasse 21:58 - 24:e Juli 2007 | Post #2
Medlem
Inlägg: 490


Skicka PM
Använd std::getline istället för cin.get. cin.get hämtar endast ett tecken.

Du använder vektorn fel: Bil->namn[count], när det är Bil[count].namn som du vill använda. Det är ju Bil som du har gjort flera instanser av (rad 14).

for-looparna: tänk på att listor är noll-indexerade (dvs de börjar på noll, inte ett). Därför är:
for(int count = 0; count <= katalogisera; count++)
...fel, eftersom du ska kolla om count är mindre än katalogisera (count < katalogisera). Du ska gå från noll till antal-1.

Här är en reviderad version. Notera att jag även lagt till #include <string>, eftersom du använder den klassen.
  1.  
  2. #include <iostream>
  3. #include <string>
  4.  
  5. struct bil {
  6. std::string namn;
  7. int tillverkningsaar;
  8. };
  9.  
  10. int main() {
  11. std::cout << "Hur många bilar vill du katalogisera? ";
  12.  
  13. int katalogisera;
  14. std::cin >> katalogisera;
  15.  
  16. std::cin.get();
  17.  
  18. bil *Bil = new bil [katalogisera];
  19.  
  20. for(int count = 0; count < katalogisera; count++) {
  21. std::cout << "Skriv in bil att katalogisera: ";
  22. //cin.get(Bil->namn[count]).get();
  23. std::getline (std::cin, Bil[count].namn);
  24.  
  25. std::cout << "Skriv in årsmodell för katalogiserad bil: ";
  26. std::cin >> Bil[count].tillverkningsaar;
  27.  
  28. std::cin.ignore (255, '\n');
  29. }
  30.  
  31. std::cout << "\n\n";
  32.  
  33. for(int count = 0; count < katalogisera; count++) {
  34. std::cout << "Bil nummer " << count + 1 << " är: " << Bil[count].namn << ' ';
  35. std::cout << Bil[count].tillverkningsaar << '\n';
  36. }
  37.  
  38. delete [] Bil;
  39.  
  40. system("PAUSE");
  41.  
  42. return 0;
  43. }

För att inte inmatningen ska hoppa över någonting, la jag till cin.ignore (läs mer om det här: http://www.blinkenlights.se/forum/topic7/page1/ - bläddra ner till C++ FAQ).

Dessutom har jag tagit bort using namespace std, vilket är en ful ovana! Det tar inte så fruktansvärt lång tid att skriva std:: framför.

-------------------------
http://pushingcows.se
Gula Nallen



Just1ce 13:35 - 25:e Juli 2007 | Post #3
Medlem
Inlägg: 15


Skicka PM
Tack för hjälpen. Funkar nu.
Slarvfel att använda <= istället för < och att glömma tömma inmatningsbuffert. Hade för mig att cin.get() funkade med stringar/vektorer också.

Varför bör jag använda std:: instället för using namespace std?
Vad är det för skillnad på struct->member och struct.member?

-------------------------
Ingen signatur!



Nissebosselasse 17:26 - 26:e Juli 2007 | Post #4
Medlem
Inlägg: 490


Skicka PM
Using namespace std, läs mer här:
http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5

Först megakort om pekare:
  1.  
  2. int i = 666;
  3. int *pi = &i; // pi pekar nu på i
  4.  
  5. // Om vi bara använder pi, så får vi adressen till i.
  6. // För att få fram värdet (det som pi pekar på), måste
  7. // vi "avreferensera" pekaren med en asterisk:
  8. int o = *pi;
  9. // o har nu värdet 666, dvs det som pi pekade på


Operatorn -> finns till för att man ska slippa använda asterisken (*) för att få fram det som pekaren pekar på. Tänk dig att du i en funktion vill ändra värdet hos ett objekt. Du skickar då med adressen till funktionen, exempel:
  1.  
  2. struct car {
  3. int wheels;
  4. int windows;
  5. };
  6.  
  7. // Tar en pekare till en car-struktur
  8. void changeWheels (car *pcar)
  9. {
  10. }

Vår changeWheels-funktion måste nu avreferensera pcar för att få fram vilket objekt det är i minnet som vi pekar på. Vi kan göra detta på två sätt: antingen med pilen (->), eller med asterisken (*):
  1.  
  2. // Tar en pekare till en car-struktur
  3. void changeWheels (car *pcar)
  4. {
  5. // Pilen
  6. pcar->wheels = 4;
  7.  
  8. // Asterisken. Märk här att vi använder
  9. // punkten efter, eftersom vi har fått fram
  10. // ett "riktigt" objekt vid avreferenseringen:
  11. // pcar = pekare-till-car
  12. // *pcar = en car-struktur
  13. (*pcar).wheels = 4;
  14. }

Det är även fullt möjligt att använda indexering, även om pekaren bara pekar på ett objekt (läs stycket här nere så förstår du förhoppningsvis):
  1.  
  2. // Tar en pekare till en car-struktur
  3. void changeWheels (car *pcar)
  4. {
  5. // Lite extremare kanske, tar fram det
  6. // nollte objektet (det som kommer innan det första),
  7. // och avreferensera det, varför vi kan använda
  8. // punkten
  9. pcar[0].wheels = 5;
  10.  
  11. // Ovanstående är lika med:
  12. (*(pcar + 0)).wheels = 5;
  13. }


En vektor (array) är egentligen en pekare. När du använder ett index så avreferenserar du det som ligger n-antal objekt från det första i vektorn.
Här följer ett kanske rörigt exempel:
  1.  
  2. #include <iostream>
  3.  
  4. struct car {
  5. int wheels;
  6. int windows;
  7. };
  8.  
  9. int main ()
  10. {
  11. car my_cars[5];
  12.  
  13. my_cars[0].wheels = 666;
  14. my_cars[2].wheels = 5;
  15. std::cout << "Antal hjul: " << my_cars[2].wheels << '\n';
  16.  
  17. // Titta på objektet två steg bort från början,
  18. // och avreferensera det (samma som ovan, alltså)
  19. (*(my_cars + 2)).wheels = 4;
  20. std::cout << "Antal hjul: " << (*(my_cars + 2)).wheels << '\n';
  21.  
  22. // Hämta den första bilen.
  23. // Samma som my_cars[0], d.v.s. (*(my_cars + 0))
  24. car the_first_car = *my_cars;
  25. std::cout << "Den första bilen har " << the_first_car.wheels << " hjul.\n";
  26. }


-------------------------
http://pushingcows.se
Gula Nallen



Sidor: 1

Forum huvudsida -> Programmering -> Inmantning dynamisk vektorstruktur, hur?
Atom feed

Du får inte posta i den här tråden | Till toppen