Add first assignments.
This commit is contained in:
1 parent
6964824711
commit
cc5d131072
13 files changed
+525
No files matched your search
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Schreiben Sie eine Funktion schreibeAnfangGross, die eine Zeichenkette übergeben bekommt, den Anfangsbuchstaben jedes Wortes groß
|
||||
* schreibt und einen Zeiger auf den Anfang dieser Zeichenkette zurückgibt. Nutzen Sie für die Eingabe die Eingabefunktion aus
|
||||
* einer der vorherigen Übungen.
|
||||
*
|
||||
* Möglicher Programmablauf:
|
||||
* >> Geben Sie einen Text nur mit Kleinbuchstaben ein: das ist das haus vom nikolaus. und nebendran wohnt der weihnachtsmann.
|
||||
* Der bearbeitete Text lautet:
|
||||
* "Das Ist Das Haus Vom Nikolaus. Und Nebendran Wohnt Der Weihnachtsmann."
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "eingabe.h"
|
||||
|
||||
#define MAX_TEXT_LEN 100
|
||||
|
||||
char *schreibeAnfangGross(char *text, int maxZeichen);
|
||||
|
||||
int main()
|
||||
{
|
||||
char text[MAX_TEXT_LEN] = "";
|
||||
|
||||
gibTextEin("Geben Sie einen Text nur mit Kleinbuchstaben ein: ", text, MAX_TEXT_LEN);
|
||||
|
||||
printf("Der bearbeitete Text lautet:\n\"%s\"\n", schreibeAnfangGross(text, MAX_TEXT_LEN));
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Legen Sie in einer Datei eingabe.h bzw. eingabe.c die Funktion gibTextEin an, die eine Zeichenkette übergeben bekommt,
|
||||
* die vor der Eingabe angezeigt wird, einen Puffer, in dem die eingelesene Zeichenkette gespeichert wird,
|
||||
* und die Größe des Puffers, die die Anzahl an einzulesenden Zeichen darstellt (inklusive Zeilenumbruch und abschließendem
|
||||
* Null-Zeichen). Die Funktion soll genau eine Zeile Text einlesen. Zudem soll die Funktion prüfen, ob noch Zeichen im
|
||||
* Eingabepuffer liegen und in diesem Fall den Eingabepuffer leeren. Im Fehlerfall gibt die Funktion 0 zurück, ansonsten 1. Die
|
||||
* eingelesene Zeichenkette soll den Zeilenumbruch zur Bestätigung der Eingabe nicht enthalten. Nutzen Sie zum Einlesen bitte fgets.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "eingabe.h"
|
||||
|
||||
#define MAX_EINGABE_LEN 10
|
||||
|
||||
int main()
|
||||
{
|
||||
char testChar;
|
||||
char eingabeText[MAX_EINGABE_LEN];
|
||||
|
||||
printf("Zum Testen bitte bei einem Programmdurchlauf weniger und beim naechsten mehr als %d Zeichen eingeben und jeweils mit ENTER bestaetigen.\n", MAX_EINGABE_LEN-1);
|
||||
|
||||
if(gibTextEin("Eingabe: ", eingabeText, MAX_EINGABE_LEN))
|
||||
{
|
||||
printf("Die Eingabe lautet \"%s\". Es sollte kein Zeilenumbruch auftreten.\n", eingabeText);
|
||||
printf("Wenn alles korrekt implementiert ist, sollte das Programm jetzt nur auf ein ENTER warten und die Ausgabe dann unten leer sein.\n");
|
||||
printf("Rest im Eingabepuffer: ");
|
||||
while((testChar = getchar()) != '\n')
|
||||
{
|
||||
printf("%c", testChar);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Beim Einlesen ist ein Fehler aufgetreten.\n");
|
||||
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Untersuchen Sie das folgende Programm zunächst ohne es zu kompilieren oder auszuführen.
|
||||
* Welche Funktionen sind fehlerfrei?
|
||||
* Handelt es sich im Falle eines Fehlers um einen Laufzeitfehler oder um einen Compiler-Fehler?
|
||||
*
|
||||
* Hinweise:
|
||||
* Compiler-Fehler treten beim Kompilieren des Programms auf. Das Programm lässt sich also
|
||||
* gar nicht erst übersetzen.
|
||||
* Bei Laufzeitfehlern lässt sich das Programm (u.U. mit Warnungen) übersetzen. Der Fehler tritt
|
||||
* erst zur Laufzeit auf. Auch wenn der Fehler nicht immer auftritt bzw. das Programm zum Absturz
|
||||
* bringt, handelt es sich dennoch um einen Laufzeitfehler. Beliebte Laufzeitfehler sind z.B. Pufferüberläufe.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void kopiereString1()
|
||||
{
|
||||
char string1[] = "123456\n";
|
||||
char string2[] = "789\n";
|
||||
char *stringZgr1 = string1;
|
||||
char *stringZgr2 = string2;
|
||||
|
||||
while((*stringZgr2++ = *stringZgr1++) != '\0');
|
||||
|
||||
printf(string1);
|
||||
printf(string2);
|
||||
}
|
||||
|
||||
void kopiereString2()
|
||||
{
|
||||
char string1[] = "123456\n";
|
||||
char string2[] = "789\n";
|
||||
char *stringZgr1 = string1;
|
||||
char *stringZgr2 = string2;
|
||||
|
||||
while((*stringZgr1++ = *stringZgr2++) != '\0');
|
||||
|
||||
printf(string1);
|
||||
printf(string2);
|
||||
}
|
||||
|
||||
void kopiereString3()
|
||||
{
|
||||
char string1[] = "123456\n";
|
||||
char string2[] = "789\n";
|
||||
|
||||
while((*string1++ = *string2++) != '\0');
|
||||
|
||||
printf(string1);
|
||||
printf(string2);
|
||||
}
|
||||
|
||||
void kopiereString4()
|
||||
{
|
||||
char *string1 = "123456\n";
|
||||
char *string2 = "789\n";
|
||||
|
||||
while((*string1++ = *string2++) != '\0');
|
||||
|
||||
printf(string1);
|
||||
printf(string2);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("kopiereString1:\n");
|
||||
kopiereString1();
|
||||
|
||||
printf("kopiereString2:\n");
|
||||
kopiereString2();
|
||||
|
||||
printf("kopiereString3:\n");
|
||||
kopiereString3();
|
||||
|
||||
printf("kopiereString4:\n");
|
||||
kopiereString4();
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Was gibt folgendes Programm aus? Überlegen Sie sich erst Ihre Antworten.
|
||||
* Kompilieren und führen Sie erst danach das Programm aus.
|
||||
* Wie erklären Sie sich die Ausgaben?
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void gibLaengenAus(char string[]);
|
||||
|
||||
int main()
|
||||
{
|
||||
char *string1 = "12345";
|
||||
char string2[] = "12345";
|
||||
char string3[10] = "12345";
|
||||
|
||||
printf("strlen(string1) = %2d\n", (int)strlen(string1));
|
||||
printf("strlen(string2) = %2d\n", (int)strlen(string2));
|
||||
printf("strlen(string3) = %2d\n", (int)strlen(string3));
|
||||
printf("\n");
|
||||
printf("sizeof(string1) = %2d\n", (int)sizeof(string1));
|
||||
printf("sizeof(string2) = %2d\n", (int)sizeof(string2));
|
||||
printf("sizeof(string3) = %2d\n", (int)sizeof(string3));
|
||||
printf("\n");
|
||||
printf("gibLaengenAus(string3):\n");
|
||||
|
||||
gibLaengenAus(string3);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void gibLaengenAus(char string[])
|
||||
{
|
||||
printf("strlen(string) = %2d\n", (int)strlen(string));
|
||||
printf("sizeof(string) = %2d\n", (int)sizeof(string));
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void showSecretInformation()
|
||||
{
|
||||
printf("Erfolg!\n");
|
||||
}
|
||||
|
||||
int checkPassword()
|
||||
{
|
||||
char buffer[5];
|
||||
|
||||
printf("Bitte Passwort eingeben: ");
|
||||
scanf("%s", buffer);
|
||||
|
||||
return strcmp(buffer, "pass") == 0;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
if(checkPassword())
|
||||
showSecretInformation();
|
||||
else
|
||||
printf("Falsches Passwort!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Vervollständigen Sie das untenstehende Programm, indem Sie das Modul namesarchive in der
|
||||
* namesarchive.h bzw. namesarchive.c implementieren.
|
||||
* Die öffentlichen Schnittstellen mit genaueren Details entnehmen Sie der namesarchive.h.
|
||||
* Das Programm soll das Modul als dynamische Laufzeitbibliothek nutzen.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "namesarchive.h"
|
||||
|
||||
#define MAX_BUFFER_LEN 100
|
||||
|
||||
char *inputName(const char *promptText, char *buffer, unsigned int bufferSize);
|
||||
|
||||
int main()
|
||||
{
|
||||
char buffer[MAX_BUFFER_LEN];
|
||||
|
||||
while((inputName("Namen hinzufuegen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0))
|
||||
{
|
||||
if(addName(buffer))
|
||||
printf("%s wurde dem Archiv hinzugefuegt.\n", buffer);
|
||||
else
|
||||
printf("Fehler! %s konnte nicht hinzugefuegt werden.\n", buffer);
|
||||
}
|
||||
|
||||
printf("\nNach Eingabe:\n");
|
||||
printNames();
|
||||
|
||||
printf("\nNach Sortierung:\n");
|
||||
sortNames();
|
||||
printNames();
|
||||
printf("\n");
|
||||
|
||||
while((inputName("Namen sortiert hinzufuegen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0))
|
||||
{
|
||||
if(addNameSorted(buffer))
|
||||
printf("%s wurde dem Archiv hinzugefuegt.\n", buffer);
|
||||
else
|
||||
printf("Fehler! %s konnte nicht hinzugefuegt werden.\n", buffer);
|
||||
}
|
||||
|
||||
printf("\nNach sortierter Eingabe:\n");
|
||||
printNames();
|
||||
printf("\n");
|
||||
|
||||
while((inputName("Namen entfernen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0))
|
||||
{
|
||||
if(removeName(buffer))
|
||||
printf("%s wurde aus dem Archiv entfernt.\n", buffer);
|
||||
else
|
||||
printf("Fehler! %s konnte nicht gefunden werden.\n", buffer);
|
||||
}
|
||||
|
||||
printf("\nNach Entfernen:\n");
|
||||
printNames();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
char *inputName(const char *promptText, char *buffer, unsigned int bufferSize)
|
||||
{
|
||||
printf("%s", promptText);
|
||||
if(fgets(buffer, bufferSize, stdin) != NULL)
|
||||
{
|
||||
if(buffer[strlen(buffer)-1] == '\n')
|
||||
buffer[strlen(buffer)-1] = '\0';
|
||||
else
|
||||
while(getchar() != '\n') {}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
namesarchive: main.o libnamesarchive.so
|
||||
gcc -Wall -o namesarchive main.o libnamesarchive.so
|
||||
|
||||
main.o: main.c
|
||||
gcc -c -Wall main.c
|
||||
|
||||
namesarchive.o: namesarchive.c namesarchive.h
|
||||
gcc -c -Wall namesarchive.c
|
||||
|
||||
libnamesarchive.so: namesarchive.o
|
||||
gcc -shared -o libnamesarchive.so namesarchive.o
|
||||
|
||||
clean:
|
||||
del /f namesarchive.exe *.o *.so
|
||||
# Comment line above and uncomment line below for UNIX systems
|
||||
# rm -f namesarchive *.o *.so
|
||||
@@ -0,0 +1,35 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "namesarchive.h"
|
||||
|
||||
// Fügt einen Namen hinzu. Im Fehlerfall (Archiv ist voll) soll 0, ansonsten 1 zurückgegeben werden.
|
||||
// Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1.
|
||||
int addName(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv.
|
||||
int addNameSorted(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden).
|
||||
int removeName(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Sortiert die Namen im Archiv aufsteigend.
|
||||
void sortNames()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Gibt die Namen zeilenweise aus.
|
||||
void printNames()
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef NAMEARCHIVE_H
|
||||
#define NAMEARCHIVE_H
|
||||
|
||||
// Maximale Namenslänge
|
||||
#define MAX_NAME_LEN 10
|
||||
|
||||
// Maximale Anzahl an Namen
|
||||
#define MAX_NAMES 100
|
||||
|
||||
// Fügt einen Namen hinzu. Im Fehlerfall (Archiv ist voll) soll 0, ansonsten 1 zurückgegeben werden.
|
||||
// Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1.
|
||||
int addName(const char *name);
|
||||
// Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv.
|
||||
int addNameSorted(const char *name);
|
||||
// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden).
|
||||
int removeName(const char *name);
|
||||
// Sortiert die Namen im Archiv aufsteigend.
|
||||
void sortNames();
|
||||
// Gibt die Namen zeilenweise aus.
|
||||
void printNames();
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Verwenden Sie Ihre Lösung für das Namensarchiv mittels eines binären Suchbaums. Ergänzen Sie das Modul um zwei Funktionen,
|
||||
* mit denen das bestehende Archiv um Namen erweitert wird, die in einer vorhandenen Textdatei stehen, bzw. den Inhalt des Archivs
|
||||
* in eine bestimmte Textdatei sortiert speichern. Details entnehmen Sie wieder der namesarchive.h.
|
||||
*
|
||||
* Welcher Nachteil ergibt sich für einen binären Suchbaum, wenn beliebige Namen zunächst aus einer Datei eingelesen werden,
|
||||
* sortiert wieder in Datei geschrieben werden und anschließend wieder neu aus der Datei geladen werden?
|
||||
* (Also im Prinzip bei der zweiten Ausführung des untenstehenden Programms)
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "namesarchive.h"
|
||||
|
||||
#define MAX_BUFFER_LEN 100
|
||||
|
||||
char *inputName(const char *promptText, char *buffer, unsigned int bufferSize);
|
||||
|
||||
int main()
|
||||
{
|
||||
char buffer[MAX_BUFFER_LEN];
|
||||
const char *filePath = "names.txt";
|
||||
|
||||
if(!loadArchive(filePath))
|
||||
{
|
||||
printf("Die Textdatei %s konnte nicht geladen werden.\n", filePath);
|
||||
}
|
||||
|
||||
printf("\nNach Laden:\n");
|
||||
printNames();
|
||||
printf("\n");
|
||||
|
||||
while((inputName("Namen entfernen: ", buffer, MAX_BUFFER_LEN) != NULL) && (strlen(buffer) > 0))
|
||||
{
|
||||
if(removeName(buffer))
|
||||
printf("%s wurde aus dem Archiv entfernt.\n", buffer);
|
||||
else
|
||||
printf("Fehler! %s konnte nicht gefunden werden.\n", buffer);
|
||||
}
|
||||
|
||||
printf("\nNach Entfernen:\n");
|
||||
printNames();
|
||||
printf("\n");
|
||||
|
||||
if(saveArchive(filePath))
|
||||
{
|
||||
printf("Archiv erfolgreich unter %s gespeichert.\n", filePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Fehler beim Speichern des Archivs unter %s.\n", filePath);
|
||||
}
|
||||
|
||||
printf("\nGebe Speicher frei ...\n");
|
||||
clearArchive();
|
||||
|
||||
printf("Beende Programm ...\n");
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
char *inputName(const char *promptText, char *buffer, unsigned int bufferSize)
|
||||
{
|
||||
printf("%s", promptText);
|
||||
if(fgets(buffer, bufferSize, stdin) != NULL)
|
||||
{
|
||||
if(buffer[strlen(buffer)-1] == '\n')
|
||||
buffer[strlen(buffer)-1] = '\0';
|
||||
else
|
||||
while(getchar() != '\n') {}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
namesarchive: main.o libnamesarchive.so
|
||||
gcc -Wall -o namesarchive main.o libnamesarchive.so
|
||||
|
||||
main.o: main.c
|
||||
gcc -c -Wall main.c
|
||||
|
||||
namesarchive.o: namesarchive.c namesarchive.h
|
||||
gcc -c -Wall namesarchive.c
|
||||
|
||||
libnamesarchive.so: namesarchive.o
|
||||
gcc -shared -o libnamesarchive.so namesarchive.o
|
||||
|
||||
clean:
|
||||
del /f namesarchive.exe *.o *.so
|
||||
# Comment line above and uncomment line below for UNIX systems
|
||||
# rm -f namesarchive *.o *.so
|
||||
@@ -0,0 +1,40 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "namesarchive.h"
|
||||
|
||||
// Fügt einen Namen hinzu. Im Fehlerfall soll 0, ansonsten 1 zurückgegeben werden.
|
||||
int addName(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden).
|
||||
int removeName(const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Gibt die Namen zeilenweise aus.
|
||||
void printNames()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Leert das Archiv
|
||||
void clearArchive()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Lädt den Inhalt einer Textdatei zeilenweise in das Archiv. Gibt 1 bei Erfolg zurück.
|
||||
int loadArchive(const char *path)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Speichert das Archiv zeilenweise in einer Textdatei. Gibt 1 bei Erfolg zurück.
|
||||
int saveArchive(const char *path)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef NAMEARCHIVE_H
|
||||
#define NAMEARCHIVE_H
|
||||
|
||||
#define MAX_NAME_LEN 100
|
||||
|
||||
// Fügt einen Namen hinzu. Im Fehlerfall (kein Speicher mehr) soll 0, ansonsten 1 zurückgegeben werden.
|
||||
// Der Name soll in beliebiger Länge gespeichert werden können.
|
||||
int addName(const char *name);
|
||||
// Entfernt den angegebenen Namen. Gibt bei Erfolg 1 zurück, ansonsten 0 (Name konnte nicht gefunden werden).
|
||||
int removeName(const char *name);
|
||||
// Gibt die Namen zeilenweise aus.
|
||||
void printNames();
|
||||
// Leert das Archiv
|
||||
void clearArchive();
|
||||
// Lädt den Inhalt einer Textdatei zeilenweise in das Archiv. Gibt 1 bei Erfolg zurück.
|
||||
int loadArchive(const char *path);
|
||||
// Speichert das Archiv zeilenweise in einer Textdatei. Gibt 1 bei Erfolg zurück.
|
||||
int saveArchive(const char *path);
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user