C++ Einkaufsliste aber wie?



  • [/code]

    Belli schrieb:

    nimda4 schrieb:

    Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein.

    Deine 'Liste' ist keine Liste, sondern ein Vektor. Und wenn der zwei Einträge hat, dann haben diese die Indizes 0 und 1.

    Hab ich gerade auch festgestellt und wollte es posten da sah ich deinen Post xD

    Ich danke dir trotzdem 🙂

    Ich habe noch eine Frage.
    Wie kann ich bei folgender Funktion dafür Sorgen das die Abstände die ich mit <<" " gemacht habe automatisch erstellen alssen je nach dem wie lang der string ist?

    [code]
        for(unsigned int i = 0 ; i<liste.Liste.size();i++) 
        cout << i <<"    " << liste.Liste[i].Name <<"      " << liste.Liste[i].Dmg <<"    " << liste.Liste[i].Kosten << endl; 
    	cout <<"eingeben\n";
    	int x;
    	cin >>x;
    	Geld=liste.Liste[x].Kosten;
    	int value = atoi(Geld.c_str()); 
    	Geld_2=Geld_2-value;
    	cout <<Geld_2;
    	cout << "Waffe " << liste.Liste[x].Name << "gekauft" << endl;
    

    [/code]

    Ich habe mri überlegt ob es so geht:
    String maximal länge.
    Teilen in 4 Teile je nach dem wie Lang z.b der Name ist (die 4 Kategorienen).

    Gruss

    Nimda4



  • Ich bin mir nicht sicher, ob ich verstanden habe, was Du willst, aber

    #include<iomanip>
    #include <iostream>
    
    ...
    
    int main()
    {
       ...
    
       std::cout << std::setw(20) << "Name" << setw(20) << "Vorname\n";
    
       ...
    

    ist vielleicht das, was Du suchst?
    Übrigens Hut ab! Ich bin immer wieder erstaunt, wieviel man trotz weitgehender Ahnungslosikeit erreichen kann.



  • Naja, man wächst mit der Aufgabe. Ist meines ERachtens motivierender mit einer Sache loszulegen und sich nebenbei mit der Thematik auseinanderzusetzen.

    Für dein letzes Problem mit den <<" " verwende für die Ausgabe doch ne eigene Funktion, welche nachschaut wie lang die strings sind und dann für jeden Fall entsprechende Leerzeichen einfügt, auch wenn ich nicht weiß wieso du das machen möchtest.



  • Belli schrieb:

    Ich bin mir nicht sicher, ob ich verstanden habe, was Du willst, aber

    #include<iomanip>
    #include <iostream>
    
    ...
    
    int main()
    {
       ...
    
       std::cout << std::setw(20) << "Name" << setw(20) << "Vorname\n";
    
       ...
    

    ist vielleicht das, was Du suchst?
    Übrigens Hut ab! Ich bin immer wieder erstaunt, wieviel man trotz weitgehender Ahnungslosikeit erreichen kann.

    Vielen Dank für dein Kompliment 😃

    Zur Zeit habe ich ja kein Buch und muss alles im Internet zusammen lesen-.-^^

    Leider ist es nicht ganz das was ich möchte.

    Ich möchte folgendes:

    Nr.    Name       DMG     Kosten
    0      Schwert    20      200
    1      Dolch      10      100
    

    Es soll automatisch die Abstände anpassen also die Abtände zwischen den einzelnen Sachen.

    @Namenloser324
    Sehe ich genau so 😃
    Macht so viel mehr Spass und langsamm verstehe ich einig ezusammenhänge. Aber natürlich werde ich noch das Buch durcharbeiten.

    Gruss Nidma4



  • Namenloser324 schrieb:

    Naja, man wächst mit der Aufgabe. Ist meines ERachtens motivierender mit einer Sache loszulegen und sich nebenbei mit der Thematik auseinanderzusetzen.

    Das wäre dann akzeptabel wenn man...
    a) ...auch schlecht gelerntes wieder leicht vergessen würde...*
    b) ...dann keine Anderen ständig bemüht...**

    * Viele Bücher wählen nicht ohne Grund einen aufbauenden Weg, da so einige Fehler vermieden werden können. Der Mensch ist aber ein Gewohnheitstier, so wie z.B. jemand der Jahrelang Java programmiert hat, häufig bei C++ in Probleme rennt weil er sich auf sein altes Javawissen verlässt, oder jemand der sich einen dreckigen Programmierstil angewöhnt hat, diesen auch nur langsam ablegt.

    ** Ein Forum dient zwar der Hilfestellung, aber der Sinn verfliegt wenn jemand alles in kleinen Häppchen nachfragt. Die Steigerung ist dann alle Codeschnippel die man im Internet findet zu verwenden, ohne den Sinn wirklich zu verstehen, und sich dann Wundern wenn merkwürdige Fehler auftreten.



  • asc schrieb:

    Ich habe noch neue Bücher bei mir rumfliegen, nur habe ich diese schon einem anderen angeboten dem ich zumindest bis zum Wochenende Zeit lassen will. Ggf. kannst du mich ja mal kontaktieren.

    @nimda4: Bislang hat sich der Erste nicht gemeldet, kannst mich wie gesagt bei Bedarf mal kontaktieren (Mail über Profil)



  • Dazu musst Du vor der Ausgabe einmal die Länge des breitesten Strings pro Spalte feststellen und dann:

    int breiteSpalteEins = /*zum Beispiel:*/ 8;
    int breiteSpalteZwei = /*zum Beispiel:*/ 12;
    int breiteSpalteDrei = /*zum Beispiel:*/ 10;
    int breiteSpalteVier = /*zum Beispiel:*/ 14;
    
    cout << left;  //linksbündige Ausgabe
    for(unsigned int i = 0 ; i<liste.Liste.size();i++)
        cout << setw(breiteSpalteEins) << i << setw(breiteSpalteZwei) << 
        liste.Liste[i].Name << setw(breiteSpalteDrei) << liste.Liste[i].Dmg << 
        setw(breiteSpalteVier) << liste.Liste[i].Kosten << endl;
    


  • Belli schrieb:

    Dazu musst Du vor der Ausgabe einmal die Länge des breitesten Strings pro Spalte feststellen und dann:

    int breiteSpalteEins = /*zum Beispiel:*/ 8;
    int breiteSpalteZwei = /*zum Beispiel:*/ 12;
    int breiteSpalteDrei = /*zum Beispiel:*/ 10;
    int breiteSpalteVier = /*zum Beispiel:*/ 14;
    
    cout << left;  //linksbündige Ausgabe
    for(unsigned int i = 0 ; i<liste.Liste.size();i++)
        cout << setw(breiteSpalteEins) << i << setw(breiteSpalteZwei) << 
        liste.Liste[i].Name << setw(breiteSpalteDrei) << liste.Liste[i].Dmg << 
        setw(breiteSpalteVier) << liste.Liste[i].Kosten << endl;
    

    Vielen Danke werde ich im Verlauf des Tages probieren.

    Gruss

    Nimda4



  • asc schrieb:

    asc schrieb:

    Ich habe noch neue Bücher bei mir rumfliegen, nur habe ich diese schon einem anderen angeboten dem ich zumindest bis zum Wochenende Zeit lassen will. Ggf. kannst du mich ja mal kontaktieren.

    @nimda4: Bislang hat sich der Erste nicht gemeldet, kannst mich wie gesagt bei Bedarf mal kontaktieren (Mail über Profil)

    Hast eine Mail von mir 😃

    Gruss

    Nimda4



  • Hab jetzt trotzdem das ich auf das Buch warte noch eine Frage.

    Ich habe ja folgende Klasse:

    [code]
      public: 
        Monster()      // Standardkonstruktor 
        : name(""),    // Initialiserungsliste 
          leben(0), 
          Angriff(0),
    	  Vert(0),
    	  Schaden(0)
        { 
          //Konstruktorrumpf 
        } 
    
        Monster(   // Konstruktor mit Parametern 
         std::string const & name, 
    	 int leben, 
    	 int Angriff,
    	 int Vert,
    	 int Schaden) 
        : name(name),       // Zuweisung Parameter zur Membervariablen 
          leben(leben), 
          Angriff(Angriff),
    	  Vert(Vert),
    	  Schaden(Schaden)
        { 
        } 
    
    		void test() //Testfunktion
    		{
    			std::cout <<name <<"\n" <<leben <<"\n" <<Angriff <<"\n" <<Vert <<"\n" <<Schaden <<"\n";
    		}
    
    		void kampf()
    		{
    
    		}
    
        ~Monster() // Destruktor 
        { 
        } 
    };
    

    [/code]

    Ich möchte die void Kampf() so machen das ich dort meine Werte dort Benutzen kann.
    Muss ich dafür eine neue Klasse für mich machen da es nicht mit 2 Objekten in einer Methode der gleichen Klasse funktioniert?

    Oder geht es doch?

    Beispiel

    Monster Ich("Hans",100,12,14,50);
    Monster Oger("Oger",130,11,12,45);

    Und dann möchte ich hier die Funtkion aufrufen und es soll zuerst das Objekt "ICH" nehmen und dann den Oger.

    Wenn es möglich ist möchte ich es imemr so machen das der Erste der oben steht als erstes Objekt nimmt und dann das untere.

    Und wenn ich eine Funktion einer anderen Klasse aufrufen möchte kann ich das mit "friend" machen?

    Gruss

    Nimda4



  • wie bereits gesagt:

    void kampf(std::vector<Monster> Gegnergruppe)
    {

    //hier kannst du deine eigenen Werte benutzen und wenn Monster friend deiner //Klasse ist auch die der Monster
    }



  • Namenloser324 schrieb:

    wie bereits gesagt:

    void kampf(std::vector<Monster> Gegnergruppe)
    {

    //hier kannst du deine eigenen Werte benutzen und wenn Monster friend deiner //Klasse ist auch die der Monster
    }

    also ungefähr so?

    [code]
    class Ich
    {
     public:
     status werte;
    
     friend class Monster;
    
    {
    }
    void kampf(std::vector<Monster> Gegnergruppe)
    {
        // Kampvorgang
    }
    };
    

    [/code]

    [code]
    class Monster
    {
      status werte;
    };
    

    [/code]

    Ist das so richtig?
    Oder hast du gerade so ein Beispiel welches du posten könntest?

    Gruss

    Nimda4



  • Wieso muss es denn per value sein ?



  • cvcv schrieb:

    Wieso muss es denn per value sein ?

    Muss es nicht, mir ist jede möglichkeit recht so fern sie Ihren Zweck erfüllt 🙂

    Gruss

    Nimda4



  • Für mich ist einfach das Problem wie ich eine Kampffunktion machen kann, die folgende Sachen kann:

    Meine Statuswerte verwendem, die des Gegners.

    die methode roll von der kalsse dice verwenden und die ausgegebenen Werte mit den Statuswerten vergleichen.

    beispiel:

    Ausgabe: meinName, ihr dürft angreiffen.
    dice roll() WürfelWürfeln.
    wenn WürfelWürfel <=meinAngriff, dann Treffer
    sonst ausgabe Troll darf angreiffen...

    Gruss

    nimda4



  • Naja, dazu war doch der Vorschlag mit dem vektor ... ?

    ...
    
    std::vector<Monster> mobs;
    mobs.push_back(someMobInstance1); // Einfach den Vektor mit den existierenden Instanzen deiner Monster-Klasse befüllen
    mobs.push_back(someMObInstance2);
    fight(mobs); // Den befüllten Vektor an deine Kampf-Funktion übergeben
     ...
    void fight ( std::vector<Monster>& mobs ) {
         // Jetzt kannst du hier wunderbar auf die Werte der einzelnen Monster-Instanzen zugreifen und dein komisches Roll-Gedöns da machen ;)
    
    }
    


  • cvcv schrieb:

    Naja, dazu war doch der Vorschlag mit dem vektor ... ?

    ...
    
    std::vector<Monster> mobs;
    mobs.push_back(someMobInstance1); // Einfach den Vektor mit den existierenden Instanzen deiner Monster-Klasse befüllen
    mobs.push_back(someMObInstance2);
    fight(mobs); // Den befüllten Vektor an deine Kampf-Funktion übergeben
     ...
    void fight ( std::vector<Monster>& mobs ) {
         // Jetzt kannst du hier wunderbar auf die Werte der einzelnen Monster-Instanzen zugreifen und dein komisches Roll-Gedöns da machen ;)
        
    }
    

    o.O wow.

    Danke viel mals bin am rumtesten, hab nur noch 2 kleine Probleme:

    es sagt mir bei fight(mobs); "error C3861: 'fight': identifier not found."

    und was wenn ich ein Objekt einer anderen Klasse mit mehr parametern verwenden möchte? (habs ausprobiert so gehts nicht 😞 )

    Gruss

    Nimda4



  • Werd mal konkret, bitte. Wenn du die fight-funktion auch für eine andere Klasse haben willst, dann gibt ihr entweder einen 2. Parameter mit einem std::vector<AndereKlasse>& oder du überlädst die Funktion. -> Google.

    Zu Deinem Fehler : Forward-Declaration, schreib den die Funktionssignatur vor deine main() :

    void fight( std::vector<Monster>& );
    

Anmelden zum Antworten