This commit is contained in:
augustin64 2024-02-09 09:20:19 +01:00
parent 964df6c718
commit 0a41153316
5 changed files with 112 additions and 0 deletions

BIN
TD/TD2/sujet.pdf Normal file

Binary file not shown.

10
TD/TD2/td2_lucas/Makefile Normal file
View File

@ -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

33
TD/TD2/td2_lucas/defns.h Normal file
View File

@ -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

17
TD/TD2/td2_lucas/main.c Normal file
View File

@ -0,0 +1,17 @@
#include <stdlib.h>
#include <stdio.h>
#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." );
}

52
TD/TD2/td2_lucas/util.c Normal file
View File

@ -0,0 +1,52 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#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;
}