Monthly Archives: Juli 2012

I like it double!

Endlich schönes Wetter – die Sonne scheint in mein Zimmer und das stundenlange Programmieren macht gleich viel mehr Spaß!

Nach der Einführung in printf geht Erlenkötter in seinem nächsten Kapitel auf scanf ein. Bisher kann ich ein Programm dazu bringen, mir entweder einen Text oder das Ergebnis einer Rechnung in mein Terminal zu posten. So weit so unnütz. Bzw. umständlich, da ich jeden neuen Term erneut in das Programm hacken müsste. Mit scanf kann ich dynamisch die Werte immer wieder neu eingeben und damit die Variablen mit Werten belegen.

Ein ganz simples Programm wäre z.B.

#include <stdio.h>
main ()
{
1)      int x,y;
        printf("\n\tG e n e r i s c h e s");
        printf("\n\tA d d i t i o n s p r o g r a m m\n");
2)      printf("\nBitte x eingeben: ");
3)      scanf("%i", &x);
        printf("\nBitte y eingeben: ");
        scanf("%i", &y); 
4)      printf("\nDas ergibt eine stolze %i\n", x+y);
        printf("\nMensch, toll!\n\n");
}


Um das Programm auszuprobieren müsst ihr das Programm wie immer in einen Editor packen, compilen und dann ausführen. Es fragt nach zwei Werten, um sie x und y zuzuordnen.

1) X und Y sind in diesem Falle Variablen des Typs Integer. Variablen müssen nämlich immer deklariert werden. Der gemeine Hacker würde jetzt irgendeine verrückte Zahl eingeben und das Programm zum Absturz und meinen Computer zum Explodieren bringen. Der Typ Integer ist zwar sehr leicht verdaulich für einen Rechner, das heißt, er kann damit effizient und schnell rechnen, dafür können die Variablen in diesem Falle nur einen bestimmten Wertebereich abdecken.

2)  Wenn das Programm gestartet wurde fragt es nach einem Wert für x. Den tippe ich ein und scanf 3) liest diesen Wert ein und belegt x damit. Wenn dann auch noch y bestimmt wurde kann das Programm die Rechnung ausführen 4) und gibt das Ergebnis aus.

Und weil ich gestern so fleißig und soziophob war hab ich gleich noch die Programmieraufgabe bewältigt:

Schreiben Sie ein Programm, das den Benzinverbrauch eines Autos in Litern je 100 Kilometern errechnet.

Nix leichter als das, Helmut!

#include <stdio.h>
main () 
{       
1)      float liter, kilometer; 
        printf("\n\t1 B e n z i n v e r b r a u c h\n");
        printf("\nDieses Programm berechnet den durchschnittlichen\n"); 
        printf("Verbrauch von Benzin in Litern pro 100km\n");
        printf("\nBenzinverbrauch in Litern eingeben: ");
2)      scanf("%f", &liter);
        printf("\nGefahrene Kilometer angeben: ");
3)      scanf("%f", &kilometer);
4)      printf("\n\nDer Verbrauch liegt bei %.2f Litern pro Hundert Kilometer\n\n", liter*100/kilometer);
5)      printf("\n\nVielleicht solltest du besser Fahrrad fahren.\n\n");
}


Na zugegeben, der Code leidet ein wenig unter meinen Ästhetikvorstellungen, die sich allerdings auf das ausgegeben Programm im Terminal beziehen.
Bei diesem Programm habe ich die Variablen als float deklariert 1). Float kann einen viel größeren Wertebereich abdecken und Zahlen mit Nachkommastellen darstellen. Isn Ding wa? Wobei der bevorzugte Fließkommatyp double ist, dessen Platzhalter dann nicht mehr %f ist, sondern %lf. Die Genauigkeit bei double erstreckt sich über 15 Nachkommastellen. Wie praktisch!
Das Programm fragt nach dem Start wiederum nach zwei Werten. Einmal nach den getankten Litern 2) und dann nach den gefahrenen Kilometern 3). Die Werte werden dann wieder in der Rechnung eingefügt und das Ergebnis wird ausgegeben.
Allerdings wird das Ergebnis nur mit zwei Nachkommastellen ausgegeben, weil mich der Rest nicht interessiert. (Ich hoffe mein ehemaliger Mathelehrer liest mit und kriegt jetzt das Kotzen hähä!) Die Nachkommastellen kann ich begrenzen, indem ich nicht einfach %f als Platzhalter schreibe sondern %.2f  4)

Ja, haha, mein erstes Programm! Ganz alleine, ohne Schwimmflügel, freihändig, ohne Messer und Gabel, ohne Verstärker, ohne Laktose, ohne HartzIV, nur mit ein bisschen Kreativität und mithilfe von etwa 13 Fehlermeldungen als ich es zum ersten Mal kompilieren wollte…
Aber tatsächlich war das debuggen (das Beheben dieser Fehler) ganz spaßig. Vermutlich weil es größtenteils leicht zu behebende Fehler des Typs “Scheiße, Semikolon schon wieder vergessen” waren. Und natürlich weil es ein recht simples Programm ist. Ich hab’s auch gleich in ‘nen Pastebin gesteckt: http://pastebin.com/70WJMxk7

Ja, ach, was bin ich stolz mich betrinken gegangen danach.

Wenn ihr jetzt ein Benzinverbrauchsprogramm braucht, könnt ihr gerne meins benutzen, ihr müsst auch nix bezahlen oder so, gnihihihi…Vielleicht habt ihr ja Linux auf eurem Auto, dann könnt ihr das gleich anwenden. Aber nicht dass ihr das falsch versteht: 5)

Überhaupt möchte ich als nächstes lieber ein Programm für Fahrradfahrer_innen schreiben. Vielleicht eines, das Zwischenwerte von Kalorien- oder Wasserverbrauch pro km zwischenspeichert in einer Datei. Aber das muss ich erst noch lernen. Außerdem wurde mein Hinterrad geklaut und ich gönne es natürlich Nichts und Niemandem auf der Welt gerade, Fahrrad fahren zu können. Bis ich wieder das Geld habe um mein Fahrrad zu reparieren. Bis dahin dürfte aber noch *hust ein wenig Zeit vergehen…

———————————

Achja, vermutlich hagelt es in den Kommentaren jetzt Facepalms und Verbesserungsvorschläge oder beides gleichzeitig. Aber bedenkt bei euren äh…Ratschlägen bitte, dass ich das Programm mit meinem vorhandenem Wissen geschrieben habe. Also nehmt nicht zu viel vorweg, besserer Code wird folgen, sobald ich mehr gelernt habe. Aber für hilfreiche Tips bin ich natürlich dankbar :)

Getaggt mit

I C & U

Lang ist’s her, Freunde und Freundinnen und Bernd!
Aber manchmal müssen die Dinge auch einfach ruhen. Damit zum Beispiel der Shitstorm vorüberzieht und ich über Tech-Themen schreiben kann ohne mein mittlerweile >9000 Stimmen großes Gewissen im Hinterkopf. Oder bis ich die Scherben meiner Uni-Prokrastination. So kurz vor Scheinausgabe.

Jedenfalls freue ich mich jetzt auf viel Zeit zum Programmieren, basteln, bausteln und bloggern! Bis ich dann in zweieinhalb Monaten feststelle, dass ich noch die Hausarbeit in Kulturtheorien NAEGAL

Um an den vorherigen Post anzuknüpfen – ich hab ja das Buch gewechselt, von Kernighan&Ritchie zu Erlenkötter. Was sich nach einer ziemlichen Einbuße an Coolness anhört ist ein wichtiger Schritt nach vorn für mich gewesen. In den Kommentaren des letzten Posts ist übrigens gut nachzulesen, weswegen manche K&R für den überlegenen Weg halten, aber es bewährte sich trotzdessen meine These, dass es nicht für komplette Programmier-Neulinge wie mich geschaffen ist. Und mit Neuling meine ich, dass ich noch nicht sehr viel Praxis habe, vor allem auf dieser Abstraktionsebene.

Fangen wir also mit dem guten, alten, konservativen, erzkatholischen Vorne an. Was ist C?

C ist eine Programmiersprache. Und sie heißt C, weil sie auf die Sprache B folgte. Genau genommen auf die Sprache BCPL, oder auch “Before C Programming Language”. Rekursion und so, haha. Sie wurde in den Siebzigern in den Bell Laboratories entwickelt, um auf Unix zu programmieren und um eine Assembler-Situation zu vermeiden. Von den mittlerweile bekannten Antagonisten Kernighan und Ritchie wurde sie veröffentlicht. Ende der Achtziger wurde sie von einem ANSI-Kommitee standardisiert und bis heute mehrmals weiterentwickelt. Unter anderem zu Objective C und C++, woraus sich wiederum Java entwickelte.

Und was bringt mir C nun? Na ich kann damit Programme schreiben! Zum Beispiel so geile Rechenprogramme oder Spiele oder sogar Blogs. Dafür schreibe ich erst einen Quellcode, dann kompiliere ich den und dann linke ich das Ganze. Kompilieren bedeutet, dass ich ihn von einer Sprache in die andere übersetze, z.B. von C nach Assembler. Und das ist ne feine Sache, so ein Compiler. Aber darüber schrieb ich schon vor langer Zeit – trotzdem, ich kriege immer noch ein bisschen feuchte Augen wenn ich dran denke, wie schön und magisch und genial… usw.
Der Linker verbindet den Programmcode mit den Bibliotheken, die gebraucht werden. Er ist sozusagen die studentische Hilfskraft, der vom Code (dem Prof) in einer schlecht formulierten Email gesagt wird “Heyhey, ja, die Stabi, und die Regwibi und die stdio, da brauch ich überall Kopien von Dings für das Paper!” Und der Linker muss dann schauen, welche Funktionen gebraucht werden und in welcher Bibliothek sie lagern. Eine Funktion kann bspw. “printf” sein und die findet man in der stdio-Bibliothek. Diese bindet der Linker dann mit dem Programm. Und statt der bloßen Anweisung “print” steckt dahinter eine Funktion, die sich gewaschen hat!

Und jetzt? H4ck0rn! Zum Anfang ein kleines Rechenprogramm. Ich nenne es “kleines Rechenprogramm”. Es gibt Text und eine Rechenaufgabe in mein Terminal aus und berechnet gleich noch die Lösung, als hätte es nie was Anderes getan!

#include <stdio.h> 
main () {
        printf("\nDies wird dein Leben verändern\n");
        printf("13 * 7 = %i \n", 13 * 7 );
        printf("\nMagie!\n") ;
        }

In der ersten Zeile wird angegeben, welche Bibliothek inkludiert werden soll. In diesem Falle die Standard-Input-Output-Bibliothek.
Main bedeutet soviel wie “Hauptfunktion jetze”, wobei in den Klammern die hier leer sind für gewöhnlich Parameter angegeben werden. Die geschweiften Klammern umrahmen einen Block von Anweisungen, in diesem Falle drei printf-Funktionen.

Jeder printf-Anweisung folgt ein Text in Klammern und Anführungszeichen, der ausgegeben werden soll. Die \n-Dinger sind Escapesequenzen und bedeuten “new line”, es wird also eine neue Zeile angefangen. Escapesequenzen werden immer mit einem Backslash geschrieben.

Ach und ganz wichtig: Nach jeder dieser Klammern ein verficktes Semikolon. Nicht das verdammte Semikolon vergessen, nein, nicht vergessen!

Soweit, so nachvollziehbar. Aber behold! Die Zeile mit den Zahlen sieht schon ein bisschen komplizierter aus, stimmt’s? Ist aber eigentlich sehr schlüssig aufgebaut. In den Anführungszeichen steht die Aufgabe, die geprinted werden soll. Aber statt des hässlichen %i wird das Ergebnis des Terms nach dem Komma dafür eingesetzt. Das rechnet printf ebenfalls aus.

Und das Semikolon nicht vergessen und nicht die zweite geschweifte Klammer vergessen! Fertig ist das Programm.
Jetzt verwandeln wir das Programm kleinesrechenprogramm.c in ein Programm namens kleinesrechenprogramm mithilfe eines Compilers

cc kleinesrechenprogramm.c -o kleinesrechenprogramm

um es dann auszuführen:

./kleinesrechenprogramm

Und dann steht Folgendes in meinem Terminal:

Dies wird dein Leben verändern

13 * 7 = 91 
Magie!

Ist das nicht geil??? Jetzt könnt ihr immer, wenn keiner danach gefragt hat, Rechenaufgaben nicht nur lösen, sondern auch schön ausschreiben. Im Supermarkt, in der Uni, auf Partys, zu Hause, alleine…

Ich habe jetzt erstmal versucht, das Programm ein bisschen umzumodellieren, um es aus dem Kopf schreiben zu können. Weitere Rechenoperationen sind +, -, und / für Division. Das klappt auch schon ganz gut, spätestens nach diesem doch hoffentlich idiotensicheren Post. Viel Spaß beim Nachprogrammieren, aufstrebende Nachwuchshacker. Ich weiß es ist ein kleiner Schritt, aber was dich am Trinken im Park hindert, macht dich nur blasser.

Gute Nacht!

Getaggt mit
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 105 Followern an