Exercice 1 : Les Structures, fonctions, variables et pointeurs
Schreiben Sie ein Modul, welches einen Datentyp string implementiert. Ein String soll intern
als struct implementiert sein, der den String selbst sowie dessen aktuelle Länge speichert.
Implementieren Sie in diesem Modul Funktionen, welche Strings initialisieren, kopieren und
aneinanderhängen können sowie eine Funktion zum Ausdrucken eines Strings.
Die Strings sollen dynamisch verwaltet werden und Platz soll bei Bedarf von den String-
Funktionen allokiert und de-allokiert werden. Achten Sie darauf, dass niemals Platz verloren
geht und dass niemals Speicherzugriffsfehler passieren können! Überlegen Sie genau, wie Sie
den leeren String darstellen wollen und welchen Wert „len“ und „s“ dabei haben sollen!
Verwenden Sie folgende Typdefinitionen und Prototypen (für das Headerfile des string Moduls):
typedef struct {
int len; /* Anzahl Zeichen in s */
char *s; /* ein C-string mit abschließendem \0-Zeichen */
} string_t;
typedef string_t* string;
void set (string* s1, char *s); /* initialisiere s1 mit s */
void copy (string* s1, string s2); /* kopiere s2 nach s1 */
void concat (string* s1, string s2); /* hänge s2 an s1 an */
void print (string s1); /* drucke s1 aus */
- Testen Sie Ihre Funktionen ausgiebig mit einem entsprechenden Hauptprogramm und fügen Sie dieses Test-Programm (Quelltext) später Ihrer Abgabe bei!
Voir le corrigé
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void set (string* s1, char *s); /* initialisiere s1 mit s */
void copy (string* s1, string s2); /* kopiere s2 nach s1 */
void concat (string* s1, string s2); /* hänge s2 an s1 an */
void print (string s1); /* drucke s1 aus */
int main()
{
string str = malloc(sizeof(str));
str->len =0;
str->s = NULL;
string str2 = malloc(sizeof(str));
str2->len =0;
str2->s = NULL;
set(&str ,"hallo");
print(str);
set(&str2 ,"petit pompier");
print(str2);
copy(&str,str2);
concat(&str,str2);
print(str);
string s1= malloc(sizeof(s1)), s2=malloc(sizeof(s2)), s3=malloc(sizeof(s3)), s4=malloc(sizeof(s4)), s5=malloc(sizeof(s5));
printf ("==============Testen von set() und copy()===========\n");
set (&s2, "Hallo Welt!");
set (&s3, "Killroy is watching you!");
copy (&s4, s2);
copy (&s5, s3);
print (s2);
print (s3);
print (s4);
print (s5);
printf ("\n============Testen von concat()==================\n");
concat (&s2, s3);
concat (&s2, s4);
concat (&s2, s5);
print (s2);
print (s3);
print (s4);
print (s5);
return 0;
}
void set (string* s1, char *s) /* initialisiere s1 mit s */
{
int len = 0; // Variable für die Berechnung der länge der Charakters
int *p = s; // Variable, um eine Copy zu speichern.
while( *s !='\0'){ // solange der letzte Charakter noch nicht getroffen ist.
len++; // len wir Um 1 addiert für jede Charakter.
*s++; // der nächste Charakter wird geholt usw.
}
(*s1)->len = len; // hier wird die laenger von s1 durch lange von Charakters s ersetst.
(*s1)->s = p; // hier wird die Referenz von s S1 übergeben.
}
void print (string s1) /* drucke s1 aus */
{
printf("len = %d ",s1->len); // hier wird die laenge ausgegeben.
printf("value = %s\n",s1->s);// hier wird alle Charakter in s1 ausgegeben.
}
void copy (string* s1, string s2)/* kopiere s2 nach s1 */
{
int i; // benötige Variable für die For-Schliefe.
int len = s2->len; // hier wird die laenge von s2 in einer temporären Variable gespeichert.
(*s1)->len = len; // hier wird die laenger von s1 durch lange von s2 ersetst.
(*s1)->s = malloc(sizeof(char)*len) ;// len Chars Speicherplatz wird hier freigegeben.
for(i = 0 ; i< len; i++){
(*s1)->s[i]= s2->s[i]; // alle len Chars Speicherplatz durch allen Chars aus s2 erstezen.
}
}
void concat (string* s1, string s2) /* hänge s2 an s1 an */
{
int i; // benötige Variable für die For-Schliefe.
int l1 = (*s1)->len; // hier wird die laenge von s2 in einer temporären Variable gespeichert.
int l2 = s2->len; // hier wird die laenge von s2 in einer temporären Variable gespeichert.
int len = l1 + l2 ; // total länge berechen
(*s1)->len = len; // hier wird die laenger von s1 durch die total lange ersetst.
string s = malloc(sizeof(s)); // neue string Variable, um eine kopie von Charakter aus s1 zu behalten
set(&s,(*s1)->s); // Setzen der neuen string Variable mit den Charakter aus s1.
(*s1)->s = malloc(sizeof(char)*len); // len Chars Speicherplatz wird hier freigegeben.
for(i = 0 ; i< l1; i++){
(*s1)->s[i]= s->s[i]; // alle len Chars Speicherplatz durch allen Chars aus s1 erstezen.
}
for(i = 0 ; i< l2; i++){ // Forsetzung
(*s1)->s[l1+i]= s2->s[i]; // alle len Chars Speicherplatz durch allen Chars aus s2 erstezen.
}
}
Exercice 2 : Les Structures, fonctions, variables et pointeurs
Schreiben Sie nun ein neues Hauptprogramm, welches eine beliebige Anzahl von Worten von
der Tastatur einliest, in einer verketteten Liste speichert und die Worte in umgekehrter
Reihenfolge der Eingabe wieder ausgibt. Die Worte werden als strings (vom Typ string_t)
von Exercices 1 in Listenelementen vom Typ word_t (siehe unten) abgelegt und verkettet.
Hinweis: Verwenden Sie folgende Typdefinition:
typedef struct word_struct{
string word; /* das Wort */
struct word_struct *next; /* Zeiger auf Nachfolger */
} word_t;
- Was müssen Sie in Ihrem Programm ändern, wenn es die Worte in der Reihenfolge der Eingabe ausgeben soll?
Voir le corrigé
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void add(List *list, string s)
{
/* verschaffung eines Elément */
word *neu = malloc(sizeof(*neu));
if (list == NULL || neu == NULL)
{
exit(EXIT_FAILURE);
}
neu->wort = s;
/* Insert Element in der List */
neu->next = list->first;
list->first = neu;
}
void listAusgabe(List *list)/* list ausgeben*/
{
if (list == NULL)
{
exit(EXIT_FAILURE);
}
word *aktuell = list->first;
while (aktuell != NULL )
{
print( aktuell->wort );
aktuell = aktuell->next;
}
}
int main()
{
List *myList = malloc(sizeof(*myList)); // initialisiere der List
int num = 10;
int i = 0;
while( i <= num ){
char *p = malloc(128 * sizeof(char)); // Memory for the string
string s = malloc(sizeof(s));
printf("geben sie bitte das %d word: ", i);
scanf("%s", p);
set(&s,p);
add(myList, s);
i++;
}
listAusgabe(myList);
// pour afficher les string dans l'ordre dans laquelle ils sont entree il faut modifier la methode add(..)
// comme ceci
/*
void addd(List *list, string s)
{
word *neu = malloc(sizeof(*neu));
if (list == NULL || neu == NULL)
{
exit(EXIT_FAILURE);
}
neu->wort = s;
neu->next = NULL;
if(list->first !=NULL){
word *elementActuel = list->first;
while (elementActuel->next != NULL)
{
elementActuel = elementActuel->next;
}
elementActuel->next = neu;
}
else
{
list->first = neu;
}
}
*/
return 0;
}