Hilfe bei TAN-Programm



  • 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 oder 😕

    MfG 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 lieber

    for(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.
    🙂


Anmelden zum Antworten