Auswertung eines Arrays <--dringend!



  • ne das siehste falsch 😃
    00110=0
    10001=1

    aber ich seh da kein system drin-.-



  • Jetzt bin ich verwirrt 😃
    Ich dachte, das sollte ein zweidimensionales Array sein (also ein Array, dessen Elemente wiederum Arrays sind (int zahl[5])) und in der ersten Spalte ständen die Indizies...aber da hab ich mich wohl getäuscht.

    Edit: Oh, da steht ja sogar Ziffer->Code, hab ich irgendwie total überlesen...



  • Falls ich das richtig verstanden habe:

    #include <iostream>
    
    using namespace std;
    //als erstes werden die barcodes in einem Array unter dem Index ihrer Bedeutung gespeichert.
    //klingt kompliziert, ist aber ganz einfach:
    //                       0      1     2      3      4      5      6      7    8     9
    int codetabelle [10]= {00110,10001,01001, 11000, 00101, 10100, 01100, 00011,10010,01010};
    
    int main()
    {
    //dezimal zu barcode:
    //man greift einfach auf das entsprechende Element des codetabelle-Arrays zu.
    int ziffer = 3; //Dezimal-Ziffer die in barcode umgewandelt werden soll
    cout << codetabelle[ziffer] << "\n";
    //---
    //barcode zu dezimal
    int barcode_ziffer = 10100; //barcode dessen Bedeutung gesucht ist
    
    //es gibt 10 Möglichkeiten: 0,1,2..bis 9
    //und die werden jetzt einfach durchgetestet:
    
    int x = 0;
    while (x < 10)
        {
        //Hurra, hier stimmt es mit der Tabelle ueberein, schnell aufhoeren!
        if (barcode_ziffer == codetabelle[x]) break;
        x++;
        }
    
    cout << x << "\n";    //"10" bedeutet die Schleife ist einmal durchgelaufen,
                          //weil die barcode_ziffer ungueltig (nicht vorhanden) ist
    
    }
    

    Das müsste natürlich in Funktionen/Klassen verpackt werden und funktioniert für array-Elemente natürlich genauso wie hier für einzelne int's.
    ---
    Warum ist die Zuordnung eigentlich so zufällig(?)?
    Damit Fehler beim einscannen besser auffallen?



  • wegen der sicherheit...
    theoretisch bräuchte manb nur 4 stellen... aber durch die 5. gibts es keine zwei ziffern, die sich nur durch eine 0 oder 1 unterscheiden. dann gibts ja noch die prüfziffer und ein start und stop zeichen... dann is das ganze so gut wie idiotensicher...
    großes dankeschön schonmal für den lösungsvorschlag, werds dann gleich mal ausprobieren.

    thx

    EDIT:
    hab doch noch ein problem...
    und zwar is mein barcode so in meinem programm da: code[5]={1,0,0,0,1};
    das ist aufgrund von mehreren schleifen zuvor so, weil ich da stopp- und startzeichen abtrenn...
    das geht ja jetzt auch wieder blöd mit dem vergleich, kann ich irgendwie aus sonem array ne "zusammenhängende" zahl machen?

    EDIT2:
    also, eigentlich könnte man das doch so machen, also aus nem array, ne int:

    int z[5]={1,2,5,4,1};
    int g=0;
    
    for(int i=0;i<=4;i++)
      g=g+((10^i)*z[4-i]);
    

    ich addiere das element des arrays multipliziert mit der entsprechenden potenz von 10 auf meine int.
    aber wieso funktioniert das schon wieder nicht???



  • int z[5]={1,2,5,4,1}; 
    int g=0; 
    
    for(int i=0;i<=4;i++) 
      g=g+((10^i)*z[4-i]);
    

    so in der Art würde ich das auch probieren,
    z[n] hat ja sozusagen den 10fachen Wert von z[n-1]

    in c++ heisst x^y aber nicht "x hoch y" sondern "x xor y" oder etwas ähnliches.
    für das richtige "hoch" gibt es pow (x,y) aus <math.h>
    Das ist wahrscheinlich schonmal ein Fehler, aber auch ansonsten erscheint mir der code etwas seltsam...



  • Münzbieger schrieb:

    in c++ heisst x^y aber nicht "x hoch y" sondern "x xor y" oder etwas ähnliches.

    Ja, ^ ist der bitweise XOR- Operator.



  • Da du ints nimmst, wird übrigens:

    int codetabelle [10]= {00110,10001,01001, 11000, 00101, 10100, 01100, 00011,10010,01010};
    

    automatisch zu:

    int codetabelle [10]= {110,10001,1001, 11000, 101, 10100, 1100, 11,10010,1010};
    


  • Hallo,

    Mis2com schrieb:

    Da du ints nimmst, wird übrigens:
    C/C++ Code:
    int codetabelle [10]= {00110,10001,01001, 11000, 00101, 10100, 01100, 00011,10010,01010};

    automatisch zu:
    C/C++ Code:
    int codetabelle [10]= {110,10001,1001, 11000, 101, 10100, 1100, 11,10010,1010};

    aber nein, Integer-Literale, die mit der Zahl Null beginnen, sind Oktalzahlen, deshalb ist beides keinesfalls äquivalent...

    MfG



  • Mis2com schrieb:

    Da du ints nimmst, wird übrigens:

    int codetabelle [10]= {00110,10001,01001, 11000, 00101, 10100, 01100, 00011,10010,01010};
    

    automatisch zu:

    int codetabelle [10]= {110,10001,1001, 11000, 101, 10100, 1100, 11,10010,1010};
    

    ops 🙄
    dann sollte man vielleicht besser string's nehmen also:
    string codetabelle [10]= {"00110","10001"....};



  • argh, oktale, stimmt, hatte ich schon ganz vergessen...
    wozu braucht man des? 😕



  • Mis2com schrieb:

    wozu braucht man des?

    naja, auch in meinen Quell-Codes wimmelt es nicht gerade vor Oktal-Literalen, wenn solche Zahlen wirklich mal so vorgegeben sind, und man keine Lust hat, die umzurechnen, dann arbeitet man wohl gleich damit, oder wenn man ein besonderes Faible für Oktalzahlen hat (und gerne Byte-Folgen in Dreier-Gruppen von Bits aufteilt), dann vielleicht auch... 🙂 Die Oktal-Darstellung gehört wohl nach der Hex-Darstellung noch zu den bekannteren Weisen, eine Binär-Darstellung in einer anderen Form zu "kodieren".

    MfG


Anmelden zum Antworten