Programmierübung C Zahlenbereiche Algorithmus

Gast #4340201
Lesenswert?

Hallo Zusammen,

kann mir einer bei dieser Aufgabe weiterhelfen. Sollte in C gelöst 
werden.

Das Ergebnis einer Berechnung soll auf acht, an PORTD angeschlossenen 
LEDs angezeigt werden. Der hier darzustellende Wert liegt im Bereich 
zwischen 0 und 1023 und ist somit nicht direkt auf die Ausgabestruktur 
abbildbar. Daher gilt es, folgende Lösung zu implementieren:
 Zahlenbereich: 0 …127 LED 0
 Zahlenbereich 128 … 255 LED 1
 Zahlenbereich 256 … 383 LED 2
 Zahlenbereich 384 … 511 LED 3
 Zahlenbereich 512 … 639 LED 4
 Zahlenbereich 640 … 767 LED 5
 Zahlenbereich 768 … 895 LED 6
 Zahlenbereich 896 … 1023 LED 7
Liegt der Wert zwischen 0 und 127, so wird LED 0 angesteuert usw. 
Schreiben Sie eine C-Funktion, die diese Zuordnung realisiert. Der 
Übergabeparameter ist der berechnete Wert zwischen 0 und 1023, der 
Rückgabeparameter ist die Nummer der anzusteuernden LED. Die Berechnung 
der anzusteuernden LED soll mit einem Algorithmus und nicht mit einer 
switch- oder geschachtelten if-Anweisung erfolgen!


Vielen Dank.
(Firma: CIA) #4340203
Lesenswert?

Wo steht denn da in der Aufgabe: "Suche Dir im Internet einen Blöden, 
der für die die Aufgabe löst"?

Ich kann ja verstehen, das man sich Hilfe holt wenn man seine Aufgabe 
mehr oder weniger gelöst hat und irgendwo an einem Detail festhängt. 
Aber so was ist Betrug und Pfusch und ein Armutszeugnis.
Gast #4340229
Lesenswert?

Thomas H. schrieb:
> Wo steht denn da in der Aufgabe: "Suche Dir im Internet einen
> Blöden,
> der für die die Aufgabe löst"?
>
> Ich kann ja verstehen, das man sich Hilfe holt wenn man seine Aufgabe
> mehr oder weniger gelöst hat und irgendwo an einem Detail festhängt.
> Aber so was ist Betrug und Pfusch und ein Armutszeugnis.

Wollklaus schrieb:
> Kleine Hilfe: Du kannst etwas (recht einfaches) mit 128 machen.

Hallo Wollklaus, ja da hast du recht ;-) Danke für die Hilfe!
Gast #4340232
Lesenswert?

Wahrscheinlich hat da der Prof in der verpassten Stunde seinen 
Lieblingsalgorithmus ausgebreitet, will nun genau diese Lösung sehen.

Mit unseren Lösungsvorschlägen hast du in der Schule bis in alle 
Ewigkeiten verschissen.
Gast #4340247
Lesenswert?

danke user darauf bin ich jetzt auch gekommen ;-) manchmal denk ich zu 
kompliziert ;-) aber danke für eure hilfe.

@Thomas, Wolfgang, Noch einer... ohne Worte zum GLÜCK gib es auch 
normale Menschen hier!
Gast #4340294
Lesenswert?

Micha schrieb:
> danke user darauf bin ich jetzt auch gekommen ;-)

Und wenn du dem Mikrocontroller die Arbeit leicht machen willst, i.e. 
eine effiziente Lösung suchst und ohne aufwändige Rechenoperationen 
auskommen möchtest, vergiss das mit der Division durch 128 gleich 
wieder. Einem Mikrocontroller fällt es erheblich leichter, eine Zahl 7 
mal zu schieben, auch wenn die wahren Verfechter von C jetzt natürlich 
argumentieren werden, dass es die Aufgabe des Compilers ist, diese 
effiziente Möglichkeit selber zu erkennen und im Binärcode zu 
realisieren.
Gast #4340300
Lesenswert?

user schrieb:
> zahl / 128 = Nummer der Led

p.s. Was nützt die Nummer der LED, wenn man Pins auf einem Port 
ansteuern möchte. Da fängt man dann wieder an, eine 1 spazieren zu 
schieben. Einfacher wäre es wohl in einer Schleife parallel eine 1 zu 
Schieben und von der Ausgangszahl 128 zu subtrahieren.
Gast #4340304
Lesenswert?

Wolfgang schrieb:
> Micha schrieb:
>> danke user darauf bin ich jetzt auch gekommen ;-)
>
> Und wenn du dem Mikrocontroller die Arbeit leicht machen willst, i.e.
> eine effiziente Lösung suchst und ohne aufwändige Rechenoperationen
> auskommen möchtest, vergiss das mit der Division durch 128 gleich
> wieder. Einem Mikrocontroller fällt es erheblich leichter, eine Zahl 7
> mal zu schieben, auch wenn die wahren Verfechter von C jetzt natürlich
> argumentieren werden, dass es die Aufgabe des Compilers ist, diese
> effiziente Möglichkeit selber zu erkennen und im Binärcode zu
> realisieren.

bla bla bla,

du weißt schon, dass der Compiler einen shift draus machen wird?
Gast #4340305
Lesenswert?

Wolfgang schrieb:
> user schrieb:
>> zahl / 128 = Nummer der Led
>
> p.s. Was nützt die Nummer der LED, wenn man Pins auf einem Port
> ansteuern möchte. Da fängt man dann wieder an, eine 1 spazieren zu
> schieben. Einfacher wäre es wohl in einer Schleife parallel eine 1 zu
> Schieben und von der Ausgangszahl 128 zu subtrahieren.

Zeige doch einmal wie einfach das ist.
Gast #4340390
Lesenswert?

Wolfgang schrieb:
> Clarion schrieb:
>> Zeige doch einmal wie einfach das ist.
>
> Schleifenkonstrukte mit bedingter Ausführung kennst du?
> Dann könnte das wohl sinngemäß so aussehen:
>
> Pattern = 0x01
>
> while (Wert>127)
>   Pattern = shift (Pattern, 1)
>   Wert = Wert - 128
>
> PORTD = Pattern

Das nennst du einfach? ROFL

Das ist einfach: PORTD = 1 << (Wert >> 7);

5 Dollarfrage @ all: Wie geht es noch einfacher?
Gast #4340414
Lesenswert?

Wolfgang schrieb:
> Clarion schrieb:
>> Das ist einfach: PORTD = 1 << (Wert >> 7);
>
> Ich fürchte das übersteigt die Kenntnisse vom TO, wenn er mit der
> Grundaufgabe schon so viel Probleme hat, dass er sie hier ohne jeglichen
> Lösungsansatz postet.

Er kann sich beide Lösungen anschauen und in den verschiedenen 
Anleitungen (eigene Skipte, etc.) zu C versuchen diese zu verstehen. 
Gegebenenfalls einfach hier auf dem µCNet nachfragen :)
Gast #4340425
Lesenswert?

Wolfgang schrieb:
> Clarion schrieb:
>> Das ist einfach: PORTD = 1 << (Wert >> 7);

Für nicht"Gast" könnte man das im Vertrauen auf den Compiler und damit 
selbiger auch zeigen kann, dass er das drauf hat, natürlich wieder als
1
PORTD = 1 << (Wert / 128);
formulieren, womit wir dann beim ursprünglichen Vorschlag wären ;-)
Gast #4340442
Lesenswert?

Thomas H. schrieb:
> Wo steht denn da in der Aufgabe: "Suche Dir im Internet einen Blöden,
> der für die die Aufgabe löst"?

Da der Lehrer hier sicher mitliest, weiß er natürlich daß Micha keinen 
Dunst hat, selbst wenn er diesmal eine richtige Lösung liefert. Bei 
einer der nächsten Aufgaben wird er ihn schon kalt erwischen.

MfG Klaus

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