Suche Hilfe für ein kleines, simples Programm :)
-
Uff.. nun wirds echt kompliziert und ich muß da ja leider auch halbwegs verstehen was dort was bewirkt, da ich ja die Antwortmöglichkeiten inzwischen von 5 auf 9 erhöht habe..
Also folgendes kann ich nicht ganz nachvollziehen:
if( n == 0 )
{
if( strcmpi( k.c_str(), "1" ) == 0 || strcmpi( k.c_str(), "2" ) == 0 ||
strcmpi( k.c_str(), "5" ) == 0 || strcmpi( k.c_str(), "4" ) == 0 ||
strcmpi( k.c_str(), "1" ) == 0 || strcmpi( k.c_str(), "e" ) )
{
done = true;
}Sollte das nicht eigentlich so sein?:
if( n == 0 )
{
if( strcmpi( k.c_str(), "1" ) == 0 || strcmpi( k.c_str(), "2" ) == 0 ||
strcmpi( k.c_str(), "3" ) == 0 || strcmpi( k.c_str(), "4" ) == 0 ||
strcmpi( k.c_str(), "5" ) == 0 || strcmpi( k.c_str(), "e" ) )
{
done = true;
}und wenn nicht? Wo steht, was passiert, wenn man bei Frage 1 die 3 drückt und warum ist die 1 zwei mal vorhanden? *verwirrt bin*
MfG,
Tanuka
-
Oh, schusselheitsfehler... Na klar muss es da so stehen, wie du es verbessert hast...
MfG Aoeke
-
Ah, gut, dann blicke ich da ja doch annähernd durch
Ich war schon total verwirrt :pAlso habe das so eingebaut und wie du befürchtet hast, stürzt das Programm ab, nachdem man die Alterseingabe eingetippt hat.
MfG,
Tanuka
-
Gut.. Dann folgendes:
// ANSTATT DIESEM STUECKCHEN CODE else if( n == 3 ) // wenn die vierte Frage dran war { code[n].code = alle_codes[n][0].code; // hol den Code aus der alle_codes variable // KANN SEIN, DASS ER BEI DIESER ZEILE ABSTUERZT // ICH HABE DEV NICHT MEHR DRAUF UND KONNTE ES NICHT TESTEN // WENN ER ABSTUERZT, MELDE DICH EINFACH NOCHMAL strncat( code[n].code, k.c_str(), strlen( k.c_str() ) ); // haenge die // Eingabe an den Code heran return 1; // gebe 1 zurueck } // NIMMST DU DIESEN: else if( n == 3 ) // wenn die vierte Frage dran war { code[n].code = alle_codes[n][0].code; // hol den Code aus der alle_codes variable // haenge die Eingabe an den Code heran gebe 1 zurueck string tmp; tmp.insert( tmp.size(), code[n].code ); tmp.insert( tmp.size(), k ); strcpy( code[n].code, tmp.c_str() ); return 0; }
Dann muesste es funktionieren...
MfG Aoeke
-
Da stürzt er immer noch nach der eingabe des Alters ab..
Und müsste das nicht eigentlich statt:
string tmp;
tmp.insert( tmp.size(), code[n].code );
tmp.insert( tmp.size(), k );
strcpy( code[n].code, tmp.c_str() );
return 0;
}string tmp;
tmp.insert( tmp.size(), code[n].code );
tmp.insert( tmp.size(), k );
strcpy( code[n].code, tmp.c_str() );
return 1;
}lauten? Also return 1 und nicht 0?
Aber auch mit 1 stürzt er da ab..
Liebe Grüße,
Tanuka
-
Mist... Natürlich muss da dann auch wieder "return 1;" stehen... Aber das weißt du jetzt inzwischen ja selber... Wegen dem anderen Fehler, muss ich eben doch wieder dev installieren.. Ich melde mich dann nochmal...
MfG Aoeke
-
Hehe, finde ich Lustig.. ich habe zwar keine Ahnung von C++ aber erkenne trotzdem, nur durch Logik, Fehler im Quelltext
Mir macht das langsam richtig Spaß.. vielleicht sollte ich doch mal anfangen C++ zu lernen
Also dann warte ich mal auf deine Antwort
MfG,
Tanuka
-
Sooo. Sorry, dass ich mich erst wieder so spaet melde, hatte aber wegen eines anderen Projekts gerade voll Zeitstress...
Naja, ich habe den Code noch mal ein bisschen mehr veraendert, deshalb poste ich ihn jetzt auch noch einmal komplett. Die veraenderten Stellen sind mit einem Kommentar gekennzeichnet.//--------------------------------------------------------------------------- #include <iostream> #include <string> #include <stdio.h> #include <conio.h> using namespace std; //--------------------------------------------------------------------------- /////////////// NEU /////////////// typedef struct { string code; // HIER jetzt string } s_code; /////////////// NEU /////////////// const int anzahl = 4; // Anzahl der Fragen // hier stehen alle Codes, fuer alle moeglichen Antworten drin s_code alle_codes[anzahl][5]; /////////////// NEU /////////////// // Funktion, mit der man die moeglichen Antworten "fuellen" kann void SetAnswers( int i, string a0, string a1, string a2, string a3, string a4 ) { alle_codes[i][0].code = a0; alle_codes[i][1].code = a1; alle_codes[i][2].code = a2; alle_codes[i][3].code = a3; alle_codes[i][4].code = a4; } /////////////// NEU /////////////// s_code code[anzahl]; // der Code, der erstellt werden soll int fragen( int n ); // diese Funktion stellt die Fragen int main() { /////////////// NEU /////////////// // Moegliche Antworten "fuellen" SetAnswers( 0, "A1", "A2", "A3", "A4", "A5" ); // moegliche Antworten fuer 1. Frage SetAnswers( 1, "B1", "B2", "B3", "B4", "B5" ); // ... SetAnswers( 2, "C1", "C2", "C3", "C4", "C5" ); // ... SetAnswers( 3, "Y-", "Y-", "Y-", "Y-", "Y-" ); // ... /////////////// NEU /////////////// string txt = ""; // der komplette Code in einem string // zum Speichern und Ausgeben string filename = ""; // der Name der zu erstellenden Textdatei /////////////// NEU /////////////// // hier jetzt auch string string k = ""; // die gedrueckte Taste /////////////// NEU /////////////// do { system( "cls" ); txt = ""; int n = 0; // erste Frage do { int r = fragen( n ); // stelle die Frage und schreibe den // Rueckgabewert in eine Variable if( r == 0 ) // wenn '0' zurueckgegeben wurde { cout << endl << "Moechten Sie wirklich beenden? J/N" << endl; cin >> k; /////////////// NEU /////////////// // hier jetzt auch stricmp if( stricmp( k.c_str(), "j" ) == 0 ) { return 0; // beende das Programm } /////////////// NEU /////////////// } else // andernfalls { n += r; // springe zur naechsten // oder zur vorherigen Frage } cout << endl; } while( n < anzahl ); // wenn alle Fragen durch sind cout << endl; cout << "----------------------------------------------------------------------" << endl << endl; cout << "Code: "; for( int a = 0; a < anzahl; a++ ) // Code fuer jede Frage einzeln durchlaufen { // den aktuellen Code zu der Variable fuer den kompletten Code hinzufuegen txt.insert( txt.size(), code[a].code ); // wenn wir nicht beim letzten Code sind if( a != anzahl-1 ) { txt.insert( txt.size(), " " ); } } cout << txt << endl << endl; // den Code ausgeben cout << "----------------------------------------------------------------------" << endl << endl; cout << "[E] zum Beenden druecken." << endl; // Hinweis zum Beenden cout << "Eine andere Taste druecken, um an den Anfang zu springen" << endl; cin >> k; /////////////// NEU /////////////// // hier jetzt auch stricmp } while( stricmp( k.c_str(), "e" ) != 0 ); // Wenn nicht 'E' oder 'e' gedrueckt wurde // beginne von vorne /////////////// NEU /////////////// cout << endl; cout << "----------------------------------------------------------------------" << endl << endl; cout << "Geben Sie jetzt bitte den kompletten Pfad und den Namen der" << endl; cout << "Textdatei an, in der das Ergebnis gespeichert werden soll!" << endl; cout << endl << "Datei: "; cin >> filename; cout << endl; cout << "----------------------------------------------------------------------" << endl << endl; FILE *file; // Dateihandle file = fopen( filename.c_str(), "w" );// Datei oeffnen / erstellen if( !file ) // Wenn das Handle ungueltig ist { // Gebe Hinweis aus und beende cout << "Die Datei konnte nicht erstellt werden werden." << endl; cout << "Das Programm wird beendet!" << endl; return 0; } cout << "Die Datei wird erstellt..."; fwrite( txt.c_str(), txt.size(), 1, file ); // schreibe Code in die Datei fclose( file ); // schliesse die Datei cout << endl << "Die Datei wurde erstellt!" << endl; // Hinweis ausgeben cout << endl; cout << "----------------------------------------------------------------------" << endl << endl; cout << "Beliebige Taste zum Beenden druecken." << endl; cin.clear(); // nach Tastendruck beenden cin.ignore( std::cin.rdbuf() -> in_avail() ); cin.get(); return 0; // beenden } //--------------------------------------------------------------------------- int fragen( int n ) { string k = ""; // die gedrueckt Taste bool done = false; if( n == 0 ) // die richtige Frage stellen { cout << "1. Wie alt bist du?" << endl; cout << "[1] Zwischen 18 und 25 Jahre" << endl; cout << "[2] Zwischen 25 und 35 Jahre" << endl; cout << "[3] Zwischen 35 und 45 Jahre" << endl; cout << "[4] älter als 45 Jahre" << endl; cout << "[5] Bin mir nicht sicher :P" << endl; } else if( n == 1 ) { cout << "2. Wieviele Geschwister hast du?" << endl; cout << "[1] Einen Bruder" << endl; cout << "[2] Eine Schwester" << endl; cout << "[3] Zwei Geschwister" << endl; cout << "[4] Mehr als zwei Geschwister" << endl; cout << "[5] Keine Geschwister" << endl; cout << "[B] zur voherigen Frage zurueckspringen" << endl; } else if( n == 2 ) { cout << "3. Bist du einsam?" << endl; cout << "[1] Ja total" << endl; cout << "[2] Ja ein bisschen" << endl; cout << "[3] Eigentlich nicht" << endl; cout << "[4] Nein" << endl; cout << "[5] Was heisst das?" << endl; cout << "[B] zur voherigen Frage zurueckspringen" << endl; } else if( n == 3 ) { cout << "Wann hast du dich das erste Mal verliebt?" << endl; cout << "Alter: "; } do { // lasse solange eine Taste eingeben, bis es eine Taste von 1-5 oder 'B' oder 'b' // war cin >> k; // wenn erste frage dran war if( n == 0 ) { /////////////// NEU /////////////// // Hier war ein kleiner Fehler (ausser der falschen Reihenfolge :) ) // in der 3. Zeile des if-Statements muss natuerlich auch mit 0 // verglichen werden... Dass hatte ich vorher glaube ich vergessen if( stricmp( k.c_str(), "1" ) == 0 || stricmp( k.c_str(), "2" ) == 0 || stricmp( k.c_str(), "3" ) == 0 || stricmp( k.c_str(), "4" ) == 0 || stricmp( k.c_str(), "5" ) == 0 || stricmp( k.c_str(), "e" ) == 0 ) /////////////// NEU /////////////// { done = true; } } // wenn eine der anderen Fragen dran war (mit Ausnahme von denen, // wo die Eingabe zum Code hinzugefuegt werden soll else if( n > 0 && n != 3 ) { /////////////// NEU /////////////// // Hier war auch der Fehler in der 4. Zeile des if-Statements if( stricmp( k.c_str(), "1" ) == 0 || stricmp( k.c_str(), "2" ) == 0 || stricmp( k.c_str(), "3" ) == 0 || stricmp( k.c_str(), "4" ) == 0 || stricmp( k.c_str(), "5" ) == 0 || stricmp( k.c_str(), "b" ) == 0 || stricmp( k.c_str(), "e" ) == 0 ) /////////////// NEU /////////////// { done = true; } } // wenn eine Frage dran war, wo die Eingabe hinzugefuegt werden soll else if( n == 3 ) { if( strlen( k.c_str() ) > 0 ) { done = true; } } } while( !done ); if( stricmp( k.c_str(), "e" ) == 0 ) // wenn "e" oder "E" gedrueckt wurde { return 0; // gebe 0 zurueck } else if( stricmp( k.c_str(), "b" ) == 0 ) // wenn "B" oder "b" gedrueckt wurde { return -1; // gebe -1 zurueck } else if( n == 3 ) // wenn die vierte Frage dran war { /////////////// NEU /////////////// // diesmal klappt es auch mit dev-cpp :) code[n].code = alle_codes[n][0].code; // hol den Code aus der alle_codes variable code[n].code.insert( k.size(), k ); // fuege die Eingabe hinzu return 1; // gebe 1 zurueck /////////////// NEU /////////////// } else // andernfalls { int ascii = int( k[0] ) - 49; // schreibe den Asciiwert der // gedrueckten Taste in eine Variable code[n].code = alle_codes[n][ascii].code; // schreibe den Code return 1; // gebe 1 zurueck } }
Fuer weitere Fragen bin ich weiterhin offen...
MfG Aoeke
-
Hi Aoeke,
nun läuft das wirklich super.. bin gerade bei der 11ten Frage und bisher funktioniert alles so, wie es soll *freu*
Praktisch wäre es noch, wenn er das Programm im Vollbildmodus starten würde.
Ansonsten kann ich mich nur nochmals ganz herzlich bei dir für deine Mühe bedanken
Ich melde mich dann nochmal, wenn ich das Programm fertig habe oder unerwartete Probleme auftauchen.. Werden wohl übrigens doch so an die 40 Fragen, statt der erwarteten 25
Liebe Grüße,
Tanuka
-
Vollbild:
// inlclude Anweisung hinzufuegen #include <windows.h> [...] // dann unter dem Funktionsrumpf von "SetAnswers()" void FullScreen() { keybd_event( VK_MENU , 0x38 , 0 , 0 ); keybd_event( VK_RETURN , 0x1c , 0 , 0 ); keybd_event( VK_RETURN , 0x1c , KEYEVENTF_KEYUP , 0 ); keybd_event( VK_MENU , 0x38 , KEYEVENTF_KEYUP , 0 ); } [...] // Dann als erste Zeile von "main()" int main() { FullScreen(); [...]
MfG Aoeke