In der Programmiersprache C hat man viele Möglichkeiten die Befehle abzukürzen. C hat daher leider und vor allem zu unrecht den Ruf etwas kryptisch zu sein.
Denn eins ist wichtig: Man kann die Befehle sehr kurz und damit sicher auch kryptisch darstellen – man muss es aber nicht tun.
Gerade für den Einsteiger macht es häufig mehr Sinn die Befehle etwas ausführlicher zu formulieren und somit die Lesbarkeit für den Anfänger zu erhöhen.
Hat man später etwas Erfahrung und Routine ist man für die Möglichkeit Befehle kürzer darzustellen oder mehrere Befehle zu schachteln dankbar. Für den erfahrenen Programmierer, der weiß was er macht, ist nämlich kürzerer Code oft besser zu lesen.
Einige Schreibweisen machen aber auch schon für den Einsteiger Sinn und darum soll es im folgenden Video gehen.
Das Video
Zu Beginn des Videos zeige ich noch eine mögliche Lösung der Aufgabe aus der letzten Woche.
Kurz zusammengefasst
Die wesentlichen Abkürzungen sind also
- i+=2;
um i in diesem Beispiel um den Wert 2 zu erhöhen und das Ergebnis wieder in der Variablen i abzulegen. (analog dazu i*=2, i/=2; i-=2)
- i++; bzw. ++1;
um i zu inkrementieren. Analog geht natürlich auch i–; und –i; (doppeltes Minus-Zeichen) um i zu dekrementiern, also um den Wert 1 zu vermindern.
Ob man nun i++; oder ++i; verwendet, hängt davon ab, ob man die Variable bei zusammengesetzten Befehl vor oder nach der Ausführung inkrementieren möchte.
Hier nun Deine Aufgabe
In der letzten Folge haben wir mit Hilfe des modulo-Operators zyklisch von 0 bis 4 gezählt, also eine Variable inkrementiert, dann mit dem modulo-Operator dafür gesorgt, dass nur zyklisch von 0 bis 4 gezählt wird und anschließend die Variable mit printf() ausgegeben.
C wäre nicht C, wenn man das nicht in einer Zeile erledigen könnte.
Deine Aufgabe ist es also diese Zeile in die while()-Schleife zu schreiben.
Also
while(1)
{
printf( …); //alles in einem Befehl
}
[ >> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses .]
Werbung:
Mit dem C-Reference Manual (Taschenbuch)
DAS LEGENDÄRE STANDARDWERK
- von den Erfindern der Programmiersprache C
- beschreibt C nach dem ANSI-Standard
- Grundlagen- und Nachschlagewerk in einem
- mit zahlreichen Beispielen und Aufgaben
Die Autoren Kernighan und Ritchie haben die Programmiersprache "C" erfunden und entwickelt. Dieses Buch führt leicht verständlich in die Anwendung der Programmiersprache C ein.
Zahlreiche Beispiele, die meist vollständige Programme darstellen, und praktische Übungsaufgaben fördern das Verständnis und die unmittelbare Anwendung von C.
Klicke hier für weitere Informationen zum Buch und Meinungen der Leser
Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)
|
Ähnliche Artikel
Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:Schleifen mit for Dies ist nun der dritte Artikel, der sich mit der Programmierung von Schleifen beschäftigt. Neben de...
Pointer und Arrays In einem der vorherigen Artikeln hatten wir schon einmal Arrays kennengelernt. Arrays sind nichts a...
Funktionen in C, Globale und lokale Variablen Was wären Funktionen doch langweilig, wenn sie immer nur das gleiche machen würden. Um Programme eff...
Berechnung der Kapazität eines Drehkondensators In diesem Artikel geht es um die Lösung der Aufgabe aus der Folge zum aufgewickelten Kondensator. Im...





{ 14 Kommentare… sie unten lesen oder einen hinzufügen }
#include
#include
main(){
int i=4;
while(1){
printf(” %d\n “,i%5,++i);
getchar();
}
}
Ich hoffe diesmal alles richtig gemacht zu haben
Heinrich.
Psst, nicht zu früh verraten
Sieht aber nicht schlecht aus.
OK, bevor es morgen wieder eine neue Folge gibt, möchte ich gerne eine mögliche Lösung aufzeigen, die der von Heinrich sehe nahe kommt.
int i=0; // am Anfang von void main(void)
//
//
//
while(1){
printf(” %d\n “,i%5);
i++;
}
Eine gute Idee von Heinrich ist es sicher auch ein getchar() einzubauen. So kann man jeden Schritt einzeln sehen.
Bis morgen!
Wolfgang
Meins ist kürzer ;D
main… int i;
while… printf(“%d\n”,j++%5);
Das Beispiel von Neuling wäre gut, wenn er sich auf EINE Variable beschränken würde. So wird es ein Compiler-Fehler. Folgender Vorschlag zur übersichtlich strukturierten Darstellung in 5-er Blöcken, erfordert allerdings eine 2. Zeile:
int i=0;
while(1) {
printf(“%d\n”, i++%5);
if (i%5==0) printf(“\n”);
}
Hallo Dieter,
das Vertauschen von i und j war sicher ein Tippfehler.
Das Formatieren in 5er Blöcken ist sicher eine gute Idee für gute Lesbarkeit.
Das ist auch die richtige Herangehensweise an dern Kurs. Wenn man eine Idee hat, Verbesserungsvorschläge hat der einfach etwas ausprobieren will – einfach machen!
Mit dem Simulationsprogramm ist das ja schön ohne großen Aufwand möglich.
Hallo Herr Bengfort und alle Freunde dieser Seiten.
Erst einmal herzlichen Dank für den netten Kurs. Ich selbst bin seit mehr als 25 Jahre Programmierer und kann so den Stoff endlich mal meiner Frau erklären
Anbei zur Belustigung eine nette kleine Aufgabe die ganze Scharen von C-Compilern zur Verzweiflung treiben, will sagen jeder Compiler liefert ein anderes Ergebnis nur nicht dass, was einem die Logik sagt, wenn man den Code mal im Kopf löst
Nochmals herzlichen Dank und hier ist der ultrakurze Code zum Knobeln :
#include
void main()
{
int a=12;
a+=++a+a++;
printf(“a ist gleich %i”,a);
}
end
Jetzt kommt es:
Ich ändere ich den Ausdruck auf der rechten Seite nach:
a=++a+a+++(++a)
Nach der obenstehenden Logik, sollte das Programm nun folgendes machen:
Durch das erste ++a (rechts des = Zuweisers) wird a->13, anschliessend
wieder mit sich selbst addiert, also 13+13, dann durch das a++ inkrementiert,
wie gehabt, also a=14, nun sollte es durch das ganz rechte (++a)
noch einmal inkrementiert werden, a also nun 15, anschliessend wieder
addiert zu werden, also 13+13+15=41.
Genau das spucken alle Compiler auch aus.
Merkwürdiges geschieht nun, wenn ich auf der linken Seite wieder das
+ hinzufüge. Also
a+=++a+a+++(++a)
Nun sollte doch folgendes passieren:
Wieder wird a, vormals 12 durch das erste ++a -> 13, dann wieder mit sich
selbst addiert, also 13+13, dann wieder inkrementiert, a wird 14, dann
nocheinmal durch das (++a) inkrementiert, wodurch ich nun 13+13+15=41,
so wie oben erhalte, dann mit a=15 dem linken a zugewiesen um
anschließend mit dem Ergebnis der Berechnung des Ausdrucks rechts,
addiert zu werden, also 41+15=56.
Als Ergebnis erwarte ich also 56.
Wenn man das Proggi compiliert und laufen läßt, passieren
seltsame Dinge (je nach Compiler)…
Viel Spaß beim Knobeln und probieren.
Peter
P.S: Jemand hier dessen Compiler so kompiliert dass das Prg 56 ausgibt?
Hallo Peter und alle anderen,
Bei meinem IDE (IAR Embedded Workbench, Compiler?) erhalte ich
- in der vorletzten Aufgabe 42 anstatt 41. Auch nach meinen Überlegungen müsste es 41 sein.
- Bei der letzten Aufgabe erhalte ich auch 56.
Hallo Wolfgang, besten Dank für die Zusendung dieser Knobelaufgabe. Das hat mich mal wieder daran erinnert, dass ich eigentlich noch eine ganze Reihe Aufgaben lösen wollte. Ich muss wohl mal in meinem Postfach nachsehen. . .
Grüsse aus Pforzheim
Dieter
Hallo Peter,
diese C-Knobelaufgaben können manchmal ganz schön gemein sein, und so verzweilfeln auch manche Compiler, obwohl die Programmierer der Compiler bei (einfachen) Zuweisungen sich eigentlich an ANSI halten sollten.
Diese Knobelaufgaben sind für einige vielleicht genau das richtige für die Adventszeit
Viele Grüße auch an Ihre Frau
@Dieter,
.
Genau, dranbleiben
Die einzelnen Folgen sind per Email verschickt worden.
Ich habe sie aber auch unter folgendem Link der Reihe nach aufgelistet:
http://et-tutorials.de/mikrocontroller/
Bei der Simulation kommt ein Fehlermeldung nämlich
error 56, can´t open file ( ich denke 2k ist übeschritten) aber wie kann ich diesen Fehler überwinden.
Danke
Asgedom
Wenn die 2k-Grenze überschritten ist, musst Du versuchen, wenn Du bei der kostenlose Variante bleiben möchtest, das Programm kleiner zu machen.
Meisten gibt es ein paar Zeilen, die man optimieren kann.
Hallo Wolfgang und allen
)
wenn ich mein Programm so schreibe (…in Endlosschleife natuerlich
…)
)
printf(“%d\n”, i++%5);
P1=i;
UART#1 zaehlt ganz normal 0 1 2 3 4 0 …
aber auf dem Port wird bis 0XFF gezaehlt, obwohl ich dachte, dass ich einfach den Wert von i in P1 kopiere. d.h., nur bis 4 zaehlen dann von NULL nochmal! Merkwuerdig( …fuer mich
Danke fuer die Inputs!
Gruss Francis
Ja, Du kopierst i nach P1 ( i wird in jedem Schleifendurchgang hochgezählt) gibst aber über die UART Modulo 5 von i aus, also 0 1 2 3 4 0 …
oh je!
dann muss ich mit mehrere Anweisungen es darstellen
i=i%5;
printf(“%d\n”, i);
P1=i;
i++;
Danke Dir