#30-32 und #42 -49 Flashcards

30 - Funktionen für Arr und ZeiketIcon 31 - Eigene DatentypenIcon 32 - Datenstrukturen 42 - ModularisierungI 43 - Kommandozeilenparameter

1
Q

Welche Funktionen gibt es für Arrays?

A

Kopierfunktionen:
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
- kopieren n Bytes, Speicherbereiche dürfen sich bei memcpy nicht überlappen
- sind auch für andere Arrays als Strings anwendbar
Achtung: das Stringende-Zeichen \0 wird nicht beachtet!
- Funktionsdefinitionen in string.h

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Was sind die Kopierfunktionen für Zeichenketten?

A

char *strcpy(char *dest, const char *src);
- kopiert Zeichenkette inklusive abschließendem ‘\0’
char *strncpy(char *dest, const char *src, size_t n);
- kopiert maximal n Zeichen, ggf. wird mit Nullen aufgefüllt
- Vorsicht: hat src keine Null in den ersten n Zeichen, ist dest nicht
Nullterminiert!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Was sind Funktionen zum Aneinanderhängen von Zeichenketten?

A

char *strcat(char *dest, const char *src);
- hängt die Zeichenkette src hinten an dest an
char *strncat(char *dest, const char *src, size_t n);
- hängt maximal n Zeichen der Zeichenkette src hinten an dest an, fügt
\0 hinzu
- Achtung: Die Zielzeichenkette muss genügend Platz für beide Zeichenketten
und das abschließende \0 haben!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Welche Vergleichsfunktionen gibt es für Zeichenketten?

A

int strcmp(const char *s1, const char *s2);
- Vergleicht zwei mit \0 terminierte Zeichenketten
int strncmp(const char *s1, const char *s2, size_t n);
- Vergleicht zwei mit \0 terminierte Zeichenketten, maximal n Zeichen
int memcmp(const void *s1, const void *s2, size_t n);
- Vergleicht die ersten n Zeichen von zwei beliebigen Arrays

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Welchen Rückgabewert erhalten die Vergleichsfunktionen strcmp, strncmp und memcmp?

A

strcmp:
< 0, wenn s1 kleiner als s2 (d.h. alphabetisch s1 vor s2 kommt, wenn nur
Buchstaben A-Z verwendet werden)
strncmp:
> 0, wenn s1 größer als s2 (d.h. alphabetisch s1 nach s2 kommt, wenn nur
Buchstaben A-Z verwendet werden)
memcmp:
0, wenn s1 gleicher Inhalt wie s2

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Welche Suchfunktionen von Zeichenketten gibt es? Nenne jeweils deren Rückgabewert.

A

char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
Rückgabewert: Zeiger auf erstes/letztes Auftreten von c in s
char *strpbrk(const char *s, const char *accept);
Rückgabewert: Zeiger auf erstes Auftreten eines der Zeichen aus accept in s
char *strstr(const char *haystack, const char *needle);
Rückgabewert: Zeiger auf erstes Auftreten von needle in haystack

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Wie sieht die Funktion für die Länge einer Zeichenkette aus? Nenne auch den Rückgabewert.

A

size_t strlen(const char *s);
Rückgabewert: Länge der Zeichenkette s

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Was ist die Funktion für das Auffüllen eines Feldes?

A

void *memset(void *s, int c, size_t n);
Füllt die ersten n Bytes von s mit c

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Nenne die Ein-/Ausgabefunktionen von Zeichenketten.

A

int puts(char *s);
- schreibt die Zeichenkette s und einen nachfolgenden Zeilenumbruch auf den Bildschirm
char *gets(char *s);
- liest eine Zeichenkette und speichert sie in s. Das Return der Eingabe wird in \0
umgewandelt.
Vorsicht: Wenn eingegebener Text länger ist als der Speicherplatz von s, wird über das
Ende von s hinaus in den Speicher geschrieben => Sicherheitsrisiko. Daher besser
folgende Funktion verwenden:
char *fgets(char *s, int size, FILE *stream);
- Für stream verwende stdin, Details im Kapitel Dateioperationen
- Liest bis zum Zeilenumbruch, aber maximal size-1 Zeichen
- \n bleibt erhalten, fügt \0 am Ende an

Funktionsdefinitionen in stdio.h

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Wie kann man formatiert in strings schreiben?

A

Mit sprintf formatiert man in den String str
Syntax: int sprintf(char* str, const char * format, …);
Achtung: Buffer overflow vermeiden!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Womit kann man Zeichenketten in Ganzzahlen und in Gleitkommazahlen umwandeln?

A

Zeichenkette in Ganzzahl umwandeln:
- int atoi(const char *s)
- long atol(const char *s)
- long strtol(const char *s, char **endp, int base)
- unsigned long strtoul(const char *s, char **endp, int base)

Zeichenkette in Gleitkommazahl umwandeln:
- double atof(const char *s)
- double strtod(const char *s, char **endp)

Beschreibung:
- wandelt Zeichenkette bis zum ersten nichtnumerischen Zeichen
- liefert 0, wenn kein numerisches Zeichen
- s: Zeichenkette
- endp: zeigt auf erstes Zeichen, das nicht konvertiert wurde
- base: Basis des Zahlsystems (2-36, 0 automatische Erkennung)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Was ist das allgemeine Ziel von eigenen Datentypen? Welche gibt es?

A

Ziel: Bessere Lesbarkeit von Programmen

  • Aufzählungstypen (enum)
  • Typdefinition (typedef)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Wofür sind Aufzählungstypen gut? Wie sieht die Syntax aus?

A

Aufzählungstypen können für Variablen definiert werden, denen nur wenige
verschiedene Werte zugewiesen werden sollen.
Syntax:
- enum TypName {Bez1, Bez2, …} [Var1, Var2, …];
- Die Variablennamen sind optional.

Beispiel:
enum tier {hund, katze, maus} t;
t = hund;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Wie erfolgt die Interne Umsetzung von Aufzählungstypen?

A
  • Aufzählungstyp ist int
  • Wenn nicht anders festgelegt, werden Bezeichner durch Werte 0, 1, …
    repräsentiert (Reihenfolge in der Definition ist wichtig!)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Was sind die Vorteile/Nachteile von Aufzählungstypen?

A

Vorteil:
- Aussagekräftige Bezeichner machen die Programme lesbarer
und übersichtlicher.
Nachteil:
- Typfremde Zuweisungen an Aufzählungstypen werden meist vom Compiler
nicht erkannt.
- Nur für kleine Wertebereiche anwendbar.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Was sind Typdefinitionen?

A
  • Ein bestehender Datentyp bekommt einen neuen,
    alternativen Namen.
    Syntax:
  • typedef Typ TypName;

Beispiel:
enum e_farbe {rot, blau, gruen, gelb};
typedef enum e_farbe farbe;
farbe f;
f = gelb;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Wofür werden Typdefinitionen genutzt?

A
  • Bessere Lesbarkeit großer Programme
  • Bessere Portierbarkeit eines Programms, da nur die abstrakten Datentypen an die
    neue Umgebung angepasst werden müssen
18
Q

Was ist das Ziel von Strukturen? Nenne auch die Syntax.

A

Ziel: Zusammenfassung der Attribute mit unterschiedlichem Datentypen in
einem neuen Datentyp.
Beispiel: ein Kunde wird durch Namen und Adresse sowie Kundennummer
definiert.

Syntax:
struct [Typname] {
Komponente1;
[Komponente2; …]
} [VarName1, …];

19
Q

Was sind die zulässigen Operationen für Strukturen?

A
  • Übergabe an Funktionen als Parameter (call by value!)
  • Rückgabe einer Struktur aus einer Funktion
  • Zuweisungsoperator für gesamte Struktur (Kopie wird erzeugt)
  • Adress- und sizeof-Operator
  • Elementzugriffsoperator: Punkt (.)
20
Q

Wie werden die Attribute einer Struktur bei der Deklaration gesetzt?

A

Direkte Zuweisung von Attributen: Die Attribute einer Struktur können direkt bei der Deklaration gesetzt werden.
Beispiel:

struct Spieler {
char name[50];
int alter;
long punktzahl;
};

struct Spieler bob = {“Bob”, 12, 20000};

21
Q

Welcher Operator erlaubt den Zugriff auf Inhalte von Strukturen über Zeiger?

A

Operator: ->

Beispiel:

typedef struct s_kunde {
char name[64];
int alter;
} kunde;
kunde k1;
kunde *zeiger = &k1;

Normalerweise: (*zeiger).alter = 20;
Besser: zeiger->alter = 20;

22
Q

Was sind die Eigenschaften von Bitfeldern?

A
  • Bitfelder dienen zur Verringerung des Speicherbedarfs und leichteren Zugriff auf einzelne Bits.
  • Die Syntax ist analog zu struct, hinter jedes Element wird die Anzahl der
    benötigten Bits geschrieben.
    Beispiel für Bitfeld (1 Byte groß):

struct zeichen {
unsigned char data:7;
unsigned char parity:1;
};

Achtung: Das Bitfeld belegt mindestens so viel Speicher wie der größte
enthaltene Datentyp.

23
Q

Was sind die Eigenschaften von Unions?

A
  • Syntax analog zu Strukturen, Schlüsselwort union statt struct
  • Es wird jedoch nur einer der Werte gespeichert.
  • Speicherbedarf der Union richtet sich nach dem größten Element.
  • Beispiel:

union typen {
int i;
double d;
} u;
u.i = 5;
u.d = 2.3;

(u.i ist nun undefiniert)

24
Q

Wofür werden Unions genutzt?

A
  • Einsparen von Speicherplatz: wenn sichergestellt ist, dass manche
    Informationen nicht gleichzeitig gespeichert werden müssen.
  • Maschinennahe Manipulation: Interpretation eines Speicherbereichs durch
    verschiedene Datentypen (z.B. um auf Gleitkommazahlen auch
    Bitmanipulationen durchführen zu können).
    Achtung: Solche Programme sind i.d.R. nicht portierbar!
  • Bessere Lesbarkeit
25
Q

Nenne Schlüsselpunkte zum Speicherlayout von: Arrays, Strukturen, Bitfelder und Unions

A

Arrays:
- speichern eine geordnete Sammlung von Werten des selben
Datentyps.
- Das Speicherlayout von Arrays ist einfach und effizient, da die Elemente des Arrays direkt hintereinander(sequenziell) im Speicher platziert werden.
Strukturen:
- fassen Attribute zu neuem Datentyp zusammen.
- Die Speicherzuweisung für Strukturen erfolgt normalerweise sequenziell, d.h. die Mitgliedsvariablen werden nacheinander im Speicher platziert.
Bitfelder:
- sind Strukturen mit eingegrenztem Speicherbedarf.
- definiert eine Struktur, in der die Mitgliedsvariablen explizit als Bitfelder deklariert werden, und jeder Variablen wird eine bestimmte Anzahl von Bits zugewiesen.
Unions:
- teilen sich Attribute einen Speicherbereich.
- Im Gegensatz zu Strukturen teilen Unions alle ihre Mitglieder denselben Speicherplatz.

26
Q

Welche Probleme können bei der Entwicklung großer Programme entstehen und wie kann man Abhilfe für diese schaffen?

A

Probleme:
- Große Quelldateien sind unübersichtlich und schlecht zu warten
- Editieren und Compilieren dauert wesentlich länger
- Eine voneinander unabhängige Arbeit der Teammitglieder ist nur
schwer möglich
Abhilfe:
Aufteilung des Programms/Quelltextes in mehrere Dateien/Module
- Wiederverwendbarkeit (ein Modul in mehreren Programmen)
- Aufteilung auf mehrere Personen
- Nur geänderte Module müssen übersetzt werden

27
Q

Welche Design-Kriterien sollten bei der Erstellung von Modulen beachtet werden?

A
  • Module bestehen aus einzelnen Funktionen
  • Hoher Zusammenhang: Die Funktionen eines Moduls sollten inhaltlich
    zusammenhängen
  • Geringe Kopplung: Nur wenige Funktionen sollten zur Kommunikation des
    Moduls nach außen notwendig sein
  • Wiederverwendbarkeit von Modulen
28
Q

Was muss beachtet werden um die Kommunikation zwischen Modulen zu gewährleisten?

A
  • Funktionen und Variablen eines Moduls, die von anderen Programmteilen
    benutzt werden, müssen in dem importierenden Modul deklariert werden.
  • Deklarationen in Header-Dateien (Dateiendung .h), die mit #include
    eingebunden werden.
    Eine Header-Datei enthält:
  • # define- und #include-Befehle
  • globale und externe Variablen
  • Prototypen von globalen und externen Funktionen
  • Selbstdefinierte Datentypen
29
Q

Was sind Funktionsprototypen?

A

Ein Funktionsprototyp ist die Deklaration einer Funktion mit ihren typisierten Parametern und
Rückgabewert ohne Funktionsrumpf.
- Syntax wie Funktionskopf, Abschluss mit Semikolon.
Beispiele:
int quadrat(int x);
void ausgabe();

  • Funktionsdefinition (Funktionsrumpf) muss später folgen.
30
Q

Definition von Kommandozeilenparameter?

A
  • Kommandozeilenparameter werden beim Aufruf eines Programms als
    Parameter der Funktion main übergeben.
    Vollständige Definition der Funktion main:
    int main(int argc, char *argv[])
    int main(int argc, char **argv)

argc: Anzahl der Argumente (argc ≥ 1)
argv: Zeiger auf Array von Zeigern auf Zeichenketten (argv[0] ist der
Programmaufruf, argv[1] das erste Argument, …, argv[argc-1] das
letzte Argument)

Beispiel:
int main(int argc, char *argv[])
{
int i;
printf(“Programm %s mit %d Parameter(n) gestartet\n”,
argv[0], argc);
for(i = 0; i < argc; i++) {
printf(“Parameter %d: %s\n”, i, argv[i]);
}
}

31
Q

Was sind Eigenschaften von Kommandozeilenparametern?

A
  • Eingegebene Zahlen stehen nur als Zeichenkette zur Verfügung
  • Umwandeln in Zahl notwendig
32
Q

Nenne die wesentlichen Datentypen und die Header Datei in der sich die Funktionen befinden.

A

Header-Datei: time.h
Wesentliche Datentypen:
- clock_t bezeichnet CPU-Zeit
- time_t Zeitstempel in Sekunden
- struct tm erfasst einen Zeitpunkt im Kalender

33
Q

Was machen die Funktionen clock_t clock, time_t time (time_t* timer), double difftime (time_t end, time_t beginning), time_t mktime (struct tm * timeptr);

A

clock_t clock ()
- liefert die Rechnerkernzeit (Takte) seit Beginn des Programms
- Konstante CLOCKS_PER_SEC liefert Takte pro Sekunde
time_t time (time_t* timer)
- liefert aktuelle Kalenderzeit (i.d.R. als Sekunden seit dem 1.1.1970 0:00 Uhr).
- Parameter ist optional. Kann NULL sein.
double difftime (time_t end, time_t beginning)
- Berechnet Differenz zwischen zwei Zeitwerten in Sekunden.
- time_t mktime (struct tm * timeptr);
- Wandelt einen Wert in der tm-Struktur in time_t um.

34
Q

Mit welchen Funktionen kann man Zeitwerte konvertiern?

A

char* asctime (const struct tm * timeptr);
- Konvertiert tm-Strukturwert in lesbare String-Form.
struct tm *gmtime (const time_t * timer);
- Wandelt ein time_t-Objekt in tm-Strukturwert in UTC (Weltzeit) um.
struct tm *localtime (const time_t * timer);
- Wandelt ein time_t-Objekt in tm-Strukturwert in lokaler Zeit um.

35
Q

Nenne die Syntax um Bibliotheken aufrufen zu können.

A

Syntax:
#include
int system(const char *s)

Bedeutung:
- liefert Zeichenkette s an Systemumgebung zur Ausführung
- d.h. mit der Funktion system kann aus einem Programm heraus ein anderes
Programm gestartet werden

Beispiel:
#include
int main()
{
system(“dir”);
/* system(“ls -l”); UNIX/Linux Version */
return 0;
}

36
Q

Wie führt man einen Programmabbruch durch? Nenne die Syntax und dessen Bedeutung.

A

Syntax:
#include
void abort()
void exit(int status)
int atexit(void (*fcn)(void))

Bedeutung:
- abort und exit beenden das Programm. Bei exit kann ein Rückgabewert an
das Betriebssystem angegeben werden, zudem werden alle Dateien ordentlich
geschlossen und die mit atexit festgelegten Funktionen aufgerufen
- Mit atexit können Funktionen „angemeldet“ werden, die bei einem
Programmende ausgeführt werden sollen, z.B. um Aufräumarbeiten wie Datei
speichern etc. vorzunehmen.

37
Q

Was sind Zufallszahlen und wofür werden sie in der Informatik genutzt?

A

Zufallszahlen sind eine Folge von Zahlen mit zufälligem Wert.

Anwendungsbereiche für Zufallszahlen:
- Kryptographie (Schlüsselerzeugung)
- Simulation
- Stichproben (Auswahl aus großer Datenmenge)
- Entscheidungsfindung (z.B. bei Computerspielen)

38
Q

Was sind die Probleme bei Zufallszahlen?

A

Computer arbeiten deterministisch, deswegen können keine Zufallszahlen erzeugt werden.
Es können nur Pseudozufallszahlen erzeugt werden.

39
Q

Welche Eigenschaften sollen bei Pseudozufallszahlen erfüllt sein?

A

Pseudozufallszahlen sollen
- gleichmäßig verteilt sein
- sich möglichst lange nicht wiederholen

40
Q

nenne ein einfaches Verfahren für Zufallszahlen von 0 bis m-1.

A

Methode der linearen
Kongruenz (Lehmer, 1951)

a[0] = seed;
for(i = 1; i < n; i++)
a[i] = (a[i-1] * b + 1) % m;

  • Güte abhängig von b und m
  • Für Kryptographie nicht geeignet, da mit geeigneten Analysemethoden
    Parameter aus Zufallsfolge berechenbar und somit vorhersagbar
41
Q

Welche Bibliotheksfunktionen für Zufallszahlen gibt es?

A

Funktionen in stdlib.h
- int rand(): liefert eine Zufallszahl zwischen 0 und der Konstanten RAND_MAX
- void srand(unsigned int seed): Initialisierung der Zufallszahlenfolge
- Die time-Funktion ist hilfreich, um bei jedem Programmaufruf einen anderen
Startwert für den Zufallsgenerator zu setzen.

Beispiel: Erzeuge ganzzahlige Zufallszahlen im Intervall [1, 6]
#include
#include

srand((unsigned) time(NULL));

z1 = 1 + rand() % 6;
z2 = 1 + rand() % 6;