printf
-
[code]#include <iostream> using namespace std; #include <math.h> #include <time.h> #include <string> #include <sstream> int a; int kubik; int main (int argc, char * const argv[]) { for(a=0; a<8; a++) { printf("Schleife %d\n", a+1); kubik = a*a*a; cout<<"cout kubik= "<<kubik<<"\n"; string p; ostringstream outStream; outStream << kubik; p = outStream.str(); cout<<"cout p= "<<p<<"\n"; printf("p 1. Zeichen %i\n", string p [1]); } return 0; }[/code]Hallo, Helfer, ich habe einen Integer (kubik) in einen String (p) umgewandelt. Bis cout in Zeile 23 funktioniert alles. Bei Zeile 24 sagte er aber: "expected primary expression befor "p"". Was ist ein Primärausdruck? Was erwartet er? Ich möchte den ersten Buchstaben des Strings dort haben.
Ich probier jetzt schon 1 Stunde....
Danke für den rettenden Tip. (Bin kein Profi und kein Schüler, mach's nur aus Hobbygründen)
-
Tip 1) benutze [ cpp ] Tags statt [ code ] Tags. Ist besser lesbar (Syntaxhighlighting)
Tip 2) benutze keine using-Direktive in Headern oder vor dem #include von headern
Tip 3) benutze die C++-Header <cmath>, <ctime> an Stelle der C-Header <math.h>, <time.h>
Tip 4) benutze Variablen wenn möglich lieber lokal statt global (kubik, a)
Tip 5) mische nicht printf und cout. Eins von beidem reicht
Tip 6) zu deinem Fehler: printf kann nur mit eingebauten Datentypen. Weil es aus C kommt kennt es die C++-Tpen garnicht. Benutze daher für std::strings cout.
-
Was soll das "sting" hier denn bedeuten?
printf("p 1. Zeichen %i\n", string p [1]);
-
Nochwas:
Bekell schrieb:
Ich probier jetzt schon 1 Stunde....
probieren kannst du in der Küche oder beim Eismann. Beim Programmieren solltest du wissen, was du tust - und wenn du nicht weißt, wie etwas zu tun ist, solltest du im Buch/Tutorial deiner Wahl nachlesen oder dich anderweitig kundig machen. Ausprobieren führt in 80% der Fälle nur zu Frust, weils garnicht funktioniert, ind 18% zu Code, der compiliert, aber nicht ganz das tut was du willst, und in 2% der Fälle zu Code, der so tut als würde es funktionieren, der aber nicht korrekt ist oder nicht portabel oder nur zufällig "funktioniert", eigentlich aber undefiniertes Verhalten erzeugt. ("undefiniertes Verhalten" kann mit "extrem böse, Finger weg!" übersetzt werden)
-
pumuckl schrieb:
Nochwas:
Bekell schrieb:
Ich probier jetzt schon 1 Stunde....
probieren kannst du in der Küche oder beim Eismann.
Bei sowas muss ich mich immer schlapplachen.Wie manni schon sagte, hat das string da erstmal nichts zu suchen.
Das erste Zeichen erhälst du übrigens mit dem index 0 und nicht mit 1.
Ausserdem würde der Ausgegebene Wert sicherlch nicht dem entsprechen, was du erwartest.Kleines Beispiel:
std::string p("123"); printf( "Zeichen an 1. Position: %i \n", p[0]); printf( "Zeichen an 1. Position: %c \n", p[0]);Ausgabe:
49 1Warum da nun 49 rauskommt, darfst du dir nun überlegen

-
So, das klappte.
Jetzt möchte ich, daß er vom String nur eine Position bei cout ausgibt.
-
Über Index-Zugriff kannst du die einzelnen Zeichen des Strings erreichen:
cout<<p[0];
-
Danke, .... jetzt geh ich erst mit den Kindern beten....
-
#include <iostream> #include <cmath> #include <ctime> #include <string> #include <sstream> using namespace std; int gesamtziffernzaehler; int main (int argc, char * const argv[]) { int Z0; int Z1; int Z2; int Z3; int Z4; int Z5; int Z6; int Z7; int Z8; int Z9; int a; for(a=0; a<22; a++) { printf("Schleife %d\n", a+1); int kubik = a*a*a; cout<<a<<" Qubik = "<<kubik<<"\n"; string p; //Zahl in String umwandeln ostringstream outStream; outStream << kubik; p = outStream.str(); //cout<<"cout p= "<<p<<"\n"; cout<<a<<" Qubik hat = "<<p.length()<<" Ziffern\n"; //Länge feststellen //cout<<"länge p= "<<p(3)<<"\n"; string::iterator i; for (i=p.begin(); i!=p.end(); i++) { cout<<"/p= " << *i ; gesamtziffernzaehler = gesamtziffernzaehler+1; int meineZahl; istringstream inStream(p); //verrückte stelle inStream >> meineZahl; if (meineZahl == 0) { int Z0=Z0+1; } if (meineZahl == 1) { int Z1=Z1+1; } if (meineZahl == 2) { int Z2=Z2+1; } if (meineZahl == 3) { int Z3=Z3+1; } if (meineZahl == 4) { int Z4=Z4+1; } if (meineZahl == 5) { int Z5=Z5+1; } if (meineZahl == 6) { int Z6=Z6+1; } if (meineZahl == 7) { int Z7=Z7+1; } if (meineZahl == 8) { int Z8=Z8+1; } if (meineZahl == 9) { int Z9=Z9+1; } { cout << endl; cout<<"gzz = "<<gesamtziffernzaehler<<"\n"; cout<<"Z0= "<<Z0<<" Z1= "<<Z1<<" Z2= "<<Z2<<" Z3= "<<Z3<<" Z4= "<<Z4<<" Z5= "<<Z5<<" Z6= "<<Z6<<" Z7= "<<Z7<<" Z8= "<<Z8<<" Z9= "<<Z9<<"\n\n"; } } } cout<< endl; return 0; }@Pumukl Ich seh zwar keinen Unterschied, aber ich habe eben wirklich auf C++ getippt und nicht auf Code
Das Makro funktioniert bis auf die letzte Funktion. Es soll untersuchen, ob die Ziffern in den Qubikzahlen alle gleichmäßig verteilt sind. Dazu zählt es die Ziffern alle, und soll sie dann auch noch sortiert zählen, was *i bei Zeile 42 leistet.
Siehe "verrückte Stelle" Z 42. Ich versuche dort aus dem String p wieder eine Ziffernfolge zu machen. Die brauch ich für die nachfolgenden if. Warum geht *i nicht?
-
Oh jeh ... Da ist soviel falsch ich weiß nicht wo ich beginnen soll.
1. Arrays verwenden?
int Z0; int Z1; int Z2; int Z3; int Z4; int Z5; int Z6; int Z7; int Z8; int Z9;wird zu
int Z[10];2. Warum deklarierst du Variablen zwei mal?
int Z0=Z0+1; //falsch muss: Z0=Z0+1; //sein.genau so an anderen Stellen auch...
3. Anstelle des if krams kann man mit einem Array dann einfach:++Z[meineZahl];schreiben.
4. Du musst Gesamtziffernzähler und die Startwerte auf 0 setzen, da diese nicht initialisiert sind.#include <iostream> #include <string> #include <sstream> using namespace std; int main () { int gesamtziffernzaehler = 0; int Z[10] = {0}; for(int a = 0 ; a < 5; ++a) { int kubik = a*a*a; ostringstream outStream; outStream << kubik; string p = outStream.str(); gesamtziffernzaehler += p.length(); cout << "\nSchleife: " << a+1 << "\n" << a << " Qubik = " << kubik <<"\n" << a <<" Qubik hat " <<p.length() << " Ziffern" << "\ngzz = " << gesamtziffernzaehler << "\n"; for (string::iterator i = p.begin(); i != p.end(); ++i) { if ((*i - '0') <= 9 && (*i - '0') >= 0) ++Z[(*i - '0')]; cout << "\n"; for(int i = 0; i < 10; ++i) cout<<"Z" << i << "="<< Z[i] << "\n"; } } }
-
Ein String-Stream erwartet nunmal einen String als Konstruktor-Parameter, da reicht kein einzelner char. Und an der Stelle ist er auch nicht nötig, wenn du nur die einzelne Zieffer umrechnen willst:
meineZahl=*i - '0'PS: Diese if-Serie ab Zeile 48 ist unsinnig - ich hätte die Z*-Variablen zu einem Array zusammengefasst und dann mit
++Ziffern[meineZahl];erhöht.
-
Wo wir schon dabei sind, was soll das ganze Gesumse mit Strings überhaupt? Ich schlage Folgendes vor:
#include <iostream> int main() { unsigned Z[10] = {}; unsigned ziffern = 0; for(unsigned a = 1; a <= 1000; ++a) { for(unsigned long kubik = a * a * a; kubik != 0; kubik /= 10) { ++Z[kubik % 10]; ++ziffern; } } std::cout << "ggz = " << ziffern << '\n'; for(unsigned i = 0; i < 10; ++i) { std::cout << 'Z' << i << " = " << Z[i] << '\n'; } }Übrigens muss man aufpassen, dass kubik nicht überläuft. Auf 32-Bit-Maschinen kommt man mit unsigned long nicht weiter als 16253, auf 64-Bit-Maschinen bis 2.642.2453. Alles, was darüber hinausgeht, braucht komplexere Mathematik oder entsprechende Bibliotheken.
-
Danke, HeighLigerBiMBam, mit Arrays hatte ich nicht nicht gearbeitet. Das andere kann ich nachvollziehen, bis auf den If Ausdruch in Zeile 26/27. Wenn Du den noch mal erläuterst, bete ich heut ein Gesetz für Dich.
Danke
-
@HeighLigerBimBam
Irgendwo hast Du einen Fehler drin, denn das Programm schreibt die letzte Zeile p mal.
Entweder man nimmt das raus, oder man sortiert jetzt, indem man noch zählen läßt, wie oft jede Ziffer an der 1.,der 2. usw. Stelle kommt.
Danke
-
@Seldon
Danke für das Teil. Bei den 1 - 9-stelligen Qubikzahlen zählt es richtig.
Aber im Bereich der zehnstelligen Qubikzahlen zählt es die Ziffern der Qubikzahle definitiv falsch.
Die letzte neunstellige QubikZahl ist 999^3. Der nächste Bereich, der zehnstellige, beginnt mit 1000^3 und endet mit 2154^3. Das sind 1155 Zahlen mit 11550 Ziffern. (Das kann ich grad noch im Kopf rechnen.) Der Tool zählt aber nur 11326. Es fehlen mithin 224 Ziffern. Wo sind die geblieben?
[Session started at 2011-04-07 12:39:14 +0200.]
ggz = 11326
...Z0 = 1207
...Z1 = 1422
...Z2 = 1358
...Z3 = 1248
...Z4 = 1065
...Z5 = 973
...Z6 = 1006
...Z7 = 1103
...Z8 = 989
...Z9 = 955BequemerQZz has exited with status 0.
-
Bekell schrieb:
@HeighLigerBimBam
Irgendwo hast Du einen Fehler drin, denn das Programm schreibt die letzte Zeile p mal.
Entweder man nimmt das raus, oder man sortiert jetzt, indem man noch zählen läßt, wie oft jede Ziffer an der 1.,der 2. usw. Stelle kommt.
Danke
Dann nimm doch einfach die Ausgabe und schreib sie außerhalb der string::iterator-Schleife. War eh dämlich die selbe Variable in beiden Schleifen zu verwenden.
#include <iostream> #include <string> #include <sstream> using namespace std; int main () { int gesamtziffernzaehler = 0; int Z[10] = {0}; for(int a = 0 ; a < 5; ++a) { int kubik = a*a*a; ostringstream outStream; outStream << kubik; string p = outStream.str(); gesamtziffernzaehler += p.length(); cout << "\nSchleife: " << a+1 << "\n" << a << " Qubik = " << kubik <<"\n" << a <<" Qubik hat " <<p.length() << " Ziffern" << "\ngzz = " << gesamtziffernzaehler << "\n\n"; for (string::iterator i = p.begin(); i != p.end(); ++i) if ((*i - '0') <= 9 && (*i - '0') >= 0) ++Z[(*i - '0')]; for(int i = 0; i < 10; ++i) cout<<"Z" << i << "="<< Z[i] << "\n"; } }
-
Bekell schrieb:
Aber im Bereich der zehnstelligen Qubikzahlen zählt es die Ziffern der Qubikzahle definitiv falsch.
Die letzte neunstellige QubikZahl ist 999^3. Der nächste Bereich, der zehnstellige, beginnt mit 1000^3 und endet mit 2154^3.
seldon schrieb:
Übrigens muss man aufpassen, dass kubik nicht überläuft. Auf 32-Bit-Maschinen kommt man mit unsigned long nicht weiter als 16253, auf 64-Bit-Maschinen bis 2.642.2453. Alles, was darüber hinausgeht, braucht komplexere Mathematik oder entsprechende Bibliotheken.
Das Problem hast du aber auch, wenn du die ausgerechnete Zahl in einen String stopfst - die ist da nämlich auch schon übergelaufen.
-
Übrigens muss man aufpassen, dass kubik nicht überläuft. Auf 32-Bit-Maschinen kommt man mit unsigned long nicht weiter als 16253, auf 64-Bit-Maschinen bis 2.642.2453. Alles, was darüber hinausgeht, braucht komplexere Mathematik oder entsprechende Bibliotheken.
Das Problem hast du aber auch, wenn du die ausgerechnete Zahl in einen String stopfst - die ist da nämlich auch schon übergelaufen.
Ich hab ein Imac 2005, wo kann ich sehen, wie breit der Bus ist.
Also auf meinem Programm Magic Number Maschine kann ich bis 30 Stellen rechnen. Aber ich wollte jetzt keine Applescript-Application schreiben oder die Sache über Automator lösen. Ist der neue Imac 64-Bit mäßig construiert?
-
"Magic Number Machine" wird vermutlich long doubles benutzen. Bei Fließkommazahlen funktioniert die ganze Kiste etwas anders.
Wie breit Typen in Byte sind, kriegst du mit sizeof raus:
std::cout << "int : " << sizeof(int ) << " Byte\n" "long: " << sizeof(long) << " Byte\n";Womöglich kennt dein Compiler unsigned long long - der ist zwar im C++-Standard bisher nicht enthalten, wird aber von vielen Compilern unterstützt und ist mindestens 64 Bit (also 8 Byte) breit. Das sähe dann so aus:
#include <iostream> int main() { unsigned Z[10] = {}; unsigned ziffern = 0; // a muss auch 64 Bit breit sein, sonst läuft a * a * a vor der Zuweisung zu // kubik über. Das ist auch ein möglicher Fehler in meinem ersten Codestück. for(unsigned long long a = 1000; a <= 2154; ++a) { for(unsigned long long kubik = a * a * a; kubik != 0; kubik /= 10) { ++Z[kubik % 10]; ++ziffern; } } std::cout << "ggz = " << ziffern << '\n'; for(unsigned i = 0; i < 10; ++i) { std::cout << 'Z' << i << " = " << Z[i] << '\n'; } }Mit der Bauart von Apple-Computern kenne ich mich nicht aus. Wie breit der Bus ist, spielt dabei auch keine Rolle (es geht um die Registerbreite der CPU und ob das installierte Betriebssystem und der installierte Compiler in der Lage sind, diese zu nutzen).
Ansonsten könntest du einen Blick auf die gmplib werfen, die ich oben schon verlinkt hatte, oder Boost zur Hand nehmen und kucken, ob boost/cstdint.hpp deinem Compiler einen uint64_t entlocken kann.