Seite 1 von 5
Und nun ein C++-Problem...
Verfasst: 14.01.2010 16:55
von P7BB
Hallo,
ihr müsste auch denken "Sucht der sich jetzt mal ne Sprache aus?", oder?

Also ich habe heute ein altes C++-Buch nochmal rausgekramt und dann ein bisschen experimentiert. Funktioniert soweit auch...
Code: Alles auswählen
// Test.cpp
#include <iostream>
#include <windows.h>
#include <time.h>
using namespace std;
int main() {
int loop;
int max;
cout << "Geben Sie die Zahl ein, bis zu der gezaehlt werden soll:" << endl;
cin >> max;
cout << "==================================================" << endl;
for(loop = 0;loop <= max;++loop) {
cout << loop << endl;
ShellExecute(0, "open","http://localhost/Homepages/test.php?zahl=" + loop, NULL, NULL, SW_SHOWNORMAL);
}
}
So, das Problem ist nun das öffnen der Internetadresse.
Die seite öffnet sich zwar und es wird auch die richtige seite aufgerufen, aber es wird nicht "zahl=0", "zahl=1",... übergeben, sondern immer nur "zahl="

Ich vermute, dass es daran liegt, dass loop ein integer ist, aber ein string an der stelle benötigt wird.
wenn ich das ganze umbaue, sodass ich einer variable path den pfad zuweise und dann sage
dann erhalte ich lediglich zahl=☺ und zahl=☻ (♥,♦,♣,♠,•,◘,○, usw.), aber nicht die entsprechende zahl...
Umwandlungsversuche wie etwa
haben ebenfalls nicht funktioniert
- P7BB
Re: Und nun ein C++-Problem...
Verfasst: 14.01.2010 19:50
von Pyramide
C(++) ist halt keine Scriptsprache, die im Zweifelsfall versucht zu erraten, was der Programmierer gemeint haben könnte

. Mit sprintf("blablah %d", int) kannst du die Variable in den Text einfügen.
Re: Und nun ein C++-Problem...
Verfasst: 14.01.2010 20:48
von P7BB
wofür steht "blablah" in dem fall? für einen variablennamen oder für den Pfad als String? Und int steht für "loop", oder?
Re: Und nun ein C++-Problem...
Verfasst: 14.01.2010 21:36
von Pyramide
blahblah steht für beliebigen text und int steht für eine int-Variable.
Re: Und nun ein C++-Problem...
Verfasst: 15.01.2010 09:16
von P7BB
Code: Alles auswählen
ShellExecute(0, "open","http://localhost/Homepages/test.php?zahl=" + sprintf("%d", loop), NULL, NULL, SW_SHOWNORMAL);
Das funktioniet leider nicht...
Oder muss das so aussehen:
Code: Alles auswählen
ShellExecute(0, "open",sprintf("http://localhost/Homepages/test.php?zahl=%d", loop), NULL, NULL, SW_SHOWNORMAL);
- P7BB
Re: Und nun ein C++-Problem...
Verfasst: 15.01.2010 18:15
von gn#36
weder noch.
sprintf hat keinen String als Rückgabewert sondern benötigt die Adresse eines Char Arrays als Parameter. Du musst also schon vorher ein Array der entsprechenden Größe anlegen und das dann eben angeben. Alternativ machst du das ganze nicht mit Char Arrays (auch C-Strings genannt) sondern mit C++ Strings. Da kannst du dann tatsächlich mit + weiteren Text anhängen wenn du willst.
Ich würde dir übrigens dringend raten dich erst mal mit ein paar Tutorials zu befassen, String Manipulationen gehören eigentlich zu den Grundlagen, auch wenn das in C nicht unbeding immer so einfach geht und sollten in jedem vernünftigen Tutorial vorkommen.
Abgesehen davon ist die letzte Frage völlig überflüssig. Wenn du noch mögliche Lösungen kennst kannst du sie auch genau so gut ausprobieren.
Re: Und nun ein C++-Problem...
Verfasst: 26.01.2010 18:46
von P7BB
Hallo,
ok, ich habe nun ein anderes Problem:
Code: Alles auswählen
for(loop = 1;loop <= max;++loop) {
for(i = 2;i < loop;++i) {
if(loop / i == ceil(loop / i)) {
cout << loop << endl;
}
}
}
Dieser Ausschnitt soll bis zu einer bestimmten zahl "max" alle primzahlen auflisten. Jedoch ist das ergebnis, dass
jede Zahl mehrfach angezeigt wird, aber ohne Regelmäßigkeit. ich zitiere einfach mal das Resultat, wenn "max" 100 ist:
http://www.phpbb.de/support/pastebin.ph ... view&s=383
Hab ich da irgendwie einen Denkfehler, der diese seltsamme Ausgabe verursacht? o.O
Re: Und nun ein C++-Problem...
Verfasst: 26.01.2010 21:15
von gn#36
Tja da hast du definitiv ein paar Denkfehler drin.
Der erste Punkt ist, auch wenn ich das nicht ganz genau beurteilen kann da du in deinem Schnipsel keine Deklarationen hast, dass C nicht PHP ist und sich auch bei Berechnungen teilweise ein bisschen anders verhält, denn C konvertiert Datentypen nur wenn es unbedingt notwendig ist. Um zu sehen was ich meine rate ich dir mal eine ganz einfache Rechnung die nicht glatt aufgeht mit PHP durchzuführen und anschließend noch mal mit C, z.b. 7/4. PHP führt hier eine Datentypkonversion durch und liefert dir das korrekte Ergebnis 1.75. C hingegen bleibt bei Integerwerten und liefert dir stattdessen das Ergebnis der Integerdivision: 1
Das darfst du auch in diesem Fall nicht ignorieren, selbst wenn alle betrachteten Zahlen Integer sind musst du C mitteilen dass es dir um genaue Ergebnisse geht, nicht nur um Integer.
Wenn du das machst wird das aber dennoch nicht zum Erfolg führen, denn für eine Primzahlendetektion ist diese Abfrage völlig unsinnig. Deine Abfrage gibt alle Fälle aus in denen die Division glatt aufgeht, für da die ceil Funktion einen Double oder Float erwarten dürfte (alles andere wäre Unsinn) dürfte eine automatische Typkonversion stattfinden.
Wenn du Primzahlen willst, dann musst du das andersherum angehen. Du erstellst eine Variable die den Primzahlenstatus der aktuellen Zahl enthält und setzt diesen auf false sobald du in der Schleife eine Zahl findest durch die du teilen kannst.
Dann kannst du das ganze noch optimieren, du musst z.b. nur bis zur Wurzel der Zahl suchen, nicht bis zur Zahl selbst, wenn du eine ganze Liste ausgeben willst kannst du außerdem jede zweite Zahl sofort ignorieren da sie durch zwei teilbar ist (also in der äußeren Schleife statt ++zahl zahl = zahl + 2). Außerdem gibt es für die Frage ob eine Division aufgeht oder nicht eine simplere Lösung als dieser haarsträubende Vergleich der möglicherweise sogar compilerabhängig ist: der modulo Operator.
Re: Und nun ein C++-Problem...
Verfasst: 26.01.2010 21:51
von P7BB
Ok, einen Teil von dem, was du gesagt hast, hab ich schon rausgefunden

Deshalb sind zahlen grundsätzlich schonmal double

Am besten poste ich den ganzen Code mal:
Code: Alles auswählen
// Test.cpp
#include <iostream>
#include <windows.h>
#include <time.h>
#include <math.h>
using namespace std;
int main() {
double loop;
double i;
double max;
double rest;
boolean prim;
cout << "Geben Sie die Zahl ein, bis zu der gezaehlt werden soll:" << endl;
cin >> max;
cout << "==================================================" << endl;
for(loop = 1;loop <= max;++loop) {
for(i = 2;i < loop;++i) {
rest = loop % i;
cout << rest << endl << endl;
if(rest != 0) {
// cout << loop;
}
}
// cout << endl;
}
}
Der Code ist momentan abgeändert, da ich in einem anderem Forum gesehen habe, dass ich das mit rest machen soll, aber trotzdem gibts dort einen ziemlich ähnlichen fehler, da "rest" teilweise sogar den wert 38 und sowas hat... o.O
Re: Und nun ein C++-Problem...
Verfasst: 26.01.2010 22:33
von gn#36
Irgendwie hast du überhaupt nichts von dem berücksichtigt was ich geschrieben habe. Du kannst nicht mit einem einzigen Vergleich entscheiden ob die Zahl eine Primzahl ist oder nicht, genau so viele Vergleiche bleiben dir aber wenn du die Ausgabe in der inneren Schleife machst. Übrigens dürfte die Modulo Operation bei Doubles eigentlich Probleme verursachen, denn ein Double ist - je nach dem wie er genau definiert wird - niemals genau gleich 0. Ich kann mir auch kaum vorstellen dass du das so kompiliert hast, jedenfalls bei mir geht das (unter Berücksichtigung der Tatsache das windows.h unter Linux nicht existiert und auch math.h und time.h überflüssig sind) nicht. boolean ist kein Standard, nimm lieber bool, außerdem meckert abgesehen von diesen Fehlern der Kompiler sofort dass die Modulo Operation für Doubles nicht definiert ist. Hier musst du integer nehmen, genau dafür ist das ganze da.
Also:
- Keine doubles verwenden wenn du Modulo nimmst (und die andere Variante wird auch nicht funktionieren, als Regel: Niemals Doubles mit == vergleichen, die chance dass zwei unterschiedliche Operationen auf die letzte Nachkommastelle exakt identisch sind ist extrem gering)
- Ein cout in der inneren Schleife ist - wenn es dir Primzahlen liefern soll - auf jeden Fall falsch.
- Setz' dir eine Hilfsvariable in der inneren Schleife um zu wissen dass die betrachtete Zahl keine Primzahl ist
- Es kann nur eine Primzahl sein, wenn du keine kleinere Vergleichszahl findest, bei der bei der Modulo Operation eine 0 herauskommt.
- Du musst nur bis zur Wurzel der Zahl suchen, alles drüber kann kein Teiler mehr sein (frag nicht nach einem Beweis, ich habe mir nur die Tatsache gemerkt dass dem so ist).
- Probier keine geraden Zahlen, die sind auf keinen Fall prim, es sei denn es geht um die zwei.