diff --git a/exam2/ex1/main.c b/exam2/ex1/main.c index 45422d4fa3b9f70c077451caf98481346da94be3..0784e3590862e1fcdf32d22991b0329122ac0b04 100644 --- a/exam2/ex1/main.c +++ b/exam2/ex1/main.c @@ -2,27 +2,43 @@ #include <stdlib.h> #include <string.h> -typedef struct _element { - char c; - struct _element *next; -} element; - -int main(int argc, char **argv) { - - // read user input - char str[16]; - scanf("%s", str); - int len = strlen(str); - // cli args - if (argc == 1) { - printf("need more arguments"); - return EXIT_FAILURE; + +float moyenne(int i,float*arr){ + if(i==14){ + return arr[i]/15; + }else{ + return arr[i]/15+moyenne(i+1,arr); + } +} + +void swap(float*a,float*b){ + float tmp=*a; + *a=*b; + *b=tmp; +} + +void inverse(int i,float* arr){ + if(i>7){ + return; } + swap(&arr[i],&arr[14-i]); + inverse(i+1,arr); +} + +int main() { + + float change[15]; + for(int i=0;i<15;i++){ + scanf("%f",&change[i]); + } + + // printf("") + printf("moyenne: %.3f\ninversion:\n",moyenne(0,change)); + + inverse(0,change); - for (int i = 0; i < argc; i++) { - if (!strcmp(argv[i], "-c")) { - // do stuff with atof/atoi (argv[++i]) - } + for(int i=0;i<15;i++){ + printf("%.2f\n",change[i]); } return EXIT_SUCCESS; diff --git a/exam2/ex2/Makefile b/exam2/ex2/Makefile index 478f28e7627a9dc3e5c9de1e581f89d3ff120c04..e9c975e94a7dec595bf1fbf3a1936757d891494b 100644 --- a/exam2/ex2/Makefile +++ b/exam2/ex2/Makefile @@ -1,10 +1,11 @@ -main: main.o - gcc -o $@ $< -fsanitize=address -fsanitize=leak +cc=gcc +CFLAGS=-Wextra -Wall -g -fsanitize=address -fsanitize=leak +LFLAGS=-fsanitize=address -fsanitize=leak -lm -main.o: main.c - gcc -c -Wall -Wextra -pedantic -fsanitize=address -fsanitize=leak $< -clean: - rm -f *.o main -rebuild: clean main \ No newline at end of file +main: tree.o main.o + $(cc) -o $@ $^ $(CFLAGS) $(LFLAGS) + +clean: + rm -f *.o *.x diff --git a/exam2/ex2/main b/exam2/ex2/main new file mode 100755 index 0000000000000000000000000000000000000000..76d13cef127266f7757a96ad2465312e35d058c4 Binary files /dev/null and b/exam2/ex2/main differ diff --git a/exam2/ex2/main.c b/exam2/ex2/main.c index 45422d4fa3b9f70c077451caf98481346da94be3..931dbd85539a2365eb53c9eb7962b34a24696f0b 100644 --- a/exam2/ex2/main.c +++ b/exam2/ex2/main.c @@ -1,29 +1,20 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +#include "tree.h" -typedef struct _element { - char c; - struct _element *next; -} element; +int main() { -int main(int argc, char **argv) { + node_t *tree = bst_create(); + int input[15]; - // read user input - char str[16]; - scanf("%s", str); - int len = strlen(str); - // cli args - if (argc == 1) { - printf("need more arguments"); - return EXIT_FAILURE; + for(int i=0;i<15;i++){ + scanf("%d",&input[i]); + tree = bst_insert(tree, input[i]); } + + // manque de temps je fais l'affichage seulement - for (int i = 0; i < argc; i++) { - if (!strcmp(argv[i], "-c")) { - // do stuff with atof/atoi (argv[++i]) - } - } + bst_to_array_incr(tree); + bst_to_array_decr(tree); - return EXIT_SUCCESS; + + bst_destroy(tree); } \ No newline at end of file diff --git a/exam2/ex2/tree.c b/exam2/ex2/tree.c new file mode 100644 index 0000000000000000000000000000000000000000..57348da9a576bd15291c0b23c0fa3405b03a547f --- /dev/null +++ b/exam2/ex2/tree.c @@ -0,0 +1,227 @@ +#include "tree.h" + +// typedef struct _node_t { +// int val; +// struct _node_t *left; +// struct _node_t *right; +// } node_t; + +node_t *test(node_t *tree) { + if (tree->left != NULL) { + printf("%d\n",tree->val); + return bst_find_min_node(tree->left); + } else { + return tree; + } +} + + +void incr(node_t *tree) { + + if (tree == NULL) { + return; + } + incr(tree->left); + printf("%d\n", tree->val); + + incr(tree->right); +} + +void swap(node_t* a,node_t*b){ + node_t tmp=*a; + *a=*b; + *b=tmp; +} +void reverse_tree(node_t* tree){ + if(tree==NULL){ + return; + } + if(tree->right!=NULL&&tree->left!=NULL){ + swap(tree->right,tree->left); + + } + reverse_tree(tree->right); + reverse_tree(tree->left); +} + +int* bst_to_array_incr(node_t *tree){ + //pas assez de temps donc j'affiche seulement les valeurs dans l'ordre + printf("ordre croissant:\n"); + incr(tree); + printf("\n"); + // int *values=malloc(sizeof(int)*15); + + return NULL; +} + +int* bst_to_array_decr(node_t *tree){ + //pareil + printf("ordre decroissant (presque):\n"); + reverse_tree(tree); + incr(tree); + // int *values=malloc(sizeof(int)*15); + + return NULL; +} + + +// peite gauche et plus grand droite +bool bst_is_empty(node_t *tree) { return tree == NULL; } + +static node_t *create_node(int val) { + node_t *node = malloc(sizeof(node_t)); + if (node == NULL) { // memory error + return NULL; + } + node->left = NULL; + node->right = NULL; + node->val = val; + return node; +} + +node_t *bst_create() { return NULL; } + +void bst_destroy(node_t *tree) { + if (!bst_is_empty(tree)) { + if (tree->left != NULL) { + bst_destroy(tree->left); + } + if (tree->right != NULL) { + bst_destroy(tree->right); + } + free(tree); + } +} + +void bst_print(node_t *tree, int depth) { // affiche l'arbre ordre croissant + + if (tree == NULL) { + return; + } + bst_print(tree->left, depth + 1); + for (int i = 0; i < depth; i++) { + printf("-------"); + } + printf(" %d \n\n", tree->val); + bst_print(tree->right, depth + 1); +} + +// insertion de val dans l'arbre et retourne l'arbre (ou NULL si problème) +node_t *bst_insert(node_t *tree, int val) { + + if (bst_is_empty(tree)) { // root + tree = create_node(val); + } else { + + if (val > tree->val) { // right + if (tree->right == NULL) { + tree->right = create_node(val); + } else { + tree->right = bst_insert(tree->right, val); + } + + } else { // left + if (tree->left == NULL) { + tree->left = create_node(val); + } else { + tree->left = bst_insert(tree->left, val); + } + } + } + return tree; +} + +// la valeur val est-elle présente dans l'arbre? +bool bst_is_present(node_t *tree, int val) { + return bst_search(tree, val) != NULL; +} + +// retourne le noeud où la valeur val se trouve (NULL si absent) +node_t *bst_search(node_t *tree, int val) { + + if (!bst_is_empty(tree)) { + + if (val == tree->val) { // found it + return tree; + } else if (val > tree->val) { // right + return bst_search(tree->right, val); + } else { // left + return bst_search(tree->left, val); + } + } + + return NULL; +} + +// l'arbre est-il un arbre binaire de recherche? +bool bst_is_bst(node_t *tree) { + if(tree==NULL){ + return true; + } + if (tree->left != NULL && tree->left->val > tree->val) { + return false; + } + + if (tree->right != NULL && tree->right->val < tree->val) { + return false; + } + return bst_is_bst(tree->left) && bst_is_bst(tree->right); +} + + +node_t *bst_find_min_node(node_t *tree) { + if (tree->left != NULL) { + return bst_find_min_node(tree->left); + } else { + return tree; + } +} + +int bst_find_min(node_t *tree) { return bst_find_min_node(tree)->val; } + +node_t *bst_find_max_node(node_t *tree) { + if (tree->right != NULL) { + return bst_find_min_node(tree->right); + } else { + return tree; + } +} + +int bst_find_max(node_t *tree) { return bst_find_max_node(tree)->val; } + +int count_child(node_t *node) { + int nb = (node->left != NULL) + (node->right != NULL); + // printf("%d child(s)\n", nb); + return nb; +} + +node_t *bst_delete(node_t *tree, int val) { + if (!bst_is_empty(tree)) { + + if (val > tree->val) { + tree->right = bst_delete(tree->right, val); // go right + + } else if (val < tree->val) { + tree->left = bst_delete(tree->left, val); // go left + + // found node + } else if (count_child(tree) == 2) { + + node_t *next = bst_find_min_node(tree->right); + tree->val = next->val; + tree->right = bst_delete(next, next->val); + + } else { // 1 or 0 childs + node_t *tmp = tree; + if (tmp->left != NULL) { // left + tree = tree->left; + } else if (tmp->right != NULL) { // right + tree = tree->right; + } else { + tree = NULL; + } + free(tmp); + } + } + return tree; +} diff --git a/exam2/ex2/tree.h b/exam2/ex2/tree.h new file mode 100644 index 0000000000000000000000000000000000000000..cdadfd805645dbdea70645205f0f867e1376f14f --- /dev/null +++ b/exam2/ex2/tree.h @@ -0,0 +1,49 @@ +#ifndef _STACK_H_ +#define _STACK_H_ + +#include <stdio.h> +#include <stdbool.h> +#include <malloc.h> + +typedef struct _node_t { +int val; +struct _node_t *left; +struct _node_t *right; +} node_t; + +//BINARY SEARCH TREE (BST) + +// Fonctions de création, destruction et affichage +node_t *bst_create(); // création d'un arbre vide (retourne NULL) +void bst_destroy(node_t *tree); // détruit l'arbre et vide la mémoire + +void bst_print(node_t *tree, int depth); // affiche l'arbre (voir plus bas) +// insertion de val dans l'arbre et retourne l'arbre (ou NULL si problème) +node_t *bst_insert(node_t *tree, int val); +// efface le premier élément contenant la valeur val dans l'arbre +// et retourne l'arbre (ne fait rien si val est absente) +node_t *bst_delete(node_t *tree, int val); +// la valeur val est-elle présente dans l'arbre? +bool bst_is_present(node_t *tree, int val); +// retourne le noeud où la valeur val se trouve (NULL si absent) +node_t *bst_search(node_t *tree, int val); +// l'arbre est-il un arbre binaire de recherche? +bool bst_is_bst(node_t *tree); +// retourne le noeud avec la valeur minimale de l'arbre (NULL s'il y a pas) +node_t *bst_find_min_node(node_t *tree); +// retourne la valeur la plus petite stockée dans l'arbre (ou MIN_INT) +int bst_find_min(node_t *tree); +// retourne le noeud avec la valeur maximale de l'arbre (NULL s'il y a pas) +node_t *bst_find_max_node(node_t *tree); +// retourne la valeur la plus grande stockée dans l'arbre (ou MAX_INT) +int bst_find_max(node_t *tree); + +int count_child(node_t *node); + +int* bst_to_array_incr(node_t *tree); + +int* bst_to_array_decr(node_t *tree); + +int* bst_find_min_and_free(node_t *tree); + +#endif \ No newline at end of file diff --git a/exam2/ex3/main b/exam2/ex3/main new file mode 100755 index 0000000000000000000000000000000000000000..2c97531137305d6eb4ad608dc6873c217d6fd24a Binary files /dev/null and b/exam2/ex3/main differ diff --git a/exam2/ex3/main.c b/exam2/ex3/main.c index 45422d4fa3b9f70c077451caf98481346da94be3..e7198850a917a1cf4ae648c7a3d5208fb1156efe 100644 --- a/exam2/ex3/main.c +++ b/exam2/ex3/main.c @@ -2,28 +2,45 @@ #include <stdlib.h> #include <string.h> -typedef struct _element { - char c; - struct _element *next; -} element; - -int main(int argc, char **argv) { - - // read user input - char str[16]; - scanf("%s", str); - int len = strlen(str); - // cli args - if (argc == 1) { - printf("need more arguments"); - return EXIT_FAILURE; + +int my_strlen(char* str){ + int i=0; + while(str[i]!='\0'){ + i++; + } + return i; +} + +void hamming_distance(char*s1,char*s2){ + int len1=my_strlen(s1); + if(len1!=my_strlen(s2)){ + + printf("Distance %s - %s: Impossible\n",s1,s2); + return; } - for (int i = 0; i < argc; i++) { - if (!strcmp(argv[i], "-c")) { - // do stuff with atof/atoi (argv[++i]) + int cnt=0; + for(int i;i<len1;i++){ + if(s1[i]!=s2[i]){ + cnt++; } } + printf("Distance %s - %s: %d\n",s1,s2,cnt); +} + +int main() { + + char str0[40]; + char str1[40]; + char str2[40]; + scanf("%s", str0); + scanf("%s", str1); + scanf("%s", str2); + + hamming_distance(str0,str1); + hamming_distance(str0,str2); + hamming_distance(str1,str2); + printf("\n"); return EXIT_SUCCESS; } \ No newline at end of file diff --git a/exam2/ex4/main b/exam2/ex4/main new file mode 100755 index 0000000000000000000000000000000000000000..e3b7eb536cbb6ce444e753366e5aa654193209e6 Binary files /dev/null and b/exam2/ex4/main differ diff --git a/exam2/ex4/main.c b/exam2/ex4/main.c index 45422d4fa3b9f70c077451caf98481346da94be3..dfd5e1c08cab5ac28595b968809393e6bf619184 100644 --- a/exam2/ex4/main.c +++ b/exam2/ex4/main.c @@ -2,28 +2,88 @@ #include <stdlib.h> #include <string.h> -typedef struct _element { - char c; - struct _element *next; -} element; - -int main(int argc, char **argv) { - - // read user input - char str[16]; - scanf("%s", str); - int len = strlen(str); - // cli args - if (argc == 1) { - printf("need more arguments"); - return EXIT_FAILURE; +typedef struct _etudiante { + char *name; + int hash; +} etudiante; + +etudiante* new_student(char* name){ + int len=strlen(name); + int hash=0; + for(int i=0;i<len;i++){ + hash+=(43*name[i])%len; } + etudiante *etu=malloc(sizeof(etudiante)); + etu->name=name; + etu->hash=hash; + return etu; +} + +etudiante* shallow_copy(etudiante* stu){ + return stu; +} + +etudiante* deep_copy(etudiante* stu){ + etudiante *etu=malloc(sizeof(etudiante)); + etu->name=stu->name; + etu->hash=stu->hash; + return etu; +} + +void print_student(etudiante* stu){ + printf("%s, %d\n",stu->name,stu->hash); +} - for (int i = 0; i < argc; i++) { - if (!strcmp(argv[i], "-c")) { - // do stuff with atof/atoi (argv[++i]) - } +void delete_student(etudiante* stu){ + free(stu); +} + +void set_name(etudiante* stu,char* newName){ + int len=strlen(newName); + int hash=0; + for(int i=0;i<len;i++){ + hash+=(43*newName[i])%len; } + stu->name=newName; + stu->hash=hash; +} + +void doStuffWithStudent(char* name){ + printf("welcome %s\n",name); + + etudiante *s = new_student(name); + print_student(s); + + etudiante* s_deep = deep_copy(s); + set_name(s_deep, "deep_student"); + + print_student(s_deep); + print_student(s); + + etudiante* s_shallow = shallow_copy(s); + set_name(s_shallow, "shallow_student"); + + print_student(s); + print_student(s_deep); + print_student(s_shallow); + + //free the students ! + delete_student(s); + delete_student(s_deep); + printf("\n"); +} + +int main() { + + char name1[40]; + char name2[40]; + scanf("%s", name1); + scanf("%s", name2); + + doStuffWithStudent(name1); + doStuffWithStudent(name2); + + return EXIT_SUCCESS; } \ No newline at end of file diff --git a/exam2/ex5/Makefile b/exam2/ex5/Makefile deleted file mode 100644 index 478f28e7627a9dc3e5c9de1e581f89d3ff120c04..0000000000000000000000000000000000000000 --- a/exam2/ex5/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -main: main.o - gcc -o $@ $< -fsanitize=address -fsanitize=leak - -main.o: main.c - gcc -c -Wall -Wextra -pedantic -fsanitize=address -fsanitize=leak $< - -clean: - rm -f *.o main - -rebuild: clean main \ No newline at end of file diff --git a/exam2/ex5/main.c b/exam2/ex5/main.c deleted file mode 100644 index 45422d4fa3b9f70c077451caf98481346da94be3..0000000000000000000000000000000000000000 --- a/exam2/ex5/main.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -typedef struct _element { - char c; - struct _element *next; -} element; - -int main(int argc, char **argv) { - - // read user input - char str[16]; - scanf("%s", str); - int len = strlen(str); - // cli args - if (argc == 1) { - printf("need more arguments"); - return EXIT_FAILURE; - } - - for (int i = 0; i < argc; i++) { - if (!strcmp(argv[i], "-c")) { - // do stuff with atof/atoi (argv[++i]) - } - } - - return EXIT_SUCCESS; -} \ No newline at end of file