Add first assignments.

This commit is contained in:
paulusja committed 2026-10-07 13:48:02 +02:00
1 parent 6964824711
commit cc5d131072
13 files changed
+525

No files matched your search

+31
View File
@@ -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;
}
+42
View File
@@ -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;
}
+78
View File
@@ -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();
}
+38
View File
@@ -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));
}
+27
View File
@@ -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;
}
+80
View File
@@ -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;
}
}
+16
View File
@@ -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
+35
View File
@@ -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()
{
}
+22
View File
@@ -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
+80
View File
@@ -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;
}
}
+16
View File
@@ -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
+40
View File
@@ -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;
}
+20
View File
@@ -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