Hilfe bei TAN-Programm
-
Hallo ich bin ein echter Neuling im Umgang mit C.
Wir sollen ein Programm schreiben, das 200 TAN-Nummern zufällig wiedergibt, danach eine Nummer zufällig abfragt und man damit 3 Versuche hat die Nummer einzugeben.
Ich scheitere schon bei der richtigen Sortierung der 200 TAN-Nummern
Denn bei mir werden Sie nach links und nicht nach unten nummeriert, ich weiß nicht wieso und habe viel rumprobiert. Es wäre nett, wenn mir wer helfen kann, das Programm aber in seinen Strukturen belassen könnte, also nicht alles umschreiben, damit ich meine Schritte vielleicht besser nachvollziehen kann...Wenn jemand Anmerkungen machen möchte, wie das Problem vielleicht besser zu lösen wäre, kann der das natürlich gerne schreiben.
Vielen Dank
(Das ist das Programm bis jetzt! Aber Vieles geht noch überhauptnicht´
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main()
{
int i,aiTAN[200], iAntwort, iVersuche, aiTANausw;
srand(time(0));
char cAntwort;for(i=0; i < 200; i++)
aiTAN[i]=rand() % 999*1000 + rand() % 999;for(i=1; i < 50; i++)
printf("%03i\t%06i\t", i, aiTAN[i]);for(i=51; i < 100; i++)
printf("%03i\t%06i\t", i, aiTAN[i]);for(i=101; i <150; i++)
printf("%03i\t%06i\t", i, aiTAN[i]);for(i=151; i <=200; i++)
printf("%03i\t%06i\t", i, aiTAN[i]);aiTANausw=rand ()%200;
printf("\n\nGeben Sie bitte die %i TAN ein ", aiTANausw);
scanf("%i", & iAntwort);
fflush(stdin);
iVersuche=2;
if (iAntwort==aiTAN)
{printf("Ok\n");
printf("Wollen Sie weitermachen? (j/n) ");
scanf("%c", cAntwort);
fflush(stdin);
}
if ('j')
{
printf("Geben Sie bitte die %i TAN ein ", aiTANausw);
scanf("%i", & iAntwort);
fflush(stdin);
}else
{
printf("Falsch! Sie haben noch %i Versuche\n", iVersuche--);
printf("Geben Sie die %i TAN ein ", i);
scanf("%c", cAntwort);
}
return 0;
}
-
- Die as und is vor deinen Variablennamen sind unbeliebt. Siehe auch ungarische Notation.
- Wir haben hier [ cpp ]-Tags, damit wird alles so schön bunt.
- fflush(stdin) ist böse. (Google ;))
Ansonsten verstehe ich nicht ganz warum du 4 Schleifen zur Ausgabe verwendet hast und was genau du mir sortieren meinst? Du sollst die TANs doch gar nicht sortieren?
-
Cooky hat ja schon etwas geschrieben.
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i,aiTAN[200], iAntwort, iVersuche, aiTANausw; srand(time(0)); char cAntwort; for(i=0; i < 200; i++) aiTAN[i]=rand() % 999*1000 + rand() % 999; for(i=1; i < 50; i++) printf("%03i\t%06i\t", i, aiTAN[i]); for(i=51; i < 100; i++) printf("%03i\t%06i\t", i, aiTAN[i]); for(i=101; i <150; i++) printf("%03i\t%06i\t", i, aiTAN[i]); for(i=151; i <=200; i++) printf("%03i\t%06i\t", i, aiTAN[i]); aiTANausw=rand ()%200; printf("\n\nGeben Sie bitte die %i TAN ein ", aiTANausw); scanf("%i", &iAntwort); // space fflush(stdin); iVersuche=2; if (iAntwort==aiTAN) { printf("Ok\n"); printf("Wollen Sie weitermachen? (j/n) "); scanf("%c", cAntwort); fflush(stdin); } if ('j') // ? { printf("Geben Sie bitte die %i TAN ein ", aiTANausw); scanf("%i", &iAntwort); // space - wozu liest du hier iAntwort ein ? fflush(stdin); } else { printf("Falsch! Sie haben noch %i Versuche\n", iVersuche--); printf("Geben Sie die %i TAN ein ", i); scanf("%c", &cAntwort); // add & } return 0; }
So könnte es aussehen, wenn man den "C/C++" nutzt.
Noch ein paar Kommentare im Quelltext. Aber da ist noch mehr oderMfG f.-th.
-
Sollte "C/C++ Button" heissen
Hier noch etwas:
iVersuche=2; // Was soll diese Zeile bewirken? if (iAntwort==aiTAN) // Das solltest du noch genau ansehen { printf("Ok\n"); printf("Wollen Sie weitermachen? (j/n) "); scanf("%c", cAntwort); // Hier fehlt auch noch was
MfG f.-th.
-
Entschuldigung, das [cpp]hatte ich vergessen einzufügen.
Bis jetzt ist das Alles was ich geschrieben habe.Das Programm soll nachher so aussehen:
001 983456 051 ..... 101 ...... 151
002 457281 052 ..... 102
003 123456 053 .....Dann soll kommen bitte geben Sie x TAN ein (zufällig)
Kontrolle ob das stimmt:
Wenn ja soll die Frage folgen wollen Sie weitermachen (j/n) (Endlos)Ist die Engabe falsch soll kommen:
Falsch noch 2 Versuche und erneute Eingabe.Das selbe Spiel von vorne.
Hat man alle 3 Versuche nicht geschafft soll kommen:
Sie haben den TAN-Code dreimal falsch eingegeben, ihr Konto wird gesperrt!Und danach erneut die Frage ob man weitermachen möchte.
-
Und was erwartest du jetzt? Wenn wir dir einfach die Lösung hinklatschen lernst du doch kaum etwas dabei. Beantworte doch erst mal alle Fragen die gestellt wurden.
-
Tut mir leid, natürlich erwarte ich das nicht!
mit dem iVersuche=2 wollte ich einen Wert festlegen, damit man diesen runterzählen kann und so die Versuche bei einer falschen Eingabe limitiert.
Muss bei dem iAntwort ein aiTAN hin?
Mein Hauptproblem liegt darin, dass ich nicht verstehe, wie ich die NR TAN - Zuweisung richtig mache, also das in der ersten Spalte die Nummer 001-050 aufgezeigt wird.
Wenn ich die for-Schleifen getrennt schreibe(Zahlen und TAN) dann funktioniert mein Programm nichtmehr, natürlich kann ich auch den printf-Befehl nicht auseinanderziehen.
-
du kannst mit den üblichen C-Mitteln nur zeilenweise schreiben.
Damit das dann etwa so aussieht wie du das möchtest:
for(i=1; i < 20; i++) printf("%03i\t%06i\t%03i\t%06i\t\n", i, aiTAN[i], i+100, aiTAN[i+100]);
Du weisst was aiTAN[i] bedeutet
MfG f.-th.
-
Mit
rand() % 999
ist die maximale Zahl die du bekommst 998.
-
Ernie12 schrieb:
mit dem iVersuche=2 wollte ich einen Wert festlegen, damit man diesen runterzählen kann und so die Versuche bei einer falschen Eingabe limitiert.
Muss bei dem iAntwort ein aiTAN hin?
Mein Hauptproblem liegt darin, dass ich nicht verstehe, wie ich die NR TAN - Zuweisung richtig mache, also das in der ersten Spalte die Nummer 001-050 aufgezeigt wird.
Wenn ich die for-Schleifen getrennt schreibe(Zahlen und TAN) dann funktioniert mein Programm nichtmehr, natürlich kann ich auch den printf-Befehl nicht auseinanderziehen.Erstmal zum Erzeugen der TANs:
for(i=0; i < 200; i++) aiTAN[i]=rand() % 999*1000 + rand() % 999;
Damit erzeugst Du eine Zufallszahl zwischen 0 und 998000 und addierst eine Zufallszahl zwischen 0 und 998. Insofern hast Du (unerwünschterweise) eine mögliche 0 als TAN und dafür fehlt Dir der Wertebereich ab inklusive 998999.
Stattdessen lieberfor(i=0; i < 200; i++) aiTAN[i]=((rand() % 999)+1)*1000 + ((rand() % 999)+1);
Nicht schön und etwas unnötig verklammert, aber Du schließt damit die 0 aus und die 1000 fehlenden möglichen Werte wieder ein.
Bei der TAN-Listen-Ausgabe möchtest Du dem Nutzer des Programms nicht die "Nullte" TAN in der Tabelle präsentieren, also beginnst Du mit dem Zählen bei 1... Führt aber dazu, dass Du die erste TAN nicht ausgibst und womöglich am Ende über Deine Array-Grenze hinausschießt. Ähnliche Lösung wie oben: mit +1 arbeiten.
for(i=0; i < 50; i++) printf("%03i %06i\t%03i %06i\t%03i %06i\t%03i %06i\t\n", i+1, aiTAN[i], i+51, aiTAN[i+50], i+101, aiTAN[i+100], i+151, aiTAN[i+150]);
Hierbei gibst Du in insgesamt 8 Spalten abwechselnd den Zähler und die entsprechende TAN-Nummer aus. Die 0. TAN-Nummer im Array hat für den Nutzer den Zähler 1, die 50. den Zähler 51 etc.
Wenn Du mal mit einer anderen Entwicklungsumgebung arbeitest, könnte es Dir schnell passieren, dass Dir fflush (stdin) nicht mehr das gewünschte Ergebnis liefert - das ist deshalb nicht empfehlenswert. Stattdessen lieber mit dem erwähnten Leerzeichen vorm Formatkennzeichen im scanf arbeiten
scanf(" %c", &cAntwort);
Natürlich hierbei auf das "&" bei cAntwort achten, sonst funzt das nicht.
Generell würde sich hier natürlich eine Schleife für den gesamten Ablauf anbieten. Du setzt am Anfang deine Versuche auf 2, dein cAntwort auf 'j' und beginnst mit einer do { hier gehts rund } while (cAntwort == 'j') Schleife. Am Anfang innerhalb der Schleife prüfst Du einfach ab, ob noch Versuche übrig sind und ansonsten hast Du Deine if-else-Verzweigungen. Mache Dir am Besten trotzdem einen kleinen Ablaufplan (UML oder sonstwie), was Deiner Meinung nach passiert, wenn die jeweilige scanf-Abfrage richtig / falsch war. Denn im Moment ist das "etwas" wirr
-
Vielen Dank für die detailierte Hilfestellung!
Ich bitte meine unverständlichen Formulierungen und unbeholfene Art zu entschuldigen.
Ich werde einen Plan machen und den dann abarbeiten.
Nochmal vielen Dank!
-
Du stellst Deine Fragen besser und zeigst mehr Lernbereitschaft als viele andere, insofern - keine Panik
Aber gerade für die if-else-Verzweigungen finde ich anfangs typische Programmablaufpläne toll.
Stichwort Flow-Chart ist recht hilfreich bei so einer Aufgabenstellung. Startpunkt und Ziel sind bekannt, dazwischen liegt eine oder mehrere Schleifen, die abhängig von Bedingungen wiederholt durchlaufen wird bzw. werden.
Wenn Dir der Ablauf glasklar ist, kanns nur noch an der Syntax oder einem Flüchtigkeitsfehler scheitern und da wird Dir hier schnell und gern geholfen.
Deine Denkarbeit mag Dir aber kostenlos wahrscheinlich keiner abnehmen
-
Danke,
ich werde beim nächsten Mal besser aufpassen.