#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
Nenne Schlüsselpunkte zum Speicherlayout von: Arrays, Strukturen, Bitfelder und Unions
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
Welche Probleme können bei der Entwicklung großer Programme entstehen und wie kann man Abhilfe für diese schaffen?
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
Welche Design-Kriterien sollten bei der Erstellung von Modulen beachtet werden?
- 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
Was muss beachtet werden um die Kommunikation zwischen Modulen zu gewährleisten?
- 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
Was sind Funktionsprototypen?
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
Definition von Kommandozeilenparameter?
- 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
Was sind Eigenschaften von Kommandozeilenparametern?
- Eingegebene Zahlen stehen nur als Zeichenkette zur Verfügung - Umwandeln in Zahl notwendig
32
Nenne die wesentlichen Datentypen und die Header Datei in der sich die Funktionen befinden.
Header-Datei: time.h Wesentliche Datentypen: - clock_t bezeichnet CPU-Zeit - time_t Zeitstempel in Sekunden - struct tm erfasst einen Zeitpunkt im Kalender
33
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);
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
Mit welchen Funktionen kann man Zeitwerte konvertiern?
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
Nenne die Syntax um Bibliotheken aufrufen zu können.
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
Wie führt man einen Programmabbruch durch? Nenne die Syntax und dessen Bedeutung.
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
Was sind Zufallszahlen und wofür werden sie in der Informatik genutzt?
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
Was sind die Probleme bei Zufallszahlen?
Computer arbeiten deterministisch, deswegen können keine Zufallszahlen erzeugt werden. Es können nur Pseudozufallszahlen erzeugt werden.
39
Welche Eigenschaften sollen bei Pseudozufallszahlen erfüllt sein?
Pseudozufallszahlen sollen - gleichmäßig verteilt sein - sich möglichst lange nicht wiederholen
40
nenne ein einfaches Verfahren für Zufallszahlen von 0 bis m-1.
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
Welche Bibliotheksfunktionen für Zufallszahlen gibt es?
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;