14.März: Das erste mal Samstags Uni, und erstmals stand Programmieren auf dem Plan: Prozedurale Programmiertechniken bei Frau Professor Dr. Susann Kowalski. Da ich bisher noch nie in C programmiert hatte, war ich sehr gespannt, wie es laufen würde.
Der Kurs berücksichtigt, dass sowohl erfahrene Programmierer, als auch Leute, die noch nie in ihrem Leben eine Zeile Code geschrieben haben, Wirtschaftsinformatik studieren. Dementsprechend einfach ist der Einstieg in die wundersame Welt der C-Kompiler gestaltet - zumindest für die erstgenannte Gruppe.
Nach einer kurzen theoretischen Einführung in C und die PPT, wurden recht schnell die ersten kleinen Programme in C geschrieben. Das dabei verwendete Compilersystem LCC-Win32 erscheint mir nicht wirklich auf der Höhe der Zeit. Allerdings habe ich, wie gesagt, auch keine Ahnung von C.
Mir war ja schon zu Ohren gekommen, dass die C-Syntax weitestgehend identisch mit PHP ist (oder besser gesagt umgekehrt). Und es stimmt! Hier also mein erstes C-Programm:
#include <stdio.h>
int main()
{
printf("Hallo Welt");
return 0;
}
Beeindruckend, ich weiß. Über Eingabe und Ausgabe von Werten ging es über Kontrollstrukturen (If/Else , Switch/Case ) zu den verschiedenen Arten der Schleifen (For, while und Do/While).
Wir "Fortgeschrittenen" (hust) durften uns schon mal an das "Reis auf dem Schachbrett" Problem wagen. Klassischer Fall von Hochmut kommt vor dem Fall: Obwohl wir uns unserer Programmierkünste so sicher waren, bekamen wir kein ordentliches Ergebnis mit unserem Code heraus. Mittlerweile meine zu wissen, woran es liegt: Die Zahl ist einfach zu groß für die Datentypen. Weder INT, noch LONG können derart große Zahlen darstellen. Das Ergebnis lautet -9.223.372.036.854.775.808, muss aber eher 18.446.744.073.709.551.615 sein. Hier mein Code:
#include <stdio.h>
int main() {
unsigned long long koerner=0;
int schachfeld;
for (schachfeld = 1; schachfeld <= 64; schachfeld++)
{
if (koerner<1)
koerner++;
else
koerner = koerner * 2;
printf("Feld %d: %lld Koerner\n", schachfeld, koerner);
}
return 0;
}
Update: Mittlerweile weiss ich, wo der Fehler lag:
- Ist das Ergebnis (fast) richtig: Es sind 9.223.372.036.854.775.808 Reiskörner auf dem 64. Feld. Nur das Vorzeichen stimmt nicht
- Um den Datentypen unsigned long long in printf darzustellen, muss man %llu statt %lld verwenden
- Im Code fehlt die Summe aller Reiskörner. Das sind tatsächlich 18 Trillionen und ein paar Zerquetschte.
Daher hier jetzt abschließen der richtige Code:
#include <stdio.h>
int main() {
unsigned long long koerner=0;
unsigned long long koerner_gesamt=0;
int schachfeld;
for (schachfeld = 1; schachfeld <= 64; schachfeld++)
{
if (koerner<1)
koerner++;
else
koerner = koerner * 2;
koerner_gesamt = koerner_gesamt + koerner;
printf("Feld %d: %llu Koerner\n", schachfeld, koerner);
}
printf("Summe: %llu Koerner\n", koerner_gesamt);
return 0;
}
Beeindruckend dieser Dirk.. ich glaube wir werden noch viel Spaß in PPT haben :) !
AntwortenLöschenVersuchs mal mit potenzieren: pow(2,64) ;o)
AntwortenLöschenNaja, das wäre natürlich die mathematisch einfachste Lösung gewesen (wobei die Lösung 2^64 - 1 sein müsste, oder?). Aber hier ging es ja um Schleifen und Iterationen, von daher wurde dieser Ansatz gewählt.
AntwortenLöschenAlso wenn das zur Übung gehört, dann stimmt das natürlich! ;o)
AntwortenLöschenIch geh mal davon aus, dass das mit -1 richtig ist aber ich kenn ja die Aufgabenstellung nicht.