10-stellige Zahl

  • C

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    10-stellige Zahl

    Hallo Com,

    es geht um den (besten) Datentyp einer 10-stelligen Kontonummer?!
    Meine Überlegung:
    unsigned long int (irgendwo bei 4 Milliarden)
    auf der anderen Seite sollten/können evtl. auch Kontonummern mit führender 0 möglich sein da würde ich dann char[] verwenden?!
    Aber wenn ich char verwende, hab ich wiederum Probleme, diese zu "berechnen", wenn ich z.B. hintereinander weg mehrere Kontonummern erstellen möchte.
    ja, so ist das halt.
    Bei mit führenden '0' musst du char[] verwenden, aber um damit zu rechnen jeweils in long (64 bit) umwandeln.

    In .Net würde sowas das Formatierungs-System übernehmen, aber sowas gibts in C glaub nicht, oder?

    Aber wieso proggst du ühaupt was mit Kontonummern in C?
    C ist für auf Schnelligkeit hochoptimierte Algorithmen - son Datenbänker-Kram mit Kontonummern wäre zB in .Net hundertmal besser aufgehoben.
    Hi
    es wurde festgelegt, dass du 10 Stellen hast, das sind nicht mal weniger oder mehr, insofern ist es nur eine Frage der Darstellung. ;) Wenn du die Zahl links mit 0-en auffüllst, erhältst du ja das, was du brauchst. Mit char[] kannst du aber auch arbeiten: Das unsigned long int kannst du in dein char[] umwandeln, indem du einfach immer %10 für die aktuelle Stelle rechnest und diesen Wert zu einem Char umwandelst, danach den Wert /10 und den Array-Index nach oben zählst.
    Dein char[] sollte dann aber wohl 11 Elemente enthalten ==> char[10]. Die letzte Stelle sollte '\0' sein.

    Viele Grüße
    ~blaze~
    Kenn ich mich in C einfach zu wenig aus oder warum wird char vorgeschlagen?
    Ich kenn das nur aus .Net, wo Char ein Text-Zeichen darstellt. Ich hätte jetzt eher einen numerischen Datentyp vorgeschlagen (Byte).
    Dann wäre so eine Kontonummer effektiv ein Array von Zahlen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    in c gibt es schonmal keinen byte Datentyp, char ist 1 byte groß und unsigned char ist autom. eine Zahl zwischen 0 und 255, wobei nicht unterschieden wird zwischen zahl und char zeichen. Außer natürlich unsigned/signed...
    Da man es sowieso noch darstellen muss und ich nicht wüsste was bei einer Kontonummer gerechnet werden soll wäre ein char Array mMn eine sinnvolle lösung
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    @Te : wie wird denn die Kontonummer "berechnet"?

    Das obliegt ganz mir. Meine Idee war, es ein bisschen "schick" zu machen und die ersten beiden Ziffern als "Bankcode" zu verwenden, die restlichen 8-1 als Kundencode und die letzte als Prüfziffer berechnen zu lassen (in etwa wie beim IBAN). Soweit so gut - muss ich erst einmal simpel anfangen und einen sinnvollen Datentyp finden.
    Das Problem an welchem ich momentan hänge ist folgendes, dass wenn ich einen Kunde hinzufüge, die KN autom. generiert werden soll. Der simpelste Weg wäre doch daher ein long long int zu verwenden und die Grenzen entsprechend in der "rand() Funktion" zu setzen. Wenn ich es aber mit einem int Array mache, habe ich den vorteil, dass ich ja bei der Generierung jede Zahl individuell manipulieren kann nur gestaltet sich hier die Eingabe nicht ganz so einfach wie bei einer normalen Zahl...
    dann mach es doch so wie es @~blaze~ gesagt hat, finde ich da persönlich auch die beste Lösung, das Rechnen ist einmalig, aber Speichern und Anzeigen dürfte öfters passieren, deshalb als char-Array und die Eingabe wird natürlich auch einfacher.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl
    Ach so, ok.

    @klyer
    Da würde ich zwischen Präsentation und Daten unterscheiden.
    Ich weiß nicht, wie die Kontonummer bei Dir eingegeben wird, aber es dürfte ja grundsätzlich erst mal ein String sein.
    Ich würde jedes Zeichen in dem String durchlaufen und aus "0"c (VB-Notation von Chars) die Zahl 0 machen, aus "1"c die Zahl 1, und so weiter bis 9. Wenn ein anderes Zeichen drin vor kommt, ist die Eingabe wohl ungültig.
    Diese Zahlen werden in ein Array gepackt. Bei .Net wär's halt ein Byte-Array.
    Für die Anzeige wird einfach aus jeder Zahl wieder ein Zeichen gemacht und das ganze wird einfach nacheinander in einen String gepackt.
    Rechnen kann man damit auch, nur nicht ganz so einfach, wie mit einem großen Integer. Hochzählen ist auch möglich. Einfach die Zahl ganz rechts um 1 erhöhen. Wenn sie > 9 ist, auf 0 setzen und die Zahl links daneben erhöhen, wieder auf > 9 prüfen, und so weiter.

    Wie das jetzt konkret in C gemacht wird, weiß ich nicht, denn damit kenne ich mich zu wenig aus, aber prinzipiell wäre das ein guter Ansatz.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Vielen Dank für eure rege Anteilnahme ;)

    Ich glaube es folgendermaßen gelöst zu haben: mit einem int Array. Ein char Array finde ich nicht so passend.

    sozusagen wie @~blaze~ sagte...

    C-Quellcode

    1. int KN[10];
    2. long long int into;
    3. scanf_s("%lld", &into);
    4. printf("Eingabe: %lld\n", into);
    5. for (int i=10-1; i>=0;--i) {
    6. KN[i]=into%10;
    7. into/=10;
    8. }
    9. for (int i=0;i<10;i++) {
    10. printf("%d", KN[i]);
    11. }

    Damit bin ich ja nun so flexibel das ich zur Generierung einfach die letzte Ziffer im Array erhöhe. Ebenso kann ich auch mein Prüfalgo einbauen ;)

    klyer schrieb:

    sozusagen
    Was soll die Modulo-Rechnung?
    Lies einen String ein und wandle die einzelnen Chars dieses Strings. Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ~blaze~ schrieb:

    Dein char[] sollte dann aber wohl 11 Elemente enthalten ==> char[10]. Die letzte Stelle sollte '\0' sein.
    Dann hast du aber nur 10 Elemente. Ein ​char[11] hat 11 Elemente.
    Mit freundlichen Grüßen,
    Thunderbolt

    RodFromGermany schrieb:

    Lies einen String ein und wandle die einzelnen Chars dieses Strings

    Warum soll ich denn ein String einlesen? Meiner Meinung ist doch das int Array am passendsten, da ich dann mit der Modulorechnung die einzelnen Ziffern in mein int Array einlesen kann. Denn mit chars an sich arbeite ich ja nicht sondern nur mit Zahlen. Oder verstehe ich das noch nicht ganz?

    klyer schrieb:

    Warum soll ich denn ein String einlesen?
    Du liest einen String ein, sonst würdest Du einen Fehler kriegen, wenn Du zwischen den Ziffern Buchstaben eintippst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Muss es in C sein oder kann es auch C++ sein?
    Sonst kannste ja ne eigene Klasse bauen
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell