Einfaches Tool voller Fehler



  • Wenn du bei if oder else die {} weglässt, dann gilt nur die 1. Anweisung, also bis zum 1. Semikolon. Bei dir stehen aber hinter deinem if ( ohne die{} ) 2 Anweisungen und dann kommt das else, was der compiler nicht will und dich sogar mehr oder weniger fragt,ob du denn nicht die Klammern um den if-block vergessen hast.

    Dein Einrückungsstil ist immernoch miserablel ^^ Eher nicht vorhanden.



  • Ist der Einrückungsstiel so besser?

    #include <iostream> 
    #include <string> 
    #include <sstream> 
    using namespace std;
    int main ()
    {
    int Rundenzhler = 0;
    int Ergebnis;
    int Nzler;
    
    for (int Ziffer1=0; Ziffer1<10; Ziffer1++)
     {
    		for (int Ziffer2=0; Ziffer2<10; Ziffer2++)
    		{
    		Ergebnis=Ziffer1*Ziffer2;				
    		if (Ergebnis > 0) 
    			{	
    			Rundenzhler=Rundenzhler+1;	
    			cout<<Rundenzhler<<".  Ergebnis = "<<Ergebnis<<"\n";	
    			} 		
    		else
    			{		
    			Nzler=Nzler+1;	
    			} 	
    		} 		
    }
    cout<<"Nullzähler = "<<Nzler<<"\n"; 
    }
    


  • Ehm, nicht unbedingt.

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    int main ()
    {
        int Rundenzhler = 0;
        int Ergebnis;
        int Nzler;
    
        for (int Ziffer1=0; Ziffer1<10; Ziffer1++)
        {
            for (int Ziffer2=0; Ziffer2<10; Ziffer2++)
            {
                Ergebnis=Ziffer1*Ziffer2;               
                if (Ergebnis > 0)
                {   
                    Rundenzhler=Rundenzhler+1;   
                    cout<<Rundenzhler<<".  Ergebnis = "<<Ergebnis<<"\n";   
                }        
                else
                {       
                    Nzler=Nzler+1;   
                }    
            }        
        }
    
        cout<<"Nullzähler = "<<Nzler<<"\n";
    }
    


  • Ich wollte es jetzt so machen, daß er nur noch die Ergebnisse der Multiplikation ausgibt, und zwar nur einmal am Ende des Programms, und zwar als Liste, mit einer zahl dahinter, wie oft die Zahl Ergebnis war.

    Das geht irgendwie mit Array. kann mir jemand einen Vorschlag machen?



  • Das könnte man mit einem Array machen, aber wahrscheinlich ist eine map<> dort für dich geeigneter:

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <map>
    using namespace std;
    
    int main ()
    {
        map<int,int> Ergebnisse;
        for (int Ziffer1=0; Ziffer1<10; Ziffer1++)
        {
            for (int Ziffer2=0; Ziffer2<10; Ziffer2++)
            {
                ++Ergebnisse[Ziffer1*Ziffer2];
            }        
        }
    
        for(map<int,int>::iterator pos=Ergebnisse.begin();pos!=Ergebnisse.end();++pos)
        {
            cout<<pos->second<<" wurde "<<pos->first<<" mal erreicht"<<endl;
        }
    }
    


  • Wenn ich Deinen Code eingebe, sagt er sowas:

    main.cpp:38: error: expected ;' before 'int' main.cpp:38: error: expected primary-expression before 'int' main.cpp:38: error: 'map' was not declared in this scope main.cpp:43: error: 'Ergebnisse' was not declared in this scope main.cpp:47: error: 'Ergebnisse' was not declared in this scope main.cpp:47: error: expected primary-expression before 'int' main.cpp:47: error: 'pos' was not declared in this scope main.cpp:47: error: expected;' before 'int'

    Also, er kennt "map" nicht....
    Kannst Du mal eine Seite psten, wo Map, iterator und so erklärt werden

    vor allem verstehe ich immer int,int nicht. Ich denke das ist ein Speicher im Speicher...?



  • sorry, mein Fehler - ich hatte den Header vergessen.



  • Dazu musst du das Ergebnis nach jeder Multiplikation irgendwo speichern, weil es bei jedem Schleifendurchlauf überschrieben/gelöscht wird. Es gibt verschiedene Möglichkeiten das zu machen und eine (simple) davon sind Vektoren (mit Arrays ginge es auch, aber da du theoretisch nicht weißt wir oft welches Ergebnis vorkommen wird, müsste man den Array entweder dynamisch während der Laufzeit anlegen oder Speicher für die maximale Anzahl von möglichen Ergebnissen reservieren). Mit STL Containern ist es einfacher zu arbeiten.

    P.S. Deine Main()-Funktion sollte am Ende 0 oder false zurückgeben, sonst wird das Ganze als fehlerhafte Auführung interpretiert.

    Edit: da war jemand schneller



  • Du hattest - bist Du Pädagoge? - "first" und "second" im cout-Befehl verwechselt. Das war für mich sehr lehrreich..
    Danke...

    Es geht gleich weiter.... ich muß das erst capieren.



  • Ich hab einen Numerator eingefügt, am Ende.

    #include <iostream> 
    #include <string> 
    #include <sstream> 
    #include <map>
    using namespace std; 
    int main () 
    { 
        map<int,int> Ergebnisse; 
        for (int Ziffer1=0; Ziffer1<10; Ziffer1++) 
        { 
            for (int Ziffer2=0; Ziffer2<10; Ziffer2++) 
            { 
                ++Ergebnisse[Ziffer1*Ziffer2]; 
            }         
        } 
    
        for(map<int,int>::iterator pos=Ergebnisse.begin();pos!=Ergebnisse.end();++pos) 
        { 
    	int zl = zl+1;
            cout<<"Nr. "<<zl<<" "<<pos->first<<" wurde "<<pos->second<<" mal erreicht"<<endl; 
        } 
    }
    

    [code]

    Das erhalte ich:

    [Session started at 2011-04-30 14:35:14 +0200.]
    Nr. 14437 0 wurde 19 mal erreicht
    Nr. 14438 1 wurde 1 mal erreicht
    Nr. 14439 2 wurde 2 mal erreicht
    Nr. 14440 3 wurde 2 mal erreicht
    Nr. 14441 4 wurde 3 mal erreicht
    Nr. 14442 5 wurde 2 mal erreicht
    Nr. 14443 6 wurde 4 mal erreicht
    Nr. 14444 7 wurde 2 mal erreicht
    Nr. 14445 8 wurde 4 mal erreicht
    Nr. 14446 9 wurde 3 mal erreicht
    Nr. 14447 10 wurde 2 mal erreicht
    Nr. 14448 12 wurde 4 mal erreicht
    Nr. 14449 14 wurde 2 mal erreicht
    Nr. 14450 15 wurde 2 mal erreicht
    Nr. 14451 16 wurde 3 mal erreicht
    Nr. 14452 18 wurde 4 mal erreicht
    Nr. 14453 20 wurde 2 mal erreicht
    Nr. 14454 21 wurde 2 mal erreicht
    Nr. 14455 24 wurde 4 mal erreicht
    Nr. 14456 25 wurde 1 mal erreicht
    Nr. 14457 27 wurde 2 mal erreicht
    Nr. 14458 28 wurde 2 mal erreicht
    Nr. 14459 30 wurde 2 mal erreicht
    Nr. 14460 32 wurde 2 mal erreicht
    Nr. 14461 35 wurde 2 mal erreicht
    Nr. 14462 36 wurde 3 mal erreicht
    Nr. 14463 40 wurde 2 mal erreicht
    Nr. 14464 42 wurde 2 mal erreicht
    Nr. 14465 45 wurde 2 mal erreicht
    Nr. 14466 48 wurde 2 mal erreicht
    Nr. 14467 49 wurde 1 mal erreicht
    Nr. 14468 54 wurde 2 mal erreicht
    Nr. 14469 56 wurde 2 mal erreicht
    Nr. 14470 63 wurde 2 mal erreicht
    Nr. 14471 64 wurde 1 mal erreicht
    Nr. 14472 72 wurde 2 mal erreicht
    Nr. 14473 81 wurde 1 mal erreicht

    Warum zählt zl so hoch?



  • Weil die Initialisierung

    int zl = zl+1;
    

    völlig sinnlos ist.

    Initialisiere vor der Schleife "int zl = 0" und in der Schleife erhöhe nur diese Variable mittels "++zl" (bzw. "zl = zl + 1").



  • Weil du die Variable nicht mit 0 initalisierst.
    Initialisiere sie außerhalb von Schleifen mit 0 und inkrementiere sie einfach mit zl++;



  • Bekell schrieb:

    Du hattest - bist Du Pädagoge? - "first" und "second" im cout-Befehl verwechselt. Das war für mich sehr lehrreich..

    Nein, nur Informatiker 😃 (und mitunter etwas zerstreut :D)

    Bekell schrieb:

    Warum zählt zl so hoch?

    Der selbe Fehler, den ich dir schonmal mit dem Nzler angekreidet habe - definiere die Variable vor der Ausgabeschleife (initialisiert mit 0 oder 1) und erhöhe sie in der Schleife nur noch.



  • Ich wollte jetz, daß er noch die einstelligen, die zweistelligen, die dreistelligen -ich hab inzwischen auf dreistellig erhöht, es funktioniert - Ergebnisse absolut und relativ zusammenzählt. Ich würde das mit einer if-Struktur in der letzten for -Schleife machen. Sicher gibt es was eleganteres.



  • Nachwelchen Kriterien willst du die Ergebnisse zusammenzählen? Wenn du von den Faktoren ausgehen willst, solltest du das direkt beim Erstellen der der Produkt-Liste erledigen, wenn du vom der Stellenzahl der Ergebnisse ausgehst, kannst du das in beiden Schleifen machen.



  • Bei dreistelligen Querprodukten, also bis 999 alle durchmultipliziert, gibt es genau 729 Ergebnisse größer als 0, davon nur 100 verschiedene, davon 9 einstellig, 36 zweistellig und 55 dreistellig.

    Diese zahle interessieren. Mit If-Schleifen ist zu fehleranfällig.



  • Die Länge einer Zahl kannst du entweder per if-Auswahl ermitteln oder mit Elementarmathematik: len(x) = ceil(log10(x+1) (bei der Rundung bin ich nicht 100% sicher) - damit kannst du die Anzahlen dann in einem Array oder map<> aufsummieren.

    PS: zur www.if-schleife.de sage ich jetzt nichts 😃



  • #include <iostream> 
    #include <string> 
    #include <sstream> 
    #include <map>
    using namespace std; 
    int zl = 0;
    int st1 = 0;
    int st2 = 0;
    int st3 = 0;
    int main () 
    { 
        map<int,int> Ergebnisse; 
        for (int Ziffer1=0; Ziffer1<10; Ziffer1++) 
        { 
            for (int Ziffer2=0; Ziffer2<10; Ziffer2++) 
            { 
    		 for (int Ziffer3=0; Ziffer3<10; Ziffer3++) 
    		{ 
    				++Ergebnisse[Ziffer1*Ziffer2*Ziffer3]; 
    		}  
    	}       
    } 
    
    for(map<int,int>::iterator pos=Ergebnisse.begin();pos!=Ergebnisse.end();++pos) 
    { 
    	++zl;
            cout<<"Nr. "<<zl<<" Zahl: "<<pos->first<<" kommt "<<pos->second<<" mal als QP vor"<<endl; 
    
    	if (first < 10)
    	st1=st1+1;
    	if (first > 10 && first < 100)
    	st2=st2+1;
    	if (first > 100 && first <1000)
    	st3=st3+1;
    	}
    	cout<<"Innerhalb der Zahlen bis 999 kommen folgende Querprodukte vor";  
    	cout<<"1stellig"<<st1<<"\n";
    	cout<<"2stellig"<<st2<<"\n";
    	cout<<"3stellig"<<st3<<"\n";
    }
    

    Das hab ich geschrieben, aber irgendwie ist der Effekt verschwunden vom Compiler, daß die Befehle farbig sind, alles ist schwarz-weiss, und auf der Konsole läuft nur noch die alte Version, wenn ich auf Run tippe.....+



  • Da sollte dir eigentlich dein Compiler mitteilen, daß die for()-Schleife frei im Raum steht - die sollte schon in der main()-Funktion bleiben. Außerdem wird die 10 (=1*2*5) und 100 (=4*5*5) nicht mitgezählt.

    PS: Und "first" als eigenständige Variable existiert auch nicht - die if-Kaskade sollte eher so aussehen:

    if(pos->first < 10)
      st1+=pos->second;
    else if(pos->first < 100)
      st2+=pos->second;
    else
      st3+=pos->second;
    

    Oder die Variante mit STL-Algorithmen:

    int stlimits[] = {0,10,100,1000};
    int stellen[5];
    for( map<int,int>::iterator pos=Ergebnisse.begin(); pos!=Ergebnisse.end(); ++pos)
    {
      cout<<...
      int st = lower_bound(stlimits,stlimits+4,pos->first);
      stellen[st] += pos->second;
    }
    


  • Erst mal ist das das Problem:

    irgendwie ist der Effekt verschwunden vom Compiler, daß die Befehle farbig sind, alles ist schwarz-weiss, und auf der Konsole läuft nur noch die alte Version, wenn ich auf Run tippe.....


Anmelden zum Antworten