Forum: Ausbildung, Studium & Beruf Ideen zu Programmiervorlesung


von Felix (Gast)


Lesenswert?

Hallo ich wollte mal ein allgemeines Brainstorming anstoßen. Also ich 
werde im Ausland(Vietnam) eine Vorlesungsreihe(30 vl und 30 Workshops) 
an der Uni zum Thema Programmier Einführung in C geben. Das Thema ist so 
vorgegeben(also lohnt eine Diskussion über den Sinn nicht). Aber ich 
wollte mal in die Runde nach Ideen fragen was ihr mal gerne in so einer 
Vorlesung an Themen gehört hättet, gute Zitate oder Beispiele, 
Klausuraufgaben die ihr besonders gut fandet, tips zum allgemeinen 
Studium(was man den Studenten mitgeben kann z.B. von Anfang an in 
Gruppen zu arbeiten) oder praktische Programmieraufgaben die Ihr gut und 
lehrreich fandet. Ich bereite gerade die VL vor und hab schon ein paar 
Sachen aber es gibt bestimmt viele Sachen die Ich noch nicht habe.

von Idee (Gast)


Lesenswert?

"Ich bereite gerade die VL vor und hab schon ein paar Sachen"
-> Dann zeig mal? Wieso sollen wir deine Vorlesung vorbereiten?

Sonst sag ich mal als Antwort: Einführung in C -> google -> da hast 'ne 
Einführung.

"z.B. von Anfang an in Gruppen zu arbeiten"
-> und sich auf den Arsch zu sitzen. Studienerfolg ~ Fleiß.

von Dumdi D. (dumdidum)


Lesenswert?

Die letzten Vorlesungen dem undefined behaviour widmen. Warum es 
ueberhaupt existiert (ermoeglicht starke Compileroptimierungen, in C 
nimmt der Compiler an, dass der Programmierer es besser als der Compiler 
weiss.). Welche Konstruktionen UB sind. Z.b. ist

Printf ("%s", p);
If (p) *p=1;


Mit p pointer auf char UB fall p NULL ist, und der Compiler optimiert 
somit das if(p) weg.

von Felix (Gast)


Lesenswert?

;-) Sollt ihr ja garnicht. Ich such nur Ideen. Ich hatte ein paar 
während langweiliger Vorlesungen wo ich mir gedacht hätte das wäre toll 
das mal zu hören. Du musst ja auch nix dazu sagen. Wenn du aber nicht 
was hilfreiches in nem Forum sagen willst warum bist du dann hier?

von Felix (Gast)


Lesenswert?

@Dumdi Dum
Ja das ist ne gute Idee mit dem undefined behavior. Wofür steht UB?

von Felix (Gast)


Lesenswert?

Sorry UB=undefined behavior stand auf dem Schlauch ;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dumdi D. schrieb:
> Mit p pointer auf char UB fall p NULL ist,
> und der Compiler optimiert somit das if(p) weg.
Das kann der Compiler aber nur, wenn p ein konstanter Nullpointer ist. 
In diesem Fall ist einfach die if-Abfrage immer false und wird nie 
ausgeführt. Deshalb optimiert der Compiler die Abfrage weg (er könnte 
sie auch drin lassen, aber wozu? der darin befindliche Code wird ja nie 
angesprungen). "Undefiniert" ist an diesem Verhalten gar nichts. Es ist 
lediglich "optimiert".

Aber gerade die Optimierungsstrategien des Compilers und warum z.B. eine
for(int i=0; i<1000; i++);
Schleife einfach ungefragt wegoptimiert werden kann, das sollte schon 
erwähnt werden.

Und natürlich die ganze volatile-Geschichte und Zugriffe auf globale 
Variablen im Interrupt sind ein Wort wert.

Wobei natürlich "eine VL in C" wesentlich unhandlicher und abstrakter 
ist, als "eine VL in C für Mikrocontroller"...

: Bearbeitet durch Moderator
von MaWin (Gast)


Lesenswert?

Dumdi D. schrieb:
> Printf ("%s", p);
> If (p) *p=1;

Ist tatsächlich irgendwo festgelegt, dass man printf("%s") keinen 
NULL-Pointer mitgeben darf? Ich hätte da eher erwartet, dass printf 
sowas wie <NULL> ausgibt und das if nicht wegoptimiert wird.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:
> Ist tatsächlich irgendwo festgelegt, dass man printf("%s") keinen
> NULL-Pointer mitgeben darf?
> Ich hätte da eher erwartet, dass printf sowas wie <NULL> ausgibt
So ist es:
http://codepad.org/OKkBSpww

Nicht unerwähnt bleiben sollte auch, dass eine einzelne Programmzeile 
beliebig lang oder kurz dauern kann. Denn manche meinen tatsächlich 1 
Zeile = 1 Befehl = 1 CPU-Takt. Hier wäre ein Fingerzeig auf den 
erzeugten Assemblercode und eine kurze Analyse der dortigen Befehle 
sicher interessant. Für manche Programmierer wird das zwar das einzige 
Mal im Leben sein, dass sie sowas sehen, aber es ist dann schon mal im 
Hinterkopf verankert, dass da noch mehr ist...

: Bearbeitet durch Moderator
von Jeff P. (linum)


Lesenswert?

Bei mir damals, in den Vorlesungen, fing es mit der Geschichte von C an 
und ging dann über Zahlensysteme zum ersten "Hello-World"-Programm...
Und dann würde ich versuchen die Studys viel selber machen zu lassen.
Prgrammieren ist wie ein Handwerk...vom Zugucken lernt man es nicht...
Gruss

von Felix (Gast)


Lesenswert?

@Jeff Portnoy
“First, solve the problem. Then, write the code.”
(John Johnson)

um mal eins der klugen Zitate meiner Vorlesung zu zitieren.
Aber danke schon mal für die guten Ideen bis jetzt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix schrieb:
> um mal eins der klugen Zitate meiner Vorlesung zu zitieren
https://fortrabbit.github.io/quotes/

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Ich ratter mal die Übungsaufgaben runter die ich früher gestellt habe. 
Das war für eine Fortgeschrittenenkurs und die Leute wollten gefordert 
werden, statt nur Kinderkram zuimplementieren. Allerdings war ich bei 
den Aufgaben ziemlich einfallslos. Hinzukommt dass die Algorithmen nicht 
direkt auf die später zu schreibenden Programme abgestimmt waren.

- Implementiere eine Priority-Queue mit Red-Black Trees
- Implementiere Arbitrary Precision Arithmetik: Addition und Subtraktion
- Implementiere Arbitrary Precision Arithmetik: Multiplikation
- Implementiere Arbitrary Precision Arithmetik: Division
- Implementiere eine Skip-Liste.

- Schreibe eine eigene Version von make
- Schreibe eine eigene Version von more
- Schreibe eine eigene Version von sort
- Schreibe eine eigene Version von grep

- Schreibe ein Plotprogramm (ASCII Ausgabe)
- Schreibe einen Peephole-Optimizer für Z80 Assembler
- Schreibe einen Simulator für kontinuierliche Systeme (DGLs)

von Metatroll (Gast)


Lesenswert?

Mach die Vorlesung nicht zu stark auf C fixiert. Man kann Besonderheiten 
von C erwaehnen, aber erst sollte das Problem geloest werden. Denn sonst 
ist der Code falsch bevor zu Programmieren begonnen wurde. Nur sollte 
dies auch nicht zu ausfuehrlich geschehen, sonst klebt man an 
"Algorithmen und Datentypen - von N.Wirth" fest.

von Felix (Gast)


Lesenswert?

@MetaTroll da bin ich leider nicht frei in der Wahl. Ich habe ja 
vorgaben was sie können sollen
@Hannes Jaeger Ich habe Erstes Semester :-)
@Lothar Miller I like
“Computers are useless.  They can only give you answers.”
(Pablo Picasso)

“19 Jan 2038 at 3:14:07 AM”
(End of the word according to Unix–2^32 seconds after January 1, 1970)

von Cyblord -. (cyblord)


Lesenswert?

Hannes J. schrieb:
> - Implementiere eine Priority-Queue mit Red-Black Trees
> - Implementiere Arbitrary Precision Arithmetik: Addition und Subtraktion
> - Implementiere Arbitrary Precision Arithmetik: Multiplikation
> - Implementiere Arbitrary Precision Arithmetik: Division
> - Implementiere eine Skip-Liste.
>
> - Schreibe eine eigene Version von /make/
> - Schreibe eine eigene Version von /more/
> - Schreibe eine eigene Version von /sort/
> - Schreibe eine eigene Version von /grep/
>
> - Schreibe ein Plotprogramm (ASCII Ausgabe)
> - Schreibe einen Peephole-Optimizer für Z80 Assembler
> - Schreibe einen Simulator für kontinuierliche Systeme (DGLs)

Und damit lernt man C? Oder Programmieren im allgemeinen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Cyblord -. schrieb:
> Und damit lernt man C? Oder Programmieren im allgemeinen?
Ich stelle da gern andere Aufgaben, die man sowohl mit Brute Force als 
auch mit einem "schlauen" Algorithmus lösen kann und/oder soll.

So z.B. die Sache mit den Zügen, die von zwei Bahnhöfen losfahren und 
sich irgendwo treffen.
Frage 1: wo
Frage 2: wann
Und die Antwort darauf dann mit der klassischen Algebra in Form einer 
Quadratischen Gleichung. Oder als sukzessive Approximation durch 
Aufaddieren von kurzen Wegstrecken in kleinen Zeitabständen und 
Vergleich der Position.

Oder das Herausfinden der Anzahl von unterschiedlichen Kombinationen der 
Farbstreifen einer Flagge z.B. mit rot, grün und blau mit 3 
geschachtelten Schleifen oder mit einem lange laufenden 
Zufallsgenerator.

Also Aufgaben, die schon in Gedanken bzw. auf einem Blatt Papier leicht 
zu lösen sind und deren Antwort bekannt ist. Solche also, an denen nur 
die Umsetzung in die neue Programmiersprache neu ist.

von Geo Med (Gast)


Lesenswert?

@Felix

Kannst du  noch was dazu sagen, wie du an die Stelle gekommen bist und 
in welchen Rahmen das stattfinden soll? Bist du PostDoc?

Ich würde mich grundsätzlich an Büchern und Folien orientieren und 
sinnvolle Schwerpunkte setzen, einiges wurde ja schon genannt.

Beitrag #5217302 wurde von einem Moderator gelöscht.
von XorRaxRax (Gast)


Lesenswert?

Zum Thema undefined behaviour gibt es hier einen guten Vortrag

https://media.ccc.de/v/cccac-What-you-thought-you-knew-about-C

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

- Bring den Leuten bitte moderneres C bei. Es gibt eigentlich keinen 
vernünftigen Grund, warum man heute noch K&R oder C89 verwendet.

- Best Practice, wie Unit-Tests kann man sicher auch bereits ganz am 
Anfang erfolgreich einsetzen.

- Erkläre ihnen den Unterschied zwischen Compiler und Linker und halte 
sie erst einmal von einer IDE fern! ;-)

von Metatroll (Gast)


Lesenswert?

Die erste Frage sollte sein, was die Leute fuer eine Vorbildung haben. 
Ist ihnen programmieren schon bekannt, und nun sollen sie eine 
Schnellbleiche in C bekommen ? Dann muss man erst mal gegenueberstellen.

Wenn sie gar nichts koennen, muss man sich mit Definition, Deklaration, 
Zuweisung, Vergleich, Kontrolstrukturen, usw aufhalten.

Was an Mathematik haben sie schon drauf ?
Ist eine Integration schon bekannt ?

An einer technischen Uni wuerde ich erwarten sie kennen Programmieren, 
und benoetigen eine Schnellbleiche in C. Mathe haben sie auf einer 
einfachen Ebene drauf. Also nichts mit mehrdimensionale Optimierung. 
Rauschen wegfitten, und so.

von AAAA B. (Gast)


Lesenswert?

Was haben die Leute für Vorwissen?

von NochEiner (Gast)


Lesenswert?

Eine VL-Einheit vielleicht typischen Fehlern widmen, die man in C 
macht/machen kann. Jeder von uns ist schon mal sicher über was 
gestolpert. Coding-Style (Guide) wäre u.U. auch ein Thema

von Cyblord -. (cyblord)


Lesenswert?

Es stellt sich auch die Frage ob du Wissen über C oder Wissen über 
Programmierung allgemein vermitteln willst. Das sind zwei paar Schuhe 
und man kann nur davor warnen beides zu vermischen.

Nicht umsonst fängt so mancher Programmierkurs an der Uni mit 
ungeliebten (und praktisch unnützen) Sprachen an. Man kann aber gar 
nicht früh genug anfangen, den Studenten den Unterschied zwischen 
Konzepten und konkreten Programmiersprachen zu vermitteln.

Algorithmen und Datenstrukturen sind dann IMO nochmal ein drittes 
Gebiet, welches von den zwei Obigen auch etwas abgesetzt betrachtet 
werden sollte.

von NochEiner (Gast)


Lesenswert?

Ach ja im Zusammenhang mit Coding-Style könnte man den hier bringen (als 
Negativ-Beispiel) http://www.ioccc.org/

Beitrag #5217343 wurde von einem Moderator gelöscht.
von Felix (Gast)


Lesenswert?

Ich äußer mich mal kurz zu ein paar Sachen.
Also vielleicht ist das nicht so rüber gekommen. Ich stehe jetzt nicht 
mit dem Rücken zur Wand und suche verzweifelt nach Antworten. Ich habe 
die Vorlesung fast fertig und suche nach ein paar Gewürzen um die noch 
ein bisschen zu verbessern. Ich lebe seit drei Jahren hier und kenne die 
vietnamesische Kultur schon etwas. Außerdem haben sie mich ja gerade 
wegen der deutschen Lernart. Ich habe die komplette Vorlesung meines 
Vorgängers und kann mich an der orientieren. Also kein Blindflug. Nein 
hab noch keinen Doktor. Kommt vielleicht noch. Dafür kam das Angebot zu 
überraschend. Zu den Lerngruppen ich finde die werden zu unrecht 
abgetan. Bei den Klausuren und Aufgaben ist jeder alleine. Nur die 
Vorbereitung kann zusammen gemacht werden. Ich habe erst richtig 
angefangen zu lernen nachdem wir uns gegenseitig motiviert haben. Für 
mich war das das beste was ich machen konnte in der Uni. Bei meinen 
Kommilitonen war es ähnlich. Wir haben nur leider viel zu spät 
zueinander gefunden.

von Arc N. (arc)


Lesenswert?

Felix schrieb:
> Ich äußer mich mal kurz zu ein paar Sachen.
> Also vielleicht ist das nicht so rüber gekommen. Ich stehe jetzt nicht
> mit dem Rücken zur Wand und suche verzweifelt nach Antworten. Ich habe
> die Vorlesung fast fertig und suche nach ein paar Gewürzen um die noch
> ein bisschen zu verbessern.

Undefined Behavior wurde schon genannt.
Secure Coding 
https://wiki.sei.cmu.edu/confluence/display/c/SEI+CERT+C+Coding+Standard
Dazu könnte man auch noch optional Reversing machen, um zu zeigen wie 
man solche Bugs ausnutzen kann (natürlich nicht gleich gegen moderne 
Systeme und Compiler also erstmal ASLR aus, mit -fno-stack-protector 
übersetzen, 32-Bit usw. einfache Challenges: Buffer-Overflows ausnutzen, 
Format Strings, da gibt's genug zum Austoben)

von Felix (Gast)


Lesenswert?

Danke für secure coding. Das sollte ich auf jeden Fall einbauen

Beitrag #5217618 wurde von einem Moderator gelöscht.
von Daniel A. (daniel-a)


Lesenswert?

Ich würde noch einige Allgemeine Dinge einfliesen lassen:
 * Man sollte keinen Code kopieren, den man nicht versteht
 * Beispiele und best practices sind nicht der Weisheits letzter 
schluss, je nach Problemstellung und Situation können unterschiedliche 
Herangehensweisen sinn machen. Letztendlich füren immer viele wege nach 
Rom. Ich habe schon Leute getroffen die gefragt haben wie man etwas 
umsetzt, und eine art absolute Antwort gesucht haben, statt sich 
verschiedene Herngehensweisen und deren Implikationen zu überlegen.
 * C fehlen komplexere Sprachkonstrukte und Konzepte die viele andere 
Programiersprachen haben, die Sprachkonstrukte sind recht Primitiv, aber 
den anderen Sprachen keineswegs unterlegen. Häufig hat man mehr 
Kontrolle darüber was der code alles tut und wie man es umsetzen will, 
aber man kann fast alle komplexeren Konzepte wie OOP auch in C recht 
einfach nachbilden. Das Daten und Funktionen getrennt sind betrachte ich 
als grossen Vorteil von C gegenüber vielen anderen sprachen.

Der C Präprozessor ist sehr mächtig, aber nur wenige trauen sich diesen 
zunutze zu machen. Ein paar Anwendungsszenarien können nicht schaden:
 * Include guards
 * Kleine Templates
 * Mehrere korrelierende Listen:
1
#define SOME_CONSTANTS \
2
  X(TEST) \
3
  X(PIZZA)
4
5
#define X(Y) #Y,
6
const char* constant_names[] = {SOME_CONSTANTS};
7
#undef X
8
9
#define X(Y) CONSTANT_ ## Y,
10
enum constant_list {
11
  SOME_CONSTANTS
12
  CONSTANT_COUNT
13
};
14
#undef X
 * Hinzufügen von Funktionsnamen usw. bei Logging funktionen
 * Häufig verwendete non-standard Macros, z.B. Arraygrösse bestimmen, 
container_of, MIN/MAX, etc.
 * Conditional compilation
etc.

Auch interressant sind Methoden dinge ohne Heap allocationen zu tun, und 
deren Grenzen. Die linked list Implementierung im Linux Kernel zum 
Beispiel ist faszinierend, keine Dynamischen allocationen, und die 
einzige Limitation ist das ein Element nicht doppelt in der Liste sein 
kann.

von Felix (Gast)


Lesenswert?

Das sind aber leider die letzten Probleme die Vietnamesen mit Ausländern 
erörtern wollen. Vielleicht auch gut so weil sie das eigentlich selber 
besser hand haben als man das Ausländer kann. Was bringt einem eine 
Vorlesung in Vietnamesisch wenn 95% der Wissenschaft in Englisch ist. 
Englisch ist halt eine gute Möglichkeit hier etwas zu erreichen.
Kurz gesagt ich bin weder hier um Probleme zu lösen noch ist das bei der 
jetzigen Wirtschaft nötig.

von Felix (Gast)


Lesenswert?

@Daniel Abrecht
danke. Vielleicht nur zum code kopieren den man nicht kennt. Dann dürfte 
man strenggenommen auch keine librarys nutzen ohne den Source Code zu 
kennen.

Beitrag #5217749 wurde von einem Moderator gelöscht.
Beitrag #5217812 wurde von einem Moderator gelöscht.
Beitrag #5217836 wurde von einem Moderator gelöscht.
von hansi (Gast)


Lesenswert?

Also wenn es um eine generelle Programmiereinführung anhand der 
Programmiersprache C geht, würde ich folgendes vorschlagen:

- Rekursion:
Viele Programmieranfänger haben Probleme Rekursionen anzuwenden oder 
überhaupt nachzuvollziehen.
Es würde auf jeden Fall Sinn machen etwas zu Rekursionen zu sagen, wie 
man diese implementiert und wann diese eingesetzt werden können. Am 
besten an ein paar Beispielcodeschnipseln.

- Kreative Programmieraufgaben:
Bei der Einführung von Schleifen z.B. ein Brute Force Programm für 
einfache Passwörter.
Beim Ein- und Auslesen von Dateien z.B. die Caeser/Vignere 
Verschlüsselung programmieren.
Beim Arbeiten mit Strings vllt einen einfachen Esolang-Interpreter wie 
MiniStringFck oder ähnliches.
Interessante Programmieraufgaben spornen die Studenten mehr an und sie 
haben nicht das Gefühl etwas komplett nutzloses herunterzucoden.

Beitrag #5217869 wurde von einem Moderator gelöscht.
von Dumdi D. (dumdidum)


Lesenswert?

Na los, felix erklaer den hier doch mal warum das printf mit nullpointer 
UB ist.

von MaWin (Gast)


Lesenswert?

Dumdi D. schrieb:
> Na los, felix erklaer den hier doch mal warum das printf mit nullpointer
> UB ist.

Ich warte auch noch.

Vielleicht war so etwas gemeint:
1
strcpy(x, p);
2
If (p) *p=1;

strcpy dereferenziert in jedem Fall p[0]. Deshalb darf if(p) durch if(1) 
ersetzt werden.

von Arc N. (arc)


Lesenswert?

MaWin schrieb:
> Dumdi D. schrieb:
>> Na los, felix erklaer den hier doch mal warum das printf mit nullpointer
>> UB ist.
>
> Ich warte auch noch.
>
> Vielleicht war so etwas gemeint:
>
>
1
> strcpy(x, p);
2
> If (p) *p=1;
3
>
>
> strcpy dereferenziert in jedem Fall p[0]. Deshalb darf if(p) durch if(1)
> ersetzt werden.

7.21.1 String function conventions
1
... in all cases a char * or void * argument points to the initial (lowest addressed) character of the array. If an array is accessed beyond the end of an object, the behavior is undefined.
Also wie immer: ist x oder p oder sind beide Null, darf da alles 
rauskommen. Beim printf genauso:
7.19.6.1 The fprintf function
1
... the argument shall be a pointer to the initial element of an array of character type
was bei einem Nullpointer passiert ist undefiniert.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Lesenswert?

Felix schrieb:
> @Jeff Portnoy
> “First, solve the problem. Then, write the code.”
> (John Johnson)
>
> um mal eins der klugen Zitate meiner Vorlesung zu zitieren.
> Aber danke schon mal für die guten Ideen bis jetzt.

Da hat er nicht Unrecht, der Mann. Und wenn Du schon bei Zitaten bist, 
hier gleich noch zwei: "Premature optimization is the root of all evil." 
(Donald E. Knuth) und "Measure, don't guess." (Kirk Pepperdine).

von Sheeva P. (sheevaplug)


Lesenswert?

Torsten R. schrieb:
> - Bring den Leuten bitte moderneres C bei. Es gibt eigentlich keinen
> vernünftigen Grund, warum man heute noch K&R oder C89 verwendet.
>
> - Best Practice, wie Unit-Tests kann man sicher auch bereits ganz am
> Anfang erfolgreich einsetzen.
>
> - Erkläre ihnen den Unterschied zwischen Compiler und Linker und halte
> sie erst einmal von einer IDE fern! ;-)

Leider kann ich hier nur ein "lesenswert" vergeben. Ich wollte, es wären 
tausend!

von Sheeva P. (sheevaplug)


Lesenswert?

NochEiner schrieb:
> Ach ja im Zusammenhang mit Coding-Style könnte man den hier bringen (als
> Negativ-Beispiel) http://www.ioccc.org/

Negativbeispiele sind für Anfänger schlecht. Die prägen sich das ein und 
Du bekommst es nur mit einem riesigen Aufwand wieder heraus.

von Felix (Gast)


Lesenswert?

Sheeva Plug danke für das optimization das wollte ich immer mal 
anwenden.
ja mit c99 oder c11 macht natürlich Sinn. Aber bei den Grundlagen sind 
die Unterschiede noch nich so groß. Pointer bleibt pointer. Aber ich 
werde das noch etwas raus arbeiten.
die IOCCC beispiele sind so schlecht das sich niemand die ernsthaft 
merken wird

von Felix (Gast)


Lesenswert?

Danke für die ganzen Anregungen und Beispiele. Ich bin den thread gerade 
durchgegangen und hab so einiges übernommen.

Zum Thema Rekursion bieten sich dann natürlich die Tower of Hanoi an ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.