Suche Hilfe bei der Programmierung eines IBAN-Rechners



  • @manni66 1. Richtig wären also getter und setter?
    2. Habe ich schon herausgefunden und mich geärgter woher der Fehler kam ^^

    Dann verstehe ich den Sinn von Header Dateien nicht. Muss ich noch mal die Folien durchgehen.

    Danke



  • Schalt mal deine Warnung im compiler an

    Ich vermute

    stol(sbban)
    

    wirft eine Warnung



  • @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    1. Richtig wären also getter und setter?

    Nein. Ob du die globalen Variablen jetzt direkt anfasst oder das Ganze hinter einem Funktionsaufruf versteckst spielt keine Rolle.



  • @manni66 Wie wäre es denn richtig? Ich stehe wirklich noch am Anfang des Programmieren. Ich weiß dass globale Variablen scheiße sind, aber 1. weiß ich nicht ob es in meinem Fall schon Sinn macht es anders zu schreiben und 2. weiß ich nicht wie man es richtig macht.



  • @revo94
    Das using namespace std; im Header führt das ganze namespace-Konzept ad absurdum. Das wird nur von Leuten gemacht, die namespaces nicht verstanden haben oder einfach nur zu faul sind. Das kann man für Mini-Projekte/Aufgaben machen, wenn man weiß, welche Probleme man sich damit einhandelt.
    Angenommen, du hast zwei Bibliotheken LibA und LibB, beide definieren ihren eigenen namespace liba und libb und exportieren einen Datentyp SomeType (also liba::SomeType und libb::SomeType).

    In deinem Projekt gibt es jetzt eine .h Datei:

    #include "liba/types.h"
    
    using namespace liba;
    
    struct MyStruct
    {
       SomeType data; // liba::SomeType
    };
    

    und eine andere .h Datei

    #include <libb/types.h>
    
    using namespace libb;
    
    struct AnotherStruct
    {
       SomeType data;
    };
    

    Beide TUs lassen sich separat ohne Probleme übersetzen.

    In einer dritten Datei hast du jetzt sowas:

    #include "mystruct.h"
    #include "anotherstruct.h"
    ...
    

    Und da geht das in die Hose. Nach dem include von "mystruct.h" ist der namespace liba geöffnet, weil in der .h Datei ein using namespace liba steht. Anschließend guckt sich der Compiler anotherstruct.h an und findet dort SomeType. Weil zuvor ebenfalls der namespace libb geöffnet wurde ist die Deklaration mehrdeutig und führt zu einem Fehler. using namespace im Header kann also zu Nebeneffekten und Fehlern in anderen TUs führen, und deswegen macht man das einfach nicht.



  • @firefly Die habe ich im Code als Kommentar angehängt 🙂

    Unbehandelte Ausnahme bei 0x740C45A2 in IBAN.exe: Microsoft C++-Ausnahme: std::out_of_range bei Speicherort 0x00DDF940.
    


  • @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    Ist dafür nicht der Header da?

    Der Header ist als Schnittstelleninformation für den Compiler gedacht.

    Wenn du in einer .cpp Datei (Quellcode) Funktionen aus einer anderen .cpp benutzen möchtest, braucht der Compiler Informationen darüber (Name, Rückgabewert Aufrufparamter).
    Dies sind aber nur Deklarationen.

    Und auch nur die Informationen, die woanders gebraucht werden, gehören in den Header.



  • @DirkB Also kommen die Variablen die ich in einer .cpp benötige, in die .cpp selbst?



  • @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    @firefly Die habe ich im Code als Kommentar angehängt 🙂

    Unbehandelte Ausnahme bei 0x740C45A2 in IBAN.exe: Microsoft C++-Ausnahme: std::out_of_range bei Speicherort 0x00DDF940.
    

    Nein! Das ist keine Compiler Warnung. Die ausgabe passiert wenn du dein Programm laufen lässt



  • @firefly Okay... sorry, ich weiß jetzt nicht wirklich wo das in Visual Studio geht.



  • @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    @DirkB Also kommen die Variablen die ich in einer .cpp benötige, in die .cpp selbst?

    Ja natürlich.
    Am Besten noch in die Funktion (auch main ist eine Funktion) in der du sie als erstes (dem Aufruf nach) benötigst.
    Der Rest wird über Funktionsparamter weiter gegeben.

    Wenn du eine Variable doch mal in einer anderen .cpp benötigst, wird sie mit extern im Header deklariert.



  • @DirkB Danke für deine Geduld mit mir und natürlich für deine Tipps!



  • @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    @firefly Okay... sorry, ich weiß jetzt nicht wirklich wo das in Visual Studio geht.

    Was weißt du nicht?
    Der Unterschied zwischen Compiler Fehler (evtl auch Linker Fehler) und ein Fehler der zur Laufzeit des Programms entsteht?

    Du kannst ein Programm übersetzten (Compilieren)
    Du kannst ein Programm bauen (compilieren und linken)
    Und du kannst ein Programm laufen lassen (Run)

    Visual Studio kann das alles automatisch nacheinander ausführen.
    Dennoch bleiben es getrennte Aktionen.



  • @DirkB
    @firefly sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    Schalt mal deine Warnung im compiler an

    Ich vermute

    stol(sbban)
    

    wirft eine Warnung

    "Schalt mal deine Warnung im Compiler an"
    Ich weiß nicht wie ich das einschalte.



  • @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    @mgaeckler Danke erst mal... Hätte mir ehrlich gesagt nettere Antworten erwartet 😃 Aber hey, im Internet kann man sowas wohl vergessen.... Wie auch immer... Das

    Wie meinen? Was verstehst Du unter netter?

    using namespace std;
    

    hat man bei uns so an der Hochschule gezeigt bekommen.

    Aber dort wurde Dir hoffentlich auch gesagt, daß man sowas in headern schön bleiben lässt.

    Und danke, jetzt weiß ich das der Datentyp falsch ist 👍
    Und das mit der Variablen Definition... Ist dafür nicht der Header da? 🤔

    Bitte belehre mich eines Besseren!

    Das haben andere schon gemacht.



  • Du brauchst niemals die gesamte IBAN als int, sondern immer nur 9 (oder anders viele, was gerade in deinen int passt). Für die Berechnung mit 9 Ziffern reicht sogar ein Integer mit 32 Bit.

    Und du brauchst auch nicht die Codes für alle Länder einzeln zu speichern (DE=1314), sondern du erhältst du Zahl eines Einzelbuchstaben über (buchstabe - 'A' + 10). Beispiel: 'D' - 'A' + 10 == 13.

    Edit: vielleicht sollte ich es anders erklären: bei Modulo kannst du immer schöne Dinge tun. Zum Beispiel bei +, -, * jederzeit bei jedem Zwischenergebnis und bei jedem Summanden und bei jedem Faktor einzeln modulo rechnen (wo es dir beliebt).

    Wenn deine IBAN lautet: DExx123456782525252525, dann wird daraus ja 123456782525252525131400.
    Das ist gleich: 123456782 * 10^irgendwas + 525252525131400 (mod 97). Jetzt wenden wir das %97 einfach auf 123456782 an. Kommt 32 raus. Also ist das gleiche wie 32 * 10^irgendwas + 525252525131400 = 32525252525131400 (mod 97). Jetzt nimmst du wieder n Ziffern und wiederholst den Spaß. Statt 9 Ziffern kannst du auch anders viele nehmen. So viele, wie gerade in deinen int passen, zum Beispiel.

    Also:

    123456782525252525131400123456782525252525131400

    =123456×10a+782525252525131400=72×10a+782525252525131400=72782525252525131400= 123456 \times 10^a + 782525252525131400 = 72 \times 10^a + 782525252525131400 = 72782525252525131400

    =7278252525×10b+2525131400=18×10b+2525131400=182525131400= 7278252525 \times 10^b + 2525131400 = 18 \times 10^b + 2525131400 = 182525131400

    =55  (mod 97)= 55 \ \ \text{(mod 97)}

    PS: Wie mache ich hier ein Mehrzeilen-Displaymath mit ausgerichteten =-Zeichen? "\\" und "&=" scheinen nicht zu funktionieren.


  • Mod

    Sehr gute Faustregel, ob ein Datum eine Zahl (zum Rechnen) oder eine Ziffernfolge ist:

    1. Macht die Differenz von zwei Daten Sinn?
    2. Macht der Durchschnitt von mehreren Daten Sinn?

    Postleitzahl: Meine Postleitzahl minus deine Postleitzahl ist 26452. Quatsch. Die durchschnittliche Postleitzahl aller Deutschen ist 52424.383. Quatsch.

    Alter: Mein Alter minus dein Alter ist 5. Ich bin 5 Jahre älter als du. Das Durchschnittsalter in Berlin ist 46. Auch interessant.

    Telefonnummer: Meine Telefonnummer minus deine Telefonnummer ist -3275723712. Quatsch. Die durchschnittliche Telefonnummer von Deutschland ist 491648588156. Quatsch.

    IBAN?



  • @mgaeckler sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    Wie meinen? Was verstehst Du unter netter?

    Ach weißt Du @mgaeckler, manchmal sehnt man sich einfach so wie @revo94 nach ein wenig Menschlichkeit und möchte in die Arme genommen und fest gedrückt werden.

    @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    Ich bin dabei, um C++ etwas mehr zu lernen

    https://www.google.com/search?q=c%2B%2B+books

    @revo94 sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    @DirkB
    @firefly sagte in Suche Hilfe bei der Programmierung eines IBAN-Rechners:

    Schalt mal deine Warnung im compiler an

    Ich weiß nicht wie ich das einschalte.

    Das steht im Manual deines Lieblingscompilers.


Anmelden zum Antworten