Kurs:Wie funktioniert eigentlich ein Computer/C Kurs


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 kompilieren. Das Ziel dieses Kurses kann es nicht sein, vollständig C zu lernen. Vielmehr 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 vielmehr 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 heruntergeladen werden.

Um Linux neben Windows zu installieren, gibt es mehrere Optionen:

  1. Wubi ermöglicht es euch, Linux sozusagen als Programm in euer Windows-System zu installieren.
  2. Mit der Software VirtualBox von O.

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.

Lektion 2

Bearbeiten

Die heutige Lektion hat mehrere Ziele:

  • Die Konsole unter Linux kennenzulernen,
  • Emacs kennenzulernen,
  • ein Makefile gesehen zu haben,
  • ein C-Programm mit gcc kompiliert zu haben,
  • Parameter von Programmen gesehen zu haben und
  • zu verstehen, dass Linux-Befehle auch nur Computerprogramme sind.

Wie ihr euch vielleicht denken könnt, kann man so viele Ziele in einem 20 Minuten langen Video kaum herüberbringen. 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 unbedingt 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ößer 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 Basis-Operationen 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 unseres C-Kurses 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 einfließen 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 einmal wiederholen müssen.

Ansonsten viel Erfolg bei der Vorbereitung von euren Referaten.

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

  

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
Den Cursor eine Zeile nach vorne bewegen.
An den Anfang einer Zeile springen
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
Alle Frames ausser dem aktuellen verbergen
Eine neue Datei oeffnen
in einen anderen Buffer wechseln
In ein anderes Frame Wechseln
Die Liste aller offenen Frames anzeigen
Emacs schliessen

4 Wie laesst sich in Emacs der aktuelle Buffer speichern?

C-s
M
C-x s
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
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
M-< C-u 100 M-v


Ubuntu-Quiz

Bearbeiten

  

1 Welche Eingabe ermoeglicht das anzeigen frueher Befehle?

Pfeiltaste nach oben
history
less ~/.bash_history

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
mkdir /home/nutzer/test
cd /home/nutzer und anschliessend mkdir test
mkdir test
mkdir ../../home/nutzer/test

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.
durch eingabe von "MAN befehl" die Manual page lesen.
Mit Hilfe einer Web Suchmaschiene nach Hilfe suchen.
Deinen Computerhaendler anrufen und ihm dein Problem erlaeutern
Rene eine email schreiben
Auf einer Diskussionsseite nach hilfe suchen oder fragen, da andere Menschen noch ein aehnliches Problem haben koennten.