Forum: Mikrocontroller und Digitale Elektronik 2 array multiplizieren


von Ulf C. (parabol1337)


Lesenswert?

Hi Leute

hab da mal wieder  n kleines Problem.


Ich habe 2 Arrays a und b mit folgenden Inhalten:

a[1]=1;
a[2]=2;
a[3]=3;
a[4]=8;

b[1]=0;
b[2]=5;
b[3]=7;
b[4]=0;



also 1238x570=705660;

ich würde so vorgehen

a[4]*b[1]=c[0];
a[3]*b[1]=c[1];
a[2]*b[1]=c[2];
a[1]*b[1]=c[3];


nur hab ich da ein Problem was mache ich mit dem übertrag?

wie würdet ihr vorgehen

schöne Grüße Ulf

von Walter T. (nicolas)


Lesenswert?

Vom Zweck der Übung weiß ich jetzt nicht...

Aber ansonsten: Genau wie auf dem Papier: Aufschreiben und auf die 
nächste Stelle addieren.
1
c[4] = a[4] * b[4];
2
ü = mod(c[4],10);
3
c[4] = c[4] - 10*ü;
4
5
c[3] = a[3] * b[3] + ü;
6
ü = mod(c[3],10);
7
c[3] = c[3] - 10*ü;
8
9
...

So sähe das in Pseudocode aus.

von Walter T. (nicolas)


Lesenswert?

Ich verstehe gar nicht, warum die Code-Formatierung nicht den 
Variablennamen "ü" mag. Dabei nenne ich Variablen doch immer 
"Pröttgenkrügel" oder so.

von Karl H. (kbuchegg)


Lesenswert?

Nicolas S. wrote:
> Vom Zweck der Übung weiß ich jetzt nicht...
>
> Aber ansonsten: Genau wie auf dem Papier: Aufschreiben und auf die
> nächste Stelle addieren.
>
>
1
> c[4] = a[4] * b[4];
2
> ü = mod(c[4],10);
3
> c[4] = c[4] - 10*ü;
4
> 
5
> c[3] = a[3] * b[3] + ü;
6
> ü = mod(c[3],10);
7
> c[3] = c[3] - 10*ü;
8
> 
9
> ...
10
>
>
> So sähe das in Pseudocode aus.

Nicht wirklich, aber fast. Mittels mod (=modulo) kannst du nicht den 
Übertrag bestimmen. Der Übertrag ist ganz einfach die Zahl durch 10 
dividiert. Modulo kommt erst ins Spiel, wenn du den Teil haben willst, 
der nach Abzug des Übertrags übrig bleibt.

@Ulf
Und der Modulo Operator ist in C ganz einfach das %.
    a = 10 % 7;
    b = 10 / 7;

b wird 1, a wird 3.
denn: 7 ist in 10 1 mal enthalten und 3 bleiben Rest.

Frage: Was ist daher

    23 / 10    bzw.
    23 % 10

(das erste ist 2, das zweite ist 3. 'Zufällig' wäre in deiner Anwendung 
der Übertrag bei so einem Zwischenergebnis 2, während die sich zu 
merkende Stelle 3 wäre :-)

von Ulf C. (parabol1337)


Lesenswert?

Hi ich hab mir da smal so durch den kopf gehen lassen... mir ist 
aufgefallen, das ist alles sehr aufwendig

z.B.


a1=6
a2=7

b1=8
b2=9


d1=a2xb2  | 7*9=63
üd1=d1/10 | 63/10=6
c1=d1%10  | 63%10=3

d2=a1xb2  | 6*9=54
üd2=d2/10 | 54/10=5
c2=d2%10  | 54%10=4


dann müssen noch dir überträge dazuaddiert werden. das macht ne menge 
aufwand wenn man 2 4stellige zahlen hat

=/

gibt es vielleicht eine routine dafür, ich will ja das rad kein 2. mal 
erfinden

danke schon mal

von Matthias L. (Gast)


Lesenswert?

>gibt es vielleicht eine routine dafür, ich will ja das rad kein 2. mal
>erfinden

Warum hältst du die Zahlen nicht in normalen Variablen? Und machst nur 
zur LCD/UART Ausgabe eine Wandlung nach ASCII...

von Ulf C. (parabol1337)


Lesenswert?

Hallo ja wäre mir auch lieber... nur ich bekomme die daten vom UART im 
ASCII Format. Das ganze soll eine Leistungsanzeige werden. das 
Laderegler sendet mir die daten in diesem Format. Jetzt muss ich Strom 
und Spannung multipliezieren und um eine LCD Anzeige ausgeben.

von Karl H. (kbuchegg)


Lesenswert?

Ulf Cramme wrote:
> Hallo ja wäre mir auch lieber... nur ich bekomme die daten vom UART im
> ASCII Format.

Ja und?

Die kann man doch auch nach einer richtigen Zahl wandeln!

Die Funktion atoi ist schon lange erfunden. Wie wärs mal mit etwas 
C-Grundlagenstudium.

(Ich dachte bisher, das ganze wäre eine Hausübung! Kein Mensch tut sich 
heute noch BCD Arithmetik an, wenns nicht unbedingt sein muss weil er 
praktisch 'unendlich große' Zahlen verarbeiten können muss.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.