diff --git a/TD/TD2/sujet.pdf b/TD/TD2/sujet.pdf new file mode 100644 index 0000000..135fa76 Binary files /dev/null and b/TD/TD2/sujet.pdf differ diff --git a/TD/TD2/td2_lucas/Makefile b/TD/TD2/td2_lucas/Makefile new file mode 100644 index 0000000..8e53443 --- /dev/null +++ b/TD/TD2/td2_lucas/Makefile @@ -0,0 +1,10 @@ +CFLAGS = -Wall -Wextra -g -O3 + +main: main.c util.o + $(CC) $^ -o $@ $(CFLAGS) + +%.o: %.c + $(CC) -c $< -o $@ $(CFLAGS) + +clean: + rm -f main util.o diff --git a/TD/TD2/td2_lucas/defns.h b/TD/TD2/td2_lucas/defns.h new file mode 100644 index 0000000..bf71b69 --- /dev/null +++ b/TD/TD2/td2_lucas/defns.h @@ -0,0 +1,33 @@ +#ifndef DEF_UTIL_H +#define DEF_UTIL_H + +/** + * Lit n chaînes de caractère +*/ +char** read_strings(int n); + +/** + * Libère n chaines de caractère +*/ +void delete(char** elems, int n); + +/** + * Affiche n chaines de caractère +*/ +void print_strings(char** elems, int n); + +/** + * Tri par sélection +*/ +void selsort(char** begin, char** end); + +/** + * Plus petite chaine de caractères entre begin et end +*/ +char** pos_min(char** begin, char** end); + +/** + * échanger *a et *b +*/ +void swap(char** a, char** b); +#endif diff --git a/TD/TD2/td2_lucas/main.c b/TD/TD2/td2_lucas/main.c new file mode 100644 index 0000000..3411165 --- /dev/null +++ b/TD/TD2/td2_lucas/main.c @@ -0,0 +1,17 @@ +#include +#include +#include "defns.h" // Pour les prototypes de fonctions implémentées +int main(void) +{ + char **v; + int n; + printf("Nombre de chaînes de caractères à trier : "); + scanf("%d", &n); + v=read_strings(n); + if( v!=NULL ) { + selsort(v,v+n-1); + printf( "\nVecteur trié:\n" ); + print_strings(v,n); + delete(v,n); + } else printf( "Erreur." ); +} diff --git a/TD/TD2/td2_lucas/util.c b/TD/TD2/td2_lucas/util.c new file mode 100644 index 0000000..fe9bae5 --- /dev/null +++ b/TD/TD2/td2_lucas/util.c @@ -0,0 +1,52 @@ +#include +#include +#include + +#include "defns.h" + +char** read_strings(int n) { + char** elems = malloc(sizeof(char*)*n); + for (int i=0; i < n; i++) { + printf("Chaîne.%d : ", i+1); + scanf("%ms", &(elems[i])); + } + + return elems; +} + +void delete(char** elems, int n) { + for (int i=0; i < n; i++) { + free(elems[i]); + } + free(elems); +} + +void print_strings(char** elems, int n) { + for (int i=0; i < n; i++) { + printf(" %s\n", elems[i]); + } +} + +void selsort(char** begin, char** end) { + if (begin == end) + return; + + char** mini = pos_min(begin, end); + swap(begin, mini); + + return selsort(begin+1, end); +} + +char** pos_min(char** begin, char** end) { + char** mini = begin; + for (char** ptr=begin; ptr < end; ptr++) { + mini = strcmp(mini[0], ptr[0]) > 0 ? ptr : mini; + } + return mini; +} + +void swap(char** a, char** b) { + char* tmp = *a; + *a = *b; + *b = tmp; +}