Ich schreibe bald Klausur und habe ne Frage zu einer Aufgabe aus einer Altklausur.
Der Code sieht wie folgt aus:
void setup()
{
Serial.begin(115200)
}
void loop();
{
unsigned int a = analogRead(A0);
if (a == 0) Serial.println("X");
if (a == 1) Serial.println("-X");
if (a == 2) Serial.println("--X");
if (a == 3) Serial.println("---X");
// [...]
if (a == 1023)Serial.println("-------- [...] --X");
}
Vorgabe ist, dass der eingelesene Analogwert zwischen 0 und 1023 betragen kann. Und im Code zur Ausgabe 1024 if-Anweisungen eingesetzt wurden.
Ich soll das Programm verkürzen und neu aufschreiben, kann mir da aber nichts drunter vorstellen.
Kann mir vielleicht jemand Helfen.
Jede Ausgabe wird mit einem 'X' angeschlossen, und die Anzahl der '-' Zeichen davor stellen den wert dar, richtig?
Also z.B. sowas:
void loop() {
unsigned int a = analogRead(A0);
while (a > 0) {
Serial.print("-");
a--;
}
Serial.println("X");
delay (1000); // Damit man mitlesen kann
}
1024 Zeichen ergeben allerdings ziemlich lange Zeilen...
michael_x:
Jede Ausgabe wird mit einem 'X' angeschlossen, und die Anzahl der '-' Zeichen davor stellen den wert dar, richtig?
Also z.B. sowas:
void loop() {
unsigned int a = analogRead(A0);
while (a > 0) {
Serial.print("-");
a--;
}
Serial.println("X");
delay (1000); // Damit man mitlesen kann
}
1024 Zeichen ergeben allerdings ziemlich lange Zeilen...
Ich glaube es geht hier eher weniger um den Sinn des Programmes an sich, sondern, dass ich ein Programm verkürzen kann und es die selbe Ausgabe hat.
Und ja genau die "-" Stellen den Wert dar.
und beim 2. Durchgang gleich der Arduino abschmiert?
Bei einer möglichen Länge von 1024 Zeichen ist das RAM schnell voll.
Solche sachen sollte man gleich ausgeben und nicht zwischenspeichern.
@Uwe da hast du vollkommen Recht ich hatte die Länge 1024 vergessen. Bei meiner Variante hätte der T0 noch was zu C-Zeichenketten lernen können. Nutzt aber nix wenn das Ding dann abschmiert.
Bei meiner Variante hätte der TO noch was zu C-Zeichenketten lernen können
OK, da hast du auch wieder Recht.
Statt dessen könnte er jetzt noch lernen, dass Serial.write('-'); einen Tick optimaler als Serial.print("-"); ist. (Bzw. wann man auch gut ohne C-Zeichenketten auskommt)
Peter-CAD-HST:
for (int n = 0; n < analogRead(A0); n++) Serial.print("-"); Serial.println("X");
Viel Erfolg bei der Klausur!
Dem Erfolgswunsch schließe ich mich gerne an! (Es gibt tatsächlich noch jemand, der sich vor einer Klausur mit alten Aufgaben beschäftigt - das finde ich Klasse!)
@Peter:
Veränderst Du da nicht heimlich die Schleifen-Ende-Bedingung?
Wenn also der Anfangswert 1000 ist und man dann den Eingang A0 z.B. so ungefähr beim 200ten '-' auf GND legt, werden wir 32768 Minuszeichen sehen.
Wenn also der Anfangswert 1000 ist und man dann den Eingang A0 z.B. so ungefähr beim 200ten '-' auf GND legt, werden wir 32768 Minuszeichen sehen.
Nein.
Sobald mindestens so viele '-' geschrieben sind wie der Wert ergibt, hört die Schleife auf. In deinem Beispiel eben nach 200 '-' statt erst nach 1000. Natürlich ist das formal ein anderes Verhalten als die Aufgabenstellung. Außerdem ist die Schleifengeschwindigkeit nicht nur von der Seriellen Geschwindigkeit bei vollem Puffer, sondern eventuell auch von der Dauer eines analogRead abhängig.
Deine Befürchtung mit den 32768 '-' sehe ich aber nicht.
Wir haben übrigens früher nurhauptsächlich nach alten Klausuren gelernt. Der ganze theoretische Hintergrund war viel zu kompliziert. Hauptsache, man konnte es irgendwie anwenden. ( nur Ingenieure eben ).
michael_x:
Sobald mindestens so viele '-' geschrieben sind wie der Wert ergibt, hört die Schleife auf.
Jetzt wo Du es sagst - stimmt.
War auf dem falschen Dampfer mit überlaufenden Countern die dann einmal rumzählen (kommt mir berufsbedingt gelegentlich unter).
Wir haben übrigens früher nurhauptsächlich nach alten Klausuren gelernt. Der ganze theoretische Hintergrund war viel zu kompliziert. Hauptsache, man konnte es irgendwie anwenden. ( nur Ingenieure eben ).
for (int n = 0; n < analogRead(A0); n++) Serial.print("-"); Serial.println("X");
Wird hier nicht immer wieder der analogpin bei jedem Schleifendurchgang neu eingelesen?
Wenn sich dieser Wert ändert ist auch die länge der Ausgabe di dann weder Anfangswert noch Endwert ist.
Ich würde den Analogwert vor dem for in eine Variable abspeichern und im for mit dieser Variablen arbeiten.
int max = analogRead(A0)
for (int n = 0; n < max; n++) Serial.print("-"); Serial.println("X");
Was mich stutzig macht, ist die letzte Laufzeit.
Führt man die Schleife einzeln aus sinds keine 508 micros, bzw. tauscht die beiden Varianten do/while ist immer die letztere Zeit mehr als doppelt so langsam.
Zum anderen frage ich mich, warum es beim ersten while(a--) zum Überlauf kommt. Dieses Verhalten hätte ich nur bei do/while() erwartet.
Kann mir jemand die schlechte Laufzeit und ggfls. das mit dem Ergebnis != 0 erläutern?
(Umgebung: MEGA und 1.8.10 / Linux)