Follow me on Twitter!

Variablenzuweisung – Teil 2

 Kategorien:              Mikrocontroller

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 .]


Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)

1 Star2 Stars3 Stars4 Stars5 Stars (Gibt jetzt das erste Rating ab!)
Loading ... Loading ...


Ähnliche Artikel

Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:

Keinen passenden
Artikel gefunden...?


... dann hilft vielleicht
die Suche!

Geschachtelte for-Schleife Im letzten Artikel hast Du die Schleifen-Programmierung mit „for“ kennengelernt. Die Aufgabe für heu...

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...

Berechnung der Kapazität eines Drehkondensators In diesem Artikel geht es um die Lösung der Aufgabe aus der Folge zum aufgewickelten Kondensator. Im...

Lösung für eine Funktion zur Münzeingabe Im heutigen Artikel möchte ich eine mögliche Lösung für die Aufgabe aus dem letzten Artikel, nämlich...

9 Kommentare
Hier kannst Du den Artikel kommentieren: »

  1. #include
    #include
    main(){
    int i=4;
    while(1){
    printf(” %d\n “,i%5,++i);
    getchar();
    }
    }
    Ich hoffe diesmal alles richtig gemacht zu haben
    Heinrich.

  2. Psst, nicht zu früh verraten ;-)
    Sieht aber nicht schlecht aus.

  3. 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

  4. Meins ist kürzer ;D
    main… int i;
    while… printf(“%d\n”,j++%5);

  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”);
    }

  6. 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.

  7. 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?

  8. 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

  9. 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/

Kommentiere hier den Artikel:

Abonnieren ohne einen Kommentar abzugeben