Benutzernamen und Pin Prüfung mit Variablen aus der Datenbank-Wie geht das?



  • Es steht im Rechnerprogramm nur einmal - ich habe es in der Funktion nicht enthalten und genau das ist wie geschrieben mein Problem ich weiss nciht wie ich es meinem programm begreifbar machen soll den [i.] Pin zu übergeben und zu prüfen.

    Und wenn ich es vordefiniere ist es ja nicht veränderbar - oder sehe ich das falsch. Eine definierte Variable kann ich nur innerhalb eines Typs oder einer höhrern Variable, durch zuweisung ändern.

    Und genau in diesem Teil liegt das Problem:

    cout << "Geben Sie Ihren Namen ein: ";
      cin >> Anmeldename;
      //cout << "Geben Sie Ihren Pin ein: ";
      //cin >> Anmeldepin; //clrscr ();
    
        for(i=1;i<=69;i++)
          {            
    
                            if(!strcmp(Anmeldename,Name[i]) )
                            {
    
                             cout<< "Anmeldename gefunden\n";
                             bool pin;
                             pin=pineingabe(pin);
                             if( pin==true )   // Bedingung
                             {
                             cout<<"Programm läuft!";       // wahr-Block
                             }
                              n=i;
                            }
    
          }
    
    bool pineingabe(char richtigepin[12])
    { char eingabepin[12];
      int Versuch,i;
      char Pin [69][12];
      !strcmp(eingabepin,Pin[i]);
      bool ergebnis;
      Versuch=0;
      top:
      cout << "Bitte die Pin eingeben: "; // Ausgabe
      cin >> eingabepin; // Eingabe
    
         if( Versuch <2 )   // Bedingung
         {
             Versuch++;
    
            if( eingabepin==richtigepin )   // Bedingung
            { ergebnis=true;       // wahr-Block
              cout<< " Vielen Dank für Ihre Anmeldung.";
              sleep(2);
              clrscr();
            }
            else
            {//ergebnis= false;
             cout<< "Die "<<Versuch<<".Eingabe war nicht korrekt. Bitte Versuchen Sie es erneut.";
             sleep(2);
             clrscr();
             goto top;
            }
    
         }
         else
         {
           cout<< " Die Logindaten sind verkehrt! \n Es ist keine weitere Eingabe möglich!";
           sleep(2);
           ergebnis = false;
           //exit(0);
                 // falsch-Block
         }
    
          return (ergebnis);
    }
    

    Ich verlange keinen kompletten Quelltext - Ich möchte nur wissen und verstehen was mein Fehler ist! Und wie es besser ist. natürlich kann ich auch in der Struktur vordefinieren der Schüler hat 0 punkte und Augabenanzahl. Allerdings ist das auch so wenn das programm geschlossen wird?
    Weil dann könnte ich mir dieses Datenbankprogramm sparen und alles Definieren und wie jetzt auch den Anfang und das Ende des Programms lassen!? 😕



  • Bist du einfach nur dumm oder kannst du nicht lesen? 😡
    Es wurde schon mehrmals gesagt, dass du keine Sprungbefehle, keine Sleep , std::string und lokale Deklarationen nutzen sollst!



  • Danos schrieb:

    Ich möchte nur wissen und verstehen was mein Fehler ist!

    Wo kommen die Daten her? Du vergleichst deinen Eingabestring ohne das bereits in dem Namensarray Daten liegen.

    Lehrt euer Lehrer euch wirklich goto? Dafür gibt es Schleifen (goto gehört jedenfalls nicht in sauberen Code für Hochsprachen). Ebenso gibt es seit 1998 einen C++ Standard, und auch Lehrer sollten sich irgendwann mal damit auseinander setzen.

    Danos schrieb:

    Allerdings ist das auch so wenn das programm geschlossen wird?

    Konsolenprogramme müssen sich automatisch am Schluss beenden. Das liegt an der Art wie eine Konsole arbeitet. Man gibt etwas ein (z.B. den Programmnamen um dieses Programm zu starten), und erwartet am Schluss das man den nächsten Befehl eingeben kann. Wenn das Programm nicht schließen würde, kommt man nicht wieder auf die Kommandozeile.



  • EOutOfResources schrieb:

    Bist du einfach nur dumm oder kannst du nicht lesen? 😡
    Es wurde schon mehrmals gesagt, dass du keine Sprungbefehle, keine Sleep , std::string und lokale Deklarationen nutzen sollst!

    Ich denke solche Beschimpfungen müssen wahrlich nicht sein, zumal du selber oft genug "dummes" Zeugs postest. Eine gewisse Netiquette sollte doch möglich sein.

    Da Danos offenbar nicht bereit ist mit dem ihm zur Verfügung gestellten code weiterzuarbeiten und offenbar auch nicht willens ist, sich die Grundkenntnisse anzueigenen wäre die einfachste Möglichkeit einfach nicht mehr zu antworten.



  • Die Frage ist ob du lesen kannst - das Problem liegt nicht an:

    EOutOfResources schrieb:

    Bist du einfach nur dumm oder kannst du nicht lesen? 😡
    Es wurde schon mehrmals gesagt, dass du keine Sprungbefehle, keine Sleep , std::string und lokale Deklarationen nutzen sollst!

    Denn meine Frage ist: wie schaffe ich es das meine Funktion - die funktioniert auch läuft! Und nicht ob dir mein veralteter Kuddelmudddelstil gefällt oder nicht! 😉

    Also wer von uns scheint der dümmere zu sein!

    Bring doch mal einen Lösungsansatz und die nutz diese Art von Kommentaren lieber zum veredeln von Toilettenpapier.

    Oder erklär mir sachlich und verständlich, was ich wie verbessern kann.
    Mit Fachbegriffen und sonstigen Kürzeln rumwerfen kann jeder, alles als schlecht erklären kann jeder!

    Aber einem fast Laien etwas so erklären, dass er eine komplitzierte Anwendung versteht kann nicht jeder.

    Un du scheinst JEDER zu sein!

    Mein Wissen ist:
    -Einfacher Aufbau eines Programmes (wahrscheinlich aus der Steinzeit)
    -Eingabe und Ausgabe (von AnnoXXX)
    -Operatoren
    -Programmstrukturen (eine einfache Sequenz, Einfache Verzweigung, Mehrfache Verzeigung, Wiederholschleife mit Austrittsbedingung, Wiederholschleife mit Eintrittsbedingung, Wiederholschleife mit fester Wiederholanzahl)
    - Funktionen
    - Felder(Arrays)
    - Dateioperationen

    Ich weiß, dass mein Wissen in Sachen Programmierung begrenzt ist - aber man kommt auch mit einfachen Mitteln ans Ziel - normalerweise.
    Und ich hatte gehofft, dass sich hier soviele schlaue und programmier Erfahrene tummeln, das ich so ans Ziel komme, Und das mit meinen begrentzen Mitteln und Wissensstand.



  • [quote="asc"]

    Wo kommen die Daten her? Du vergleichst deinen Eingabestring ohne das bereits in dem Namensarray Daten liegen.

    Die Daten lege ich doch mit meinem Datenbankprogramm an. Zumindest ersteinmal einen Admin (Lehrer) und einen Tester(=Schüler).

    Lehrt euer Lehrer euch wirklich goto? Dafür gibt es Schleifen (goto gehört jedenfalls nicht in sauberen Code für Hochsprachen). Ebenso gibt es seit 1998 einen C++ Standard, und auch Lehrer sollten sich irgendwann mal damit auseinander setzen.

    Nein, gotxy(,); ist ein Befehl aus seinen Scipten - aber Not macht erfinderisch - bzw. habe ich dies in einem Quelltext gesehen und verwendet und es klappt ganz gut - ich könnte es auch mit do while machen, aber nur weil es unsauber ist, bedeutet es ja nicht das es schlecht ist.

    Danos schrieb:

    Allerdings ist das auch so wenn das programm geschlossen wird?

    Konsolenprogramme müssen sich automatisch am Schluss beenden. Das liegt an der Art wie eine Konsole arbeitet. Man gibt etwas ein (z.B. den Programmnamen um dieses Programm zu starten), und erwartet am Schluss das man den nächsten Befehl eingeben kann. Wenn das Programm nicht schließen würde, kommt man nicht wieder auf die Kommandozeile.

    Wenn ich statt meinem Datenbankprogramm den Tester und den Admin vordefiniere und die Aufgabenanzahl und Punktanzahl von [i] = 0 setze ob das Auswirkungen bei einem Neustart des Programms hat. Allerdings erübrigt sich die Frage da das Einlesen nach dem Definieren erfolgt und die Einzelen Werte ja aus der Rechnerei.dat geladen werden, die nach der erst Nutzung abgespeichert wurden.

    Allerdings habe ich immer noch keinen Lösungsansatz für mein Problem.



  • Danos schrieb:

    Bring doch mal einen Lösungsansatz und die nutz diese Art von Kommentaren lieber zum veredeln von Toilettenpapier.

    Fakt ist aber auch, das du selbst nicht gelesen, oder Hilfe ignoriert hast. Es gibt einen gepinnten Thread mit den Titeln "Wichtig: Du brauchst Hilfe?". Ins besondere "Stell deine Fragen präzise" und "Reduziere Codebeispiele auf das Wesentliche" solltest du wahrnehmen.

    Grundsätzlich ist dein Code zu lang, und unlesbar, um ihn einfach mal so eben nebenher durch zu arbeiten. Bedenke bitte auch die nötige Zeit, die nicht jeder einfach so aufbringt.

    Danos schrieb:

    Mein Wissen ist:
    - Einfacher Aufbau eines Programmes
    - Eingabe und Ausgabe
    - Operatoren
    - Programmstrukturen (eine einfache Sequenz, Einfache Verzweigung, Mehrfache Verzeigung, Wiederholschleife mit Austrittsbedingung, Wiederholschleife mit Eintrittsbedingung, Wiederholschleife mit fester Wiederholanzahl)
    - Funktionen
    - Felder(Arrays)
    - Dateioperationen

    Schade das nicht zumindest Strukturen mit auf der Liste stehen, weil die Art und weise, wie die "Datenbank" definiert ist einfach nur schlecht (und unleserlich) zu nennen ist.

    Danos schrieb:

    Ich weiß, dass mein Wissen in Sachen Programmierung begrenzt ist - aber man kommt auch mit einfachen Mitteln ans Ziel - normalerweise.

    char-Arrays usw, sind nicht unbedingt das, was man als "einfach" bezeichnen kann. Zwar mag es aus Rechnersicht einfach sein, aus Anwendersicht gibt es nicht ohne Grund die string-Klasse.

    Ich möchte mal ein kleines Beispiel geben was wesentlich besser lesbar wäre:

    // Statt
    int Punkte[69], Aufgabenanzahl[69];
    char Name[69][100];
    char Pin[69][12];
    char Anwender[69][20];
    
    // Wäre folgendes wesentlich lesbarer:
    struct Anwender
    {
      int Punkte;
      int Aufgabenanzahl;
      string Name;
      string Pin;
      bool IstLehrer;
    };
    
    Anwender anwender[69];
    

    Was du aber auf keinen Fall erwarten kannst ist, das du von uns Hilfestellung bekommst, die auf schlechten Code basiert. Dieses Forum soll helfen, und dies umfasst auch das man sauberen Code gezeigt bekommt.

    1. Es gibt immer nur [b]einen Einstiegspunkt (int main) in einem Programm.[/b]

    Dies ist der erste Grundlegende Fehler, bitte umgehend beheben. Ich gehe davon aus, das die zweite main-Funktion die richtige sein soll.

    Zudem bitte: Includes bitte immer am Anfang der Datei, und sinnvoll einrücken (und einheitlich, und nicht zu tief [ich ziehe z.B. 4 Zeichen vor, im Forum 2]). Zudem im Forum niemals auskommentierte Codezeilen einfügen, der Code ist so schon schwer genug zu lesen.

    // ... Beispiel für (eine mögliche) sinnvolle Formatierung:
        cout << "Geben Sie Ihren Namen ein: ";
        cin >> Anmeldename;
    
        for(int i=1; i<=69; i++) // <-- Man kann i auch lokal deklarieren
        {            
            if(strcmp(Anmeldename, Name[i]))
                continue; // Nicht wundern, ich vermeide tiefe Verschachtelungen
    
            cout<< "Anmeldename gefunden\n";
            // Hier wolltest du wohl die aktuelle Pin übergeben, zudem solltest
            //  du identische Bezeichner vermeiden, und deine Variablen sprechend
            //  benennen.
            bool istPinOkay = pineingabe(Pin[i]);
            if(istPinOkay)
                cout<<"Programm läuft!";       // wahr-Block
        }
        // ...
    


  • Danos schrieb:

    Lehrt euer Lehrer euch wirklich goto?...

    Nein, gotxy(,); ist ein Befehl aus seinen Scipten

    gotocy hat mit goto nichts, aber auch gar nichts zu tun.

    Danos schrieb:

    ich könnte es auch mit do while machen, aber nur weil es unsauber ist, bedeutet es ja nicht das es schlecht ist.

    Doch, genau das ist es. Es zerstört den Programmablauf, und verleitet zur Spagetti-Programmierung.

    Allerdings habe ich immer noch keinen Lösungsansatz für mein Problem.

    Du hast einige gravierende Fehler in deinen Programm. Den auf Anhieb gefundenen (siehe auch Vorpost) solltest du auch selbst sehen:

    //...
    bool pin;
    pin=pineingabe(pin);
    //...
    

    Du übergibst hier einen (noch dazu uninitialisierten) boolwert, keinen string.



  • Ich hab dir mal ne Pineingabe geschrieben. Es ist mir egal, ob du den Code verstehst, ebenso ist es mir egal, ob der code anderen gefällt. Hauptsache du gibts Ruhe 🙄

    PIN richtig beim ersten Versuch: http://ideone.com/K0EYT
    PIN richtig beim zweiten Versuch: http://ideone.com/5DAth
    Eingabe abgebrochen: http://ideone.com/Gp3VI
    PIN falsch: http://ideone.com/U7jlF

    Der letzte Fall ist nicht ganz richtig, aber ich hab keine Lust das zu berichtigen. Und da ich niemandem gerne vollständigen richtigen Code gebe, bleibt das dir als Aufgabe überlassen :p



  • Erstellen einer Datei im CSV:

    void nutzeranlegen()
    {
        cout << "Nutzerdaten eingeben: ";
    
        cout << endl << "Namen: ";
        cin >> nutzer.name;
    
        cout << endl << "Pinnummer: ";
        cin >> nutzer.pinnummer;
    
        cout << endl << "Schüler = 0 oder Lehrer = 1 ?";
        cin >> nutzer.sl;
    
        nutzer.heutenichtmehr = 0;
    
        fstream User("pers.dat", ios::out|ios::app|ios::binary); // abhängig von OS
        User << nutzer.name << "," << nutzer.pinnummer << "," << nutzer.sl << "," << nutzer.heutenichtmehr << endl;
        User.close();
    }
    
    void lehrer()
    {
        cout << "Lehrerfunktion" << endl;
        nutzeranlegen();
    
        // Gruppen, Schüler + Aufgaben -> ideal auch auf Funktionsgruppen teilen
    }
    

    Anpassungen an den einen oder anderen Lösungsansatz sollten dann nicht so schwer sein. Im Netz findet man mehr ( gefühlt ) C oder MS Lösungen. Deshalb die oberige Variante.



  • @Danos: Gib es zu! Du hast das bisherige Programm nicht selber geschrieben, ansonsten wüsstest du, wie dein Problem zu lösen sei. Stimmts?



  • KasF schrieb:

    @Danos: Gib es zu! Du hast das bisherige Programm nicht selber geschrieben, ansonsten wüsstest du, wie dein Problem zu lösen sei. Stimmts?

    Erste Premisse als Anfänger: Nutze ein schon verhandenes Programm und verändere es - verbessere es.
    Es ist in etwa 50/50 - und ich versteh mein Programm - eben nur den Teil mit der Funktion muss ich mir noch mal genau ansehen.

    Danke für eure Hinweise und Anregungen - werde es zu berücksichtigen.



  • Danos schrieb:

    Erste Premisse als Anfänger: Nutze ein schon verhandenes Programm und verändere es - verbessere es.

    Das ist nicht gut. Vorallem, weil du als Anfänger nicht entscheiden kannst was gut und was schlecht ist. Ein falches Programm kann dich für immer vergraulen.

    Dein Programm ist - um es mal feinfühlig auszudrücken - katastrophal. Und du kannst dir gar nicht vorstellen, wie schön und einfach man das schreiben könnte.

    Du hast jetzt zwei Möglichkeiten:
    1.) Lass dir von den engagierten Forumsmitgliedern Schritt für Schritt helfen. Fangt an bei deiner Datenbank, um die Informationen abzuspeichern und geht hinüber zum Hauptprogramm. Dabei musst du ein bisschen eigeninitiative zeigen und nicht erwarten das jemand was für dich schreibt.

    2.) Du gehst mit 0% Neugewinn aus dieser Sache raus und kriegst ein halb-gefrickeltes Programm. Dabei wirst du wohlmöglich auch alleine stehen, da niemand sich um so ein Gefrickel kümmern wird und zudem dir schon Alternativen angeboten wurden.

    Du hast ein paar Bedingungen gestellt und mir scheint dies alles ganz danach, dass das Programm nicht für dich ist und du jemand oder irgendwem etwas beweisen willst, wenn du das Programm fertig stellst. Nicht gut!

    Um zurück zu (1) zu kommen. Fang doch mal damit an dir zu überlegen, wie du die Daten abspeichern würdest. Es ist genauso, wie du deine Daten für dich in einem Notizblock schreiben würdest. Und dabei ist nichts kryptisch, komisch oder sogar in deinem Fall binär. Überleg dir einfach, in welcher strukturierten Form du die Daten abspeichern willst.


Anmelden zum Antworten