Auswertung eines Arrays <--dringend!
-
ich hab ein ziemlich groes problem...
und zwar will ich ein Array (int zahl[5]) auswerten:
ziffer --> code
0 00110
1 10001
2 01001
3 11000
4 00101
5 10100
6 01100
7 00011
8 10010
9 01010
so, wers wissen will, das ist die verschlüsselung für den barcode 2/5 industrial... dieser strichcode auf etiketten usw.
nunja, entweder mir kann jemand sagen, wie ich aus einem array eine int zahl machen kann bzw. die stellen so halt ohne großen aufwand übernehmen...
oder jemand kann mir sagen, wie ich das array direkt und schnell z.b. mit tabelle auswerten könnte (denn eine scheinbar endlose if-verkettung könnte ich auch selber machen...).
bei beidem weis ich aber nich wies gehen soll, und bin aus diversen anleitungen auch nicht schlau geworden.
oder gehts vielleicht auch mit einer switch-case anweisung...?
bitte schnell helfen
-
Verstehe ich das richtig, dass die Elemente des Arrays die Ziffern einer Binärzahl repräsentieren und Du aus diesen nun eine "echte" (Binär-)zahl machen möchtest?
Wenn ja, so denke ich, dass sich hier der Shift-Operator innerhalb einer Schleifenkonstruktion anbieten würde. Prinzipiell könnte soetwas folgendermaßen aussehen:int arr[5] = { 0, 0, 1, 1, 0 }; //110 binaer, 6 dezimal int zahl = 0; for(int i = 4; i >= 0 ; --i) zahl += arr[4-i] << i; //zahl == 6;
-
ne das siehste falsch
00110=0
10001=1aber 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