Eingabe und Berechnung mit Modulo

Gast #4880789
Lesenswert?
• ▲
▼
Hallo
Habe ein Problem.
Es soll eine Eingabe von 1 bis 100 gemacht werden. Also 1- oder 2- oder 
3- stellig. von dieser Eingabe sollen die Zahlen dann einzeln getrennt 
werden und weiter verarbeitet werden.
Mit diesem Code kann ich die einzelnen Zahlen ausrechnen:
1
anzs1a=anz2 % 10;  // Berechnung Ausgabe Zahlen 
2
anzs1b=anz2/10;
3
anzs1c=anzs1b % 10;
4
anzs1d=anzs1b/10;
Die Berechnung erfolgt mit 3 Zahlen.
Wie kann ich die z.B. eine 1 oder 12 eingeben damit ich als Ausgabe 0 0 
1 oder 0 1 2 erhalte?
LG Paul
Gast #4880940
Lesenswert?
• ▲
▼
Die Dezimalzahl d, mit 0 <= d < 1000, ist auch zu schreiben als:

d = a_2 *10^2 + a_1 *10^1 + a_0 *10^0

dabei sind a_n, a_n E{0,..,9} und n E{0,1,2} die einzelnen "Stellen" 
Koeffizienten der Dezimalzahl d.

Nun frage dich bitte, was mit diese Darstellung gemeint ist:

d = b_2 *16^2 + b_1 *16^1 + b_0 *16^0
Gast #4880943
Lesenswert?
• ▲
▼
Vielleicht noch ein wichtiger Zusammenhang.

"+" Addition,
"-" Subtraktion,
"*" Multiplikation und
"/" Division sind bekannt.

"%" Modulo auch, aber wie ist der Modulo über die anderen 
Rechenoperatoren definierbar ?
Gast #4881328
Lesenswert?
• ▲
▼
Die Eingabe ist fertig. Eigentlich wird wird ein Punkt auf einem TFT 
festgelegt, an dem eine Ausgabe erfolgen soll. Leider sind verschiedene 
Eingaben, Grössen un Zusätze möglich.
Beispiel:
- Das Display hat einen Spalten und Zeilenzahl von 100 x 30
- Damit Eingabe eines Punkte an der Stelle 50 und 15 (Displaymitte)
- Eingabe nach Angabe Hersteller muss mit 48,53,48 , 49,53 erfolgen
- Diese Werte entsprechen den Zahlen als Char nach Tabelle
- Diese Eingabe ist sehr verwirrend
- Bei der Eingabe von Figuren kommen dabei ca. 10 bis 15 Zahlen zustande
- Angabe der Koordinaten erfolgt im Programm dadurch kein Komma oder 
Buchstaben möglich
- Werte der Zahle von 1 - 9 für einstellig
- oder von 10 - 99 für zweistellig
- oder nur 100 für dreistellig, danach Begrenzung
- andere Richtung von 1 - 9 und 10 -30
- Möchte die Zahlen mit Modulo in die einzelnen Zahlen aufteilen z.B. 
Eingabe Zahl 65, aufgeteilt in 0 , 6 , 5 und übergabe in eine Funktion
- damit habe ich für die Angabe eines Quadrate nur 40, 10, 70, 25
- sonst ist 0,4,0,1,0,7,0,2,5 und Zusätze für Farbe mit 3 x 0-FF, 
Hintergrundfarbe, Schriftfarbe, Schriftart, Randfarbe, Randbreite, 
Randmuster usw. nötig.

Bis her bin ich an dieser sache dran:

if (a < 10)
{ ... Modulo einstellig)
if (a >9 und <99)
[ ... Modulo zweistellig)
if (a == 100)
{ ... Modulo dreistellig}

hat jemand eine bessere Idee dazu?

LG

PS: Es ist ein I2C TFT Display in Farbe und 5 Zoll mit ca 100 Befehlen 
mit einem 3 stelligen Buchstabencode, eigenen Prozessor, eigenen 
Bildspeicher, eigenen IOs, USB und 3,3V nicht vergessen. Etwas richtig 
anspruchsvolles Teil und leider nicht billig. Als Programmierung wird 
das Smallprotokoll verwendet
Gast #4881416
Lesenswert?
• ▲
▼
Hi

Ich habe 'Es' noch nicht verstanden :/

Hast Du eine Eingabe, ziffernweise?
Oder ist die Eingabe bereits 'im Chip' und soll nun ausgegeben werden?

Ziffernweise Eingabe:
Ergebnis=0
nextchar:
Ergebnis=Ergebnis*10
X=Eingabe (als ASCII)
X=X-$30    ;ziehe '0' von der Eingabe ab
Ergebnis=Ergebnis+X
fertig?
N -> goto nextchar
--> in Ergebnis steht die in DEZ eingegebene Zahl

Ausgabe, ziffernweise von Hinten nach Vorne:
nextchar2:
Zeichen=Zahl%10  (Modulo)
Zahl=Zahl/10     (Integer-Division)
Ausgabe Zeichen (als ASCII +$30 ... oder auch "0")
Ist Zahl>0 ? goto nextchar2

MfG
#4881477
Lesenswert?
• ▲
▼
Zahlen zur Basis 2 helfen ihm bei seinem Problem aber nicht.

Hunderter = DeineZahl/100
Rest = DeineZahl%100
Zehner = Rest/10
Einer = Rest%10


Echt heavy ...


Edit: Ich glaube gerade, ich habe Dein Problem genau umgekehrt 
verstanden.
Du möchtest nicht 0 1 2 als Ergebnis, sondern Du möchtest das als 
Ergebnis, was Dir 0 1 2 liefert ...?


Gruß

Jobst
Gast #4881749
Lesenswert?
• ▲
▼
Hallo
scheinbar habe ich das Problem nicht richtig erklärt.
Das Display möchte als Eingabe 48, 53, 48, 49, 48 haben. das müssten die 
Zahle in Asci für 0, 5, 0 und 1, 5 sein.
Ich möchte zur besseren Eingabe aber die Zahlen 50, 15 nehmen.
Ich muss also von diesen beiden Zahlen die Länge (1 oder 2 oder 3 
Stellig)ermitteln und dann anschliessend auf 48,53,48 umrechnen.
Das ich z.B. mit Modulo machen.

1. Ermittel die länge ob 1 oder 2 oder 3 stellig
2. Emittel die einzelnen Zahlen
3. adiere zu den einzelnen Zahlen jeweils 48 und gebe es zum Display

Beispiel:

50, 15 soll ergeben 48, 53, 48 und 49, 53
Dazu "zerlege" ich die 50 in 5 und 0 und adiere dazu 48. Das ergibt 53 
und 48. Es fehlt noch die führende 0

Das mit der 2 versteh ich ohne Probleme. Ob es in der 4. Klasse war, 
kann ich mich nicht mehr erinnern. Benutze dann aber die schreibweise 
00001101.
#4881768
Lesenswert?
• ▲
▼
Hi

Wie wird die '50,48' eingegeben?
Wenn ziffernweise, kannst Du bei jedem Tastensruck den ASCII-Wert direkt 
beibehalten.
Beim 'Zahl-Ende-Zeichen' ... hier wohl das Komma oder das Return, gibst 
Du die drei Werte aus.
Initialisiert wurden alle drei Werte zuvor mit 48 ($30, ASCII '0').
Bei jeder Eingabe werden die hinteren zwei Werte um Eins nach vorne 
kopiert und der Einer-Wert von der Eingabe übernommen.

Wenn die Zahlen als Variabel vorliegen, kannst Du die Zahl entweder 
durch wiederholtes Subtrahieren oder durch Modulo zerlegen, um an die 
Einzelziffern zu kommen.
BCD wäre auch möglich ;)

Diese Einzelziffern jeweils wieder +48 ($30, ASCII '0') und ausgeben.

Die Zahleneingabe 'macht sich besser' in HEX - hier sind $30 - $39 die 
Ziffern 0 bis 9 (und zusätzlich +7, wenn die Zahl immer noch größer als 
9 ist und zu einem Buchstaben wird).

MfG
#4881770
Lesenswert?
• ▲
▼
Paul schrieb:
> Es fehlt noch die führende 0

Moment ... was?

Paul schrieb:
> scheinbar habe ich das Problem nicht richtig erklärt.

Ich glaube, dieses Mal ist es nicht viel besser ...


> Das Display möchte als Eingabe 48, 53, 48, 49, 48 haben.

Das Display nimmt, was Du ihm gibst. Es möchte nicht.
Es sieht danach aus, dass DU ASCII Zeichen haben möchtest.


> das müssten die Zahle in Asci für 0, 5, 0 und 1, 5 sein.

Nö. Das ist 0 5 0 1 0. Egal. Ja.


> Ich möchte zur besseren Eingabe aber die Zahlen 50, 15 nehmen.

Eingabe. Wo passiert die? Auf dem Display gibst Du nichts ein, das ist 
ein Ausgabegerät.
Wie kann man Zahlen besser eingeben?
Die Zahlen 50, 15 sind besser als was?
Ich meine 50 ist 50 - wie kann die besser sein?

> Ich muss also von diesen beiden Zahlen die Länge (1 oder 2 oder 3
> Stellig)ermitteln und dann anschliessend auf 48,53,48 umrechnen.

??


> Das ich z.B. mit Modulo machen.

Dieser Satz kein Verb ..?


> 1. Ermittel die länge ob 1 oder 2 oder 3 stellig
> 2. Emittel die einzelnen Zahlen
> 3. adiere zu den einzelnen Zahlen jeweils 48 und gebe es zum Display
>
> Beispiel:
>
> 50, 15 soll ergeben 48, 53, 48 und 49, 53
> Dazu "zerlege" ich die 50 in 5 und 0 und adiere dazu 48. Das ergibt 53
> und 48. Es fehlt noch die führende 0

Dann zerlege Deine 50 in 0 5 0. Das habe ich oben schon gezeigt und Dein 
ganz oben geschriebener Code macht das auch. Da ist die Null doch schon 
da.

Was willst Du?


Gruß

Jobst
Gast #4881861
Lesenswert?
• ▲
▼
Wenn ich 50, 15 schreibe fehlt die führende 0 bei 50 also ist die 
korrekte Eingabe 050. Das kann ich aber nicht schreiben, weil das 
Display nur 48, 53, 48 akzeptiert. Da ich teilweise viele Zahlen angeben 
muss ist das ganze zu lang. Für die Eingabe eines Rechteckes muss ich 
dann eingeben:

48,51,48,49,54,48,55,48,50,55

zusätzlich kommt noch dazu

48,53,48,49,52 für die Angabe der Mitte (Anker)

und noch ca 10 weitere. Das geht doch einfacher z.B.:

30, 14, 60, 25, 40, 23

Das letzte ist viel übersichtlicher und macht nicht soviel Fehler


Die 50 und 48 wird durch das Programm eingegeben:

void Cursor_Position(48,53,48,49,53)
#4881870
Lesenswert?
• ▲
▼
Hi

Dein Problem besteht darin, daß der Code:
void Cursor_Position(48,53,48,49,53)

die jeweils 3-stellige Zeichenfolge 048 053 048 049 053 ans Display 
schicken soll?

Wie zeitkritisch ist die Routine?

Wenn zwischen den einzelnen Ziffern etwas Zeit liegen darf, kannst Du in 
der Routine, ganz banal, wo die Zeichen gesendet werden, die Zahlzeichen 
errechnen und ausgeben.

Ich nehme jetzt an, daß die Routine aktuell bei 50 eine '2' (=ASCII 50d) 
sendet, aber eine '5' '0' senden soll?

Dann zeig bitte die Innereien dieser Sende-Routine.

MfG
Gast #4881881
Lesenswert?
• ▲
▼
Bis her sieht es so aus:
1
Graphik_C_Cursor_Position(0,9,9,2,9);
das andere
1
void Graphik_C_Cursor_Position(uint8_t x1, uint8_t x2, uint8_t x3, uint8_t y1, uint8_t y2)
2
{
3
  uint8_t x1a, x2a, x3a, y1a, y2a;
4
  x1a = x1 + 48;
5
  x2a = x2 + 48;
6
  x3a = x3 + 48;
7
  y1a = y1 + 48;
8
  y2a = y2 + 48;
9
  uint8_t bcc;
10
  bcc = DC1 + 0x0b + ESC + END + 0x2c + 'Y' + 'C' + 'P' + x1a + x2a + x3a + y1a +y2a;
11
  i2c_start(slave_adresse_1);
12
  i2c_write(DC1);
13
  i2c_write(0x0b);  // len 07
14
  i2c_write(ESC);
15
  i2c_write('Y');    // Y
16
  i2c_write('C');    // C
17
  i2c_write('P');    // P
18
  i2c_write(x1a);
19
  i2c_write(x2a);
20
  i2c_write(x3a);
21
  i2c_write(0x2c);
22
  i2c_write(y1a);
23
  i2c_write(y2a);
24
  
25
  i2c_write(END);
26
  i2c_write(bcc);
27
  i2c_stop();
28
  
29
  _delay_us(100);
30
  
31
  i2c_start(slave_adresse_2);
32
  e = i2c_readAck();
33
  i2c_stop();
34
  
35
  itoa( e, Buffer, 10 );
36
  lcd_printlc(1,5,Buffer);
37
  _delay_us(100);
38
  
39
}
Damit geht es, bis auf die führende 0 bzw die Eingabe und die Menge der 
möglichen Zahlen.
Das mit Modulo geht noch nicht
#4881890
Lesenswert?
• ▲
▼
Paul schrieb:
> Wenn ich 50, 15 schreibe fehlt die führende 0 bei 50 also ist die
> korrekte Eingabe 050. Das kann ich aber nicht schreiben, weil das
> Display nur 48, 53, 48 akzeptiert.

Ich verstehe Dein Problem immer noch nicht. Diese Dinge hast Du alle 
bereits gelöst.

Zahl = 50 (Woher auch immer 'Eingabe' stammt)
Hunderter = Zahl/100 = 0
Rest = Zahl%100 = 50
Zehner = Rest/10 = 5
Einer = Rest%10 = 0

Hunderter + 48 = 0 + 48 = 48
Zehner + 48 = 5 + 48 = 53
Einer + 48 = 0 + 48 = 48

Was fehlt Dir noch?


**Goosfraba*


Gruß

Jobst
Gast #4881896
Lesenswert?
• ▲
▼
Die führende 0 soll weg. Gebe ich 50 statt 050 wird automatisch anders 
gerechnet, 50 ist zweistellige Eingabe und 050 ist dreistellige Eingabe. 
Gebe ich 50 statt 050 ein wird die erste Zahl von der nächsten 
Koordinate genommen und alle Koordinaten sind falsch.
Gast #4881901
Lesenswert?
• ▲
▼
Mein Problem habe ich mehrfach beschrieben. Scheint nicht klar rüber 
zukommen.
Das Display will 48,53,48,49,53 als Eingabe bekommen. Das sind die 
Zahlen
0, 5, 0, 1, 5.
Ich möchte eingeben 50,15 ohne die 0
#4881912
Lesenswert?
• ▲
▼
Hi

Hiermit:
Graphik_C_Cursor_Position(0,9,9,2,9);

Gibst Du '099,29' ans Display, korrekt?

Dann musst Du doch 'nur' eine Zwischenroutine schreiben, Die Dir Deinen 
Zahlenstrom (nehme an, jeweils X und Y-Werte) in diese 3er + 2er Gruppe 
aufteilt und diese an die Funktion Graphik_C_Cursor_Position() schickt.

Das kannst Du mit den Modulo- oder mehrfachen Subtraktions-Berechnungen 
doch machen.

Mir ist trotzdem noch unklar, wie die eigentliche Eingabe der 
Koordinaten erfolgt, sind das Daten im eEprom und Du möchtest Dir nur 
das Leben bei der Eingabe erleichtern?
Also KEINE Eingabe während der Laufzeit, Du möchtest halt die Daten 
umkodieren, damit die Eingabe einfacher/weniger fehleranfällig ist?!?

(wäre verständlich, als Mensch ist man halt manch Mal faul gg)

MfG
Gast #4881927
Lesenswert?
• ▲
▼
Es erfolgt keine Eingabe über Tasten. Ich definiere einen Punkt auf dem 
Display wo etwas ausgegeben werden soll. Die Eingabe der Daten soll 
relativ einfach und verständlich ohne umrechnung (per Hand) erfolgen. 
Das Programm soll die Koordinaten von 50,15 auf 48,53,48,49,53 umrechnen 
und gleichzeitig prüfen ob die angebenen Koordinaten korrekt sind. 
Weiterhin möchte ich die mögliche Anzahl der Zahlen zur Eingabe aller 
notwendigen Koordinaten reduzieren. Im Programm (oben) ist ja zu sehen, 
welcher Aufwand jetzt schon ist. Teilweise arbeite ich jetzt schon mit 
10 bis 20 Graphikbefehlen fast gleichzeitig. Im original Programm ist 
eine maximale Verzögerung von 6 us drin. Es kommt noch der Bildaufbau 
und Anzeige aus dem Speicher dazu.
Eigentlich hast du recht. Mach das so wie oben schon angefangen. Brauche 
später das Teil ca. 50 bis 100 im ganzen Code für verschiedene 
Anwendungen.
Danke für die Hilfe und entschuldigung für den Satzaufbau
LG Paul

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren