Kurs:Wie funktioniert eigentlich ein Computer/C Kurs

Aus Wikiversity
Wechseln zu: Navigation, Suche


Willkommen in unserem kleinen Crash C-Kurs. In diesem Kurs geht es vor allem darum die nötigsten Grundlagen von C zu erlernen, die wir später benutzen werden, um Programme zu dekompilieren. Das Ziel dieses Kurses kann es nicht sein, vollständig C zu lernen. Viel mehr geht es darum gemeinsam auf einen gleichen Stand zu kommen.

Lektion 1[Bearbeiten]

In der ersten Lektion geht es noch gar nicht um C direkt, sondern viel mehr darum uns optimal für die Kursarbeit sowie die Programmierung mit C vorzubereiten.

Ubuntu installieren[Bearbeiten]

Ubuntu ist ein freies Linux Betriebssystem. Es kann kostenlos unter diesem Link herunter geladen werden.

Um Linux neben Windows zu installieren gibt es mehrere Optionen:

  1. Wubi ermöglicht es euch Linux sozusagen als Programm in euer Windowssystem zu installieren
  2. Mit der Software VirtualBox von Oracle kann man Linux als Fenster aus dem Windowssystem starten.

Wir raten euch zu der Option mit Wubi, die auch unter dem oben angegebenen Link zu finden ist.

Natürlich ist es auch immer möglich sich ganz von Windows zu verabschieden und nur auf Linux zu bauen.

Wikiversity Account erstellen[Bearbeiten]

Da unsere Kursarbeit hier auf Wikiversity statt finden wird, bitten wir jeden einen Account auf der Seite zu erstellen. Zwar kann man auch völlig anonym und ohne Benutzeraccount Seiten auf Wikiversity editieren, jedoch erleichtert es die Kursarbeit für uns und für euch enorm, wenn ihr euch einen Account zulegt.

Wenn ihr euch einen Account auf Wikiversity angelegt habt, verlinkt eure User talk page hier in diesem Artikel. Wie das geht könnt ihr leicht durch einen klick auf bearbeiten herausfinden.

Als letzten Schritt wäre es gut, wenn ihr den Artikeln und Talkpages unseres Kurses folgt. Das funktioniert durch einen Klick auf den kleinen Stern neben dem Bearbeitenbutton. Insbesondere könnt ihr in euren Benutzereinstellungen euren Account so konfigurieren, dass Ihr über Änderungen an den Seiten per email informiert werdet.

All das könnt ihr auch in dem folgenden Screencast nachschauen, der auch in voller Auflösung und guter Qualität heruntergeladen werden kann:

Folgt ihr erfolgreich dieser Seite hier, so werdet ihr automatisch per Mail informiert, wenn nächste Woche Part 2 und der richtige Einstieg in unserem C Kurs losgeht.

Lektion 2[Bearbeiten]

Die heutige Lektion hat mehrere Ziele:

  • Die Konsole unter Linux kennen lernen
  • Emacs kennen lernen
  • Eine Makefile gesehen zu haben
  • Ein C Programm mit gcc kompiliert zu haben
  • Parameter von Programmen gesehen haben
  • Verstehen, dass Linuxbefehle auch nur Computerprogramme sind.

Wie ihr euch vielleicht denken könnt, kann man so viele Ziele in einem 20 Minuten langem Video kaum herüber bringen. Uns ist auch bewusst, dass der von uns gewählte Einstieg in die C Programmierung wirklich hart ist. Wir sind uns aber sicher, dass wir langfristig für die Kursarbeit genau die hier vorgestellten Tools benötigen werden.

Hausaufgaben[Bearbeiten]

  • Die Sachen aus dem Video erfolgreich nachmachen (nicht umbedingt verstehen) dieser Artikel kann dabei hilfreich sein.
  • Auf Youtube gibt es screen casts, die hilfreich sind, um den Einstieg in die Linux Konsole zu erleichtern. Stöbert ein bisschen und verlinkt hier gute und hilfreiche screen casts
  • Wenn man in Emacs C-h t drückt (wobei C für ctrl also im deutschen strg steht) startet man das Tutorial. In diesem werden euch die Basics zum Arbeiten mit Emacs erklärt
  • Ein wenig Klarheit über Parameter eines C-Programms gibt euch vielleicht dieser Link.

Fragen und Wünsche für nächste Woche[Bearbeiten]

Auf der Dikusssionsseite könnt ihr Fragen und Wünsche für die nächste Woche auflisten. Je früher ihr das macht, um so grösser sind die Chancen, dass wir auf die Fragen wirklich eingehen können.

Lektion 3[Bearbeiten]

Hausaufgabe[Bearbeiten]

  • Wie kann es sein, dass sich die Funktion mit den Zeichenketten anders verhält als mit der Zahl?
  • Was muss ich an dem Programm ändern, so dass bei der Übergabe mit der Zahl das Gleiche passiert wie mit der Zeichenkette?

Lektion 4[Bearbeiten]

Pointer und Pointer Arithmetik

In diesem Video erkläre ich euch die Basisoperationen von Pointern und brauche euer Feedback! Braucht ihr noch ein Screencast wo ich in C mit emacs noch ein wenig mehr damit rumspiele oder reicht das zum Verstehen?

Hausaufgabe[Bearbeiten]

Übungsaufgabe ist es übrigens mit pointern rumzuexperimentieren.

  • Was passiert, wenn ich einen Pointer auf eine Variable erhöhe?
  • Was passiert wenn ich mit einem char-Pointer auf einen Integer zeige?
  • Welchen Wert muss der Integer haben, so dass ich mit Hilfe eines char pointer "dsa" auslesen kann. (Tipp, der String muss mit einer 0 enden, also einem Byte in dem 0 steht.)

Lektion 5[Bearbeiten]

Am Ende von unserem C Kurs ist es Zeit für ein paar Tests. Keine Angst wir können (leider!) nicht sehen, was Ihr anklickt. Der Test ist eher für Euch zur Kontrolle, ob ihr Euch wirklich mit allem gut beschäftigt habt und gut für die DSA vorbereitet seid.

Ich habe in dem C Test auch ein paar Antworten zu euren Fragen einfliessen lassen bzw. einen Teil der Hausaufgaben beantwortet. Leider konnte ich nicht auf alles eingehen, aber den Rest können wir sicherlich während der Akademie klären.

Insbesondere würde ich mich über euer Feedback freuen, wie ihr bei dem Test abgeschnitten habt, bzw. welche Fragen schwierig waren. Somit wissen Leon und ich was wir in den ersten Stunden der DSA vielleicht noch ein Mal wiederholen müssen.

Ansonsten viel Erfolg bei der Vorbereitung von euren Referaten.

C Quiz[Bearbeiten]

Welche Syntaxfehler existieren in diesem Programm?[Bearbeiten]

#include <stdio.h>
 
int main (int argc, char** argv){
  printf("Hallo Welt\n")
  PRINTF("Ich bin %s Jahre alt",10);
}

Was gibt folgendes Programm aus?[Bearbeiten]

#include <stdio.h>
 
void changeMe(int* parameter);
void changeString(char * parameter);
int main(int argc, char** argv){
  int zahl = 10;
  printf("\nUnsere Zahl hat den Wert: %d",zahl);
  changeMe(&zahl);
  printf("\nUnsere Zahl hat den Wert: %d",zahl);
 
  char zeichenkette[40]="Ich bin eine Zeichenkette";
  printf("\nUnsere Zeichenkette hat den Wert: %s",zeichenkette);
  changeString(zeichenkette);
  printf("\nUnsere Zeichenkette hat den Wert: %s",zeichenkette);
 
  printf("\n");
  return 0;
}
 
void changeMe(int* parameter){
  printf("\n  Unser Parameter hat den Wert: %d",parameter);
  *parameter = 5;
  printf("\n  Unser Parameter hat den Wert: %d",parameter);
}
 
void changeString(char * parameter){
  printf("\n  Unser Parameter hat den Wert: %s",parameter);
  printf("\n  Bitte gib eine neue Zeichenkette ein: ");
  scanf("%s",parameter);
  printf("\n  Unser Parameter hat den Wert: %s",parameter);
}

Was gibt folgendes Programm aus?[Bearbeiten]

#include <stdio.h>
 
void outPointer(int arg);
 
int main (int argc, char** argv){
  char dsa[4] = "dsa\0";
  printf("%s\n",dsa);
  int* ptr = (int*)&dsa;
  printf("%d\n",*ptr);
  int number = *ptr;                                                                                                                     
  outPointer(number);
  outPointer(number+1);
  outPointer(number+256);
  outPointer(number+256*256);
  return 0;
}
 
void outPointer(int arg){
  char* c_ptr = (char*)&arg;
  printf("%s\n",c_ptr);
}

Was gibt folgendes Programm aus?[Bearbeiten]

#include <stdio.h>
 
int* f(int* x, int* y);
 
int main (){
        int a = 5;
        int b = 7;
	int* c = &b;
        c = f (&a,c);
        printf("%d\n",b);
        printf("%d\n",*c);
}
 
int * f(int* x, int* y){
	*x = (*x +5);
	y = x;
	return y;
}

Emacs Quiz[Bearbeiten]

Pluspunkt für eine richtige Antwort:   
Minuspunkte für eine falsche Antwort:
Ignoriere den Fragen-Koeffizienten:

1. Ordne die folgenden Befehle ihrer Semantik zu

C-f C-n M-b C-g C-h
Hilfe bekomen.
Den Cursor ein Zeichen nach vorne bewegen.
An das Ende einer Zeile springen
Mit C-e springt man an das Ende einer Zeile.
Den Cursor eine Zeile nach vorne bewegen.
An den Anfang einer Zeile springen
Mit C-a springt man an den Anfang einer Zeile
Den aktuellen Befehl abbrechen.
Ein Wort zureuck gehen.

2. Mit welchen Komandos kann man in Emacs den letzten Befehl rueckgaengig machen?

C-x u
C-u x
C-_
C-u
M-x u

3. Was kann man mit folgenden Befehlen erreichen?

C-x C-c C-x 1 C-x o C-x b C-x C-b
die Liste aller Buffer anzeigen
Alle Frames ausser dem aktuellen schliessen
Frames koennen nicht geschlossen werden. Nur buffer lassen sich schliessen.
Alle Frames ausser dem aktuellen verbergen
Eine neue Datei oeffnen
Eine neue Datei wird mit C-x C-f geoeffnet bzw. gefunden!
in einen anderen Buffer wechseln
In ein anderes Frame Wechseln
Die Liste aller offenen Frames anzeigen
Alle offenen Frames sind immer sichtbar und sollten nicht mit Buffern verwechselt werden.
Emacs schliessen

4. Wie laesst sich in Emacs der aktuelle Buffer speichern?

C-s
M
C-x s
Diese Antwort ist nur bedingt richtig: mit diesem Befehl speichert Emacs (mit Rueckfrage) nacheinander alle Buffer die veraendert sind.
M-x s
C-x C-s
M-x M-s

5. Mit C-x 2 kann man...

das aktuelle Frame vertikal unterteilen
das aktuelle Frame horizontal unterteilen
alle sichtbaren Frames vertikal unterteilen
alle sichtbaren Frames horizontal unterteilen

6. Kann man mit Emacs 2 veschiedene zeilen hintereinander ausschneiden und auch beide wieder einfuegen?

ja
richtig mit C-y kannst du den zuletzt ausgeschnittenen Text einfuegen (yanken) und mit M-y kannst du durch die zuvor ausgeschnittenen Texte durchwechseln.
nein

7. Was macht der folgende Befehl?: M-> C-u 100 M-v

Die letzten 100 Befehle rueckgaengig.
Die letzten 100 Zeichen eines Textes loeschen.
Mit dem Cursor an die 100 letzte Zeile des aktuellen Frames springen.
100 Saetze nach vorne springen.

8. Wie springt man mit dem Curser in die 100. Zeile des aktuellen Frames?

M-> C-u 100 C-v
M-> C-u 100 M-v
M-< C-u 100 C-v
Zu erst springt man mit M-< an den anfang des Frames und dann mit 100 wiederholungen (C-u 100) je eine Zeile nach vorne (C-v)
M-< C-u 100 M-v

Punkte: 0 / 0


Ubuntu Quiz[Bearbeiten]

Pluspunkt für eine richtige Antwort:   
Minuspunkte für eine falsche Antwort:
Ignoriere den Fragen-Koeffizienten:

1. Welche Eingabe ermoeglicht das anzeigen frueher Befehle?

Pfeiltaste nach oben
Mit jedem Tastendruck bekommt man einen frueheren Befehl angezeigt.
history
less ~/.bash_history
Die eingegeben Befehle sind in der versteckten Datei ./bash_history gespeichert. Diese Datei kann man mit less anzeigen lassen.

2. Du (nutzer) befindest dich im ordner /var/lib und moechtest einen ordner "test" in dem vorhandenen verzeichnis /home/nutzer anlegen. Was musst du tun?

cd /home/nutzer/test
Du kannst nicht in ein verzeichnis wechseln das nicht existiert.
mkdir /home/nutzer/test
ja du kannst ganz wo anders verzeichnise erstellen ohne vorher in das verzeichnis zu wechseln
cd /home/nutzer und anschliessend mkdir test
mkdir test
hiermit wuerdest du das verzeichnis /var/lib/test anlegen, da du dich in /var/lib befindest.
Natuerlich darf man auch zu erst in das verzeichnis wechseln und dann das verzeichnis erstellen
mkdir ../../home/nutzer/test
mit .. geht man ein verzeichnis hoch. Da du dich in /var/lib befunden hast funktioniert auch diese Variante

3. Wie kann man das tippen von Befehlen und Verzeichnissen verkuerzen

mit Hilfe der Tabulator taste TAB koennen Befehle, Verzeichnis- und Dateinamen vervollstaendigt werden
Befehle besitzen kurze numerische codes, die man auswaendig lernen muss
man kann sich eigene kuerzere Befehle definieren.
Ist der Prefix eines Befehls eingegeben aber nicht eindeutig kann man durch TAB TAB die Liste aller moeglichen Vervollstaendigungen sehen.
Ist der Prefix eines Befehls eingegeben aber nicht eindeutig erhaelt man durch TAB TAB den wahrscheinlichsten Befehl als Vervollstaendigung zurueck.

4. Um mehr z.B. ueber die Parameter eines Linux Befehls zu erfahren kann man.

durch eingabe von "man befehl" die Manual page lesen.
Dieser Weg funktioniert immer, auch ohne Internet z.b. im Zug.
durch eingabe von "MAN befehl" die Manual page lesen.
aufgepasst linux ist Case sensitive
Mit Hilfe einer Web Suchmaschiene nach Hilfe suchen.
Die Meisten probleme sind bereits geloest.
Deinen Computerhaendler anrufen und ihm dein Problem erlaeutern
Das waere zwar lustig, jedoch nicht fuer deinen Computerhaendler
Rene eine email schreiben
Rene hilft dir gerne weiter aber nicht in einer privaten Mail von der nur du etwas hast.
Auf einer Diskussionsseite nach hilfe suchen oder fragen, da andere Menschen noch ein aehnliches Problem haben koennten.
Sehr gut! In der Oeffentlichkeit ist allen geholfen.

Punkte: 0 / 0