Zähler Schleife



  • Ich bräuchte hilfe beim gedankenschritt:

    ich will zahlen auslesen zeile für zeile, berechnen und in eine neue textdatei schrieben. alles so gut. bei der neuen datei klappt alles bis auf den zähler ich möchte die zeilen nummerieren, ich bekomme dauernd nur 1,1,1,1,1,1,.....
    wenn ich die for-schleife sonst so verwende bekomme ich 1,2,3,4,5,6.....
    wo hängt der gedankenschritt bei folgenden skript:

    int main()
    {
    ifstream datei ("testec.txt");
    string zeile;
    ofstream dat ("test.txt");

    while(getline(datei, zeile))

    {
    // cout << zeile << endl;

    stringstream zeilenpuffer (zeile);
    double a, b, c, d;

    zeilenpuffer >> a>> b>>c>>d;
    for (int i = 1; i == true; i++){

    cout<<i<<"\t\t" <<a*2<<"\t\t"<<b*2<<"\t\t"<<c*2<<"\t\t"<<d*2<<"\t\t" <<endl;
    dat <<i<<"\t\t" <<a*2<<"\t\t"<<b*2<<"\t\t"<<c*2<<"\t\t"<<d*2<<"\t\t" <<endl;

    //break;
    }

    }}
    true habe ich gewählt weil ich nicht weiss was ich als bedingung wählen soll.

    aus erfahrung, die jenigen die meine unkenntniss lustig finden und dies boshaft kommentieren möchten: es gibt genügend dumme fragen in diesem forum von mir sucht sie lacht und kommentiert sie boshaft, somit unterstreicht ihr nur meine geisteunterlegenheit und zeigt mien ignoranz auf.

    den ehrlichen Helfern, vorerst herzlichsten Dank!



  • Benutze Codetags!

    Du willst die Zeilen zählen, wozu soll die for-Schleife da gut sein? Wenn du eine Zeile gelesen hast musst du die Zeilenzahl um 1 erhöhen.



  • OscarKilo84 schrieb:

    true habe ich gewählt weil ich nicht weiss was ich als bedingung wählen soll.

    Dann solltest Du Dir darüber mal Gedanken machen, sonst bricht die for-Schleife halt immer nach 1 Durchgang ab.

    aus erfahrung, die jenigen die meine unkenntniss lustig finden und dies boshaft kommentieren möchten: es gibt genügend dumme fragen in diesem forum von mir sucht sie lacht und kommentiert sie boshaft, somit unterstreicht ihr nur meine geisteunterlegenheit und zeigt mien ignoranz auf.

    Und Du meinst ernsthaft, dass so ein Disclaimer Dir hilft?



  • Schau dir mal mithilfe eines Debuggers Schritt für Schritt an was dein Programm macht. Dann solltest du selbst auf eine Lösung kommen.



  • danke für die Hilfe,negative Erfahrungen in Foren habe ich leider gemacht.



  • manni66 schrieb:

    Benutze Codetags!

    Du willst die Zeilen zählen, wozu soll die for-Schleife da gut sein? Wenn du eine Zeile gelesen hast musst du die Zeilenzahl um 1 erhöhen.

    ich habe vor drei tagen angefangen mich mit c++ auseinanderzusezten. für die erhöhungen hatte ich eine forschleife genommen hier gehts gut :

    for (int i = 1; i <= 100; i++)

    {

    schreiben << i<<"\t"<<"\t"<<"\t"<<Rn<<"\t"<<G<<"\t"<<y<<"\t"<<T<<"\t"<<e<<"\t"<<ea<<"\t"<<A<<"\t"<<u<<endl;
    cout << i<<"\t"<<"\t"<<"\t"<<Rn<<"\t"<<G<<"\t"<<y<<"\t"<<T<<"\t"<<e<<"\t"<<ea<<"\t"<<A<<"\t"<<u<<endl;

    }
    schreiben.close();

    was sind codetags?

    danke

    ps for schleife hatte ich mir so vorgestellt: start bei i mit 1 bis i = 100 hör dann auf, und i++ = erhöhe um 1. Selbst wenn ich true durch 2000, 3000, usw ersetz wird i nicht uim 1 erhöht. Warum klappt es gedanklich hier und nciht dort?



  • axels. schrieb:

    Schau dir mal mithilfe eines Debuggers Schritt für Schritt an was dein Programm macht. Dann solltest du selbst auf eine Lösung kommen.

    Danke ich habe Code:. Blocks installier Debugger ist leer, und was im Builtlog steht ist für mich unverständlich. dennoch danke



  • OscarKilo84 schrieb:

    was sind codetags?
    danke

    Codetags sind die Dinger die machen, dass das wie Code aussieht

    for (int i = 1; i <= 100; i++)
    {
    
        schreiben << i<<"\t"<<"\t"<<"\t"<<Rn<<"\t"<<G<<"\t"<<y<<"\t"<<T<<"\t"<<e<<"\t"<<ea<<"\t"<<A<<"\t"<<u<<endl;
        cout << i<<"\t"<<"\t"<<"\t"<<Rn<<"\t"<<G<<"\t"<<y<<"\t"<<T<<"\t"<<e<<"\t"<<ea<<"\t"<<A<<"\t"<<u<<endl;
    }
    

    C++ Button drücke, Code einfügen, C++ Button nochmal drücken.

    OscarKilo84 schrieb:

    ich habe vor drei tagen angefangen mich mit c++ auseinanderzusezten. für die erhöhungen hatte ich eine forschleife genommen hier gehts gut :

    Du zählst in der Schliefe von 1 bis 100. Du willst aber die Zeilen zählen.

    Dieses Forum ersetzt kein Lehrbuch. Besorge dir ein Anständiges. Beschäftige dich mit den hier im Forum oben angetackerten Threads.



  • Danke, literaturist besorgt. ich will hier auch keine skripte sondern gedanklcihen input. und das war die beste Antwort. Ich verstehe jetzt was ich nachrecherchieren muss.Jedoch kein Lehrbuch kann mir erklären warum hier ist klappt und nciht dort, deswegen herzlichen Dank



  • manni66 schrieb:

    OscarKilo84 schrieb:

    was sind codetags?
    danke

    Codetags sind die Dinger die machen, dass das wie Code aussieht

    for (int i = 1; i <= 100; i++)
    {
    
        schreiben << i<<"\t"<<"\t"<<"\t"<<Rn<<"\t"<<G<<"\t"<<y<<"\t"<<T<<"\t"<<e<<"\t"<<ea<<"\t"<<A<<"\t"<<u<<endl;
        cout << i<<"\t"<<"\t"<<"\t"<<Rn<<"\t"<<G<<"\t"<<y<<"\t"<<T<<"\t"<<e<<"\t"<<ea<<"\t"<<A<<"\t"<<u<<endl;
    }
    

    C++ Button drücke, Code einfügen, C++ Button nochmal drücken.

    OscarKilo84 schrieb:

    ich habe vor drei tagen angefangen mich mit c++ auseinanderzusezten. für die erhöhungen hatte ich eine forschleife genommen hier gehts gut :

    Du zählst in der Schliefe von 1 bis 100. Du willst aber die Zeilen zählen.

    Dieses Forum ersetzt kein Lehrbuch. Besorge dir ein Anständiges. Beschäftige dich mit den hier im Forum oben angetackerten Threads.

    aber nochmals blöd gefragt warum ist dann i konstant 1 wenn jetzt doch die schleifen gezählt werden?



  • #include <iostream>
    using namespace std;
    
    int main() {
    	int i = 2;
        if(i==true) cout << "ja";
        else cout << "nein";
    }
    

    Was kommt da raus?



  • OscarKilo84 schrieb:

    danke für die Hilfe,negative Erfahrungen in Foren habe ich leider gemacht.

    Das wundert mich nicht. Du gibst dir hier beim Verfassen deiner Beiträge genau so wenig Mühe wie bei deiner Programmiererei.

    Bei der Schleife:

    for (int i = 1; i <= 100; i++)
    

    ist i nie und nimmer konstant 1.

    Bei diesem Unsinn:

    for (int i = 1; i == true; i++)
    

    hingegen schon.

    Warum ist das so? Das will ich jetzt von dir wissen!



  • OscarKilo84 schrieb:

    Jedoch kein Lehrbuch kann mir erklären warum hier ist klappt und nciht dort

    Nein, aber ein Lehrbuch zeigt dir die verschiedenen Sachverhalte auf. Entsprechend solltest du hinterher wissen welcher Ausdruck zu welchem Ergebnis fuehrt.



  • ich weiß nicht ob ich dein Problem richtig verstanden habe. Ich habe auch keine Ahnung was in deiner testec.txt steht. Aber wenn dein Problem nur das Zählen der Zeilen ist, dann sollte es reichen, wenn du das wie folgt machst:

    Du gehst vor die while-Schleife und machst dir dort nen Integer. Sagen wir

    int iZeile = 0;
    

    in der While-Schleife zählst du dann einfach eins dazu. Also:

    iZeile++;
    

    jetzt musst du den Integer nur noch in dein cout mit reinnehmen:

    cout<<iZeile<<"\t\t" <<a*2<<"\t\t"<<b*2<<"\t\t"<<c*2<<"\t\t"<<d*2<<"\t\t" <<endl;
    dat <<iZeile<<"\t\t" <<a*2<<"\t\t"<<b*2<<"\t\t"<<c*2<<"\t\t"<<d*2<<"\t\t" <<endl;
    

    Die for-Schleife kannst du komplett weglassen.

    Und nach der while-Schleife würde ich noch ein dat.close(); schreiben. Damit schließt du sozusagen die die Datei ab und sie ist ab der Stelle wieder verwendbar für andere Programme etc..

    Kannst ja mal testen ob dein Problem damit behoben ist. Ist mir nur gerade so eingefallen 😃
    Um dir zu erklären was mani66 meint. Jede Abfrage in welcher eine Zahl abgefragt wird die != 0 ist, ergibt true. Selbst ein if(46) oder ein if(-531) gibt ein true zurück. Nur 0 gibt dir ein false zurück.

    Das mit dem Buch ist wirklich eine gute Idee. Wenn du das Wissen von Anfang an gleich richtig und komplett aneignest, dann entstehen viele Probleme nicht, da du dann komplett anders schreibst und nicht versuchst von allen mal gesehen Informationen das richtige raus zu stochern. (Kein Vorwurf). Falls du mit Englisch Probleme hast kann ich dir nur https://www.amazon.de/Programmierer-lernen-Professionell-anwenden-Lösungen/dp/3446416447 empfehlen. Das lese ich gerade und bin ganz zufrieden.



  • Zhavok schrieb:

    Um dir zu erklären was mani66 meint. Jede Abfrage in welcher eine Zahl abgefragt wird die != 0 ist, ergibt true. Selbst ein if(46) oder ein if(-531) gibt ein true zurück. Nur 0 gibt dir ein false zurück.

    Was du da beschreibst ist zwar richtig, das meine ich aber nicht.

    #include <iostream>
    using namespace std;
    
    int main() {
        int i = 1; // <---------------------------------------------------
        if(i==true) cout << "ja\n";
        else cout << "nein\n";
    }
    

    Was kommt da raus?

    #include <iostream>
    using namespace std;
    
    int main() {
        int i = 2; // <---------------------------------------------------
        if(i==true) cout << "ja\n";
        else cout << "nein\n";
    }
    

    Und hier?



  • Beim ersten ja, beim zweiten nein. Soweit ich weiß, weil hier das true als 1 interpretiert wird. Wenn i auf 0 steht und die Abfrage if(i==false) wäre, dann würde das Ergebnis auch wahr also true sein. Ich glaube du möchtest damit sagen, dass bei der for-Schleife das true als 1 gelesen wird oder?


  • Mod

    Zhavok schrieb:

    Beim ersten ja, beim zweiten nein. Soweit ich weiß, weil hier das true als 1 interpretiert wird. Wenn i auf 0 steht und die Abfrage if(i==false) wäre, dann würde das Ergebnis auch wahr also true sein. Ich glaube du möchtest damit sagen, dass bei der for-Schleife das true als 1 gelesen wird oder?

    manni möchte sagen, dass die vom Threadersteller ursprünglich eingesetzte Laufbedingung, i == true , dann und nur dann wahr ist, wenn i gleich 1 ist. Entsprechend bricht die Schleife ab, wenn i auf 2 erhöht wurde. Man bekommt bloß einen einzigen Schleifendurchlauf mit i == 1.

    Der Mechanismus dahinter ist, dass bei Vergleichen¹ von Zahlen (true ist auch so eine Art Zahl) beide Zahlen vom gleichen Typ sein müssen. Sind sie das nicht, werden beide Werte auf einen Typen erweitert, der die Wertebereiche der beiden Ursprungstypen umfasst. Hier ist i ein Integer und true ein bool. Ein bool kann nicht alle Integerwerte darstellen, aber ein Integer kann (unter anderem) alle bool-Werte darstellen. Daher wird für den Vergleich das true in einen Integer umgewandelt. Aber welchen Wert hat true, wenn man es zu einem Integer umwandelt? Es gibt schließlich keinen Integerwert für 'alles außer 0'. Stattdessen schreiben die Regeln vor, dass true den Wert 1 hat. i == true ist daher gleichbedeutend mit i == 1 und nicht mit i != 0 .

    ¹: Das gilt nicht nur für Vergleiche, sondern für alle Berechnungen.



  • jo, das ist ja eigentlich das, was ich in beitrag davor damit meinte 😃
    true wird als 1 interpretiert, false wird als 0 interpretiert.
    war vielleicht bissel doof ausgedrückt^^


  • Mod

    Zhavok schrieb:

    jo, das ist ja eigentlich das, was ich damit meinte 😃
    war vielleicht bissel doof ausgedrückt^^

    Ja, ich war mir ziemlich sicher, dass du es meintest, ich wollte es nur noch mal ganz genau erklären, falls noch etwas unklar war, und auch für den Threadersteller, falls der überhaupt noch mitliest.


Log in to reply