Einfaches Tool voller Fehler
-
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 werdenvor 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 erreichtWarum 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.....
-
Bekell schrieb:
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.....
Hast du mal "Rebuild all" ausprobiert? Wenn ich raten müsste, würde ich sagen, daß der Compiler durch die global stehende for()-Schleife ein wenig aus dem Konzept geraten ist.
(über konkrete Fragen zu deiner IDE kann ich leider nichts sagen)
-
Ich mach mit X-code, bei einer fehlenden Klammer von for würd er das bei error anzeigen. Das Error-Fenster bleibt aber leer, und alle die farbigen Befehle sind auch weg......
-
OK, ich korrgiere mich, die Schleife steht doch nicht global - deine Einrückung ist nur katastrophal.
Aber die Fehlermeldung von Ideone dürfte das Problem umschreiben:
prog.cpp: In function ‘int main()’:
prog.cpp:29: error: ‘first’ was not declared in this scope
prog.cpp:31: error: ‘first’ was not declared in this scope
prog.cpp:33: error: ‘first’ was not declared in this scope-> Das heißt im Klartext: Die Variable heißt nicht "first", sondern "pos->first"
-
Funktioniert alles, bin schon bei der 8. Stelle, nur beginnt jetz der Comp zu rauchen...:-)
Ab 09. 05 bin ich wieder hier.