diff --git a/source_codes/Makefile b/source_codes/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..0ff2c06b38756c6257190905e47bd88ba96cce3f --- /dev/null +++ b/source_codes/Makefile @@ -0,0 +1,9 @@ +TOPTARGETS := all clean + +SUBDIRS := $(wildcard */.) + +$(TOPTARGETS): $(SUBDIRS) +$(SUBDIRS): + $(MAKE) -C $@ $(MAKECMDGOALS) + +.PHONY: $(TOPTARGETS) $(SUBDIRS) diff --git a/source_codes/loops_tests/.gitignore b/source_codes/loops_tests/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0a63c70f19ad8d2da7572535b0867a0f8c951bac --- /dev/null +++ b/source_codes/loops_tests/.gitignore @@ -0,0 +1,5 @@ +factorielle +ppcm_bis +nb1er +pgcd +ppcm diff --git a/source_codes/loops_tests/Makefile b/source_codes/loops_tests/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..75f84c991b55660d30b00240129d0619b773b634 --- /dev/null +++ b/source_codes/loops_tests/Makefile @@ -0,0 +1,18 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +EXECS := $(shell find . -type f -iname '*.c' | sed 's/\.c//g') + +all: $(EXECS) + +$(EXECS): %: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o $(EXECS) .gitignore + diff --git a/source_codes/pointeurs/.gitignore b/source_codes/pointeurs/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..7bf15f4ab3ca13512819187a45277f86dc8854ec --- /dev/null +++ b/source_codes/pointeurs/.gitignore @@ -0,0 +1 @@ +string_deep_shallow_copy diff --git a/source_codes/pointeurs/Makefile b/source_codes/pointeurs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..75f84c991b55660d30b00240129d0619b773b634 --- /dev/null +++ b/source_codes/pointeurs/Makefile @@ -0,0 +1,18 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +EXECS := $(shell find . -type f -iname '*.c' | sed 's/\.c//g') + +all: $(EXECS) + +$(EXECS): %: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o $(EXECS) .gitignore + diff --git a/source_codes/pointeurs/string_deep_shallow_copy.c b/source_codes/pointeurs/string_deep_shallow_copy.c index 588cb715660414153055ddb01500130a005d2f57..280969fe035c0cf1c9179651a3933c7900d8afc2 100644 --- a/source_codes/pointeurs/string_deep_shallow_copy.c +++ b/source_codes/pointeurs/string_deep_shallow_copy.c @@ -2,71 +2,65 @@ #include <stdlib.h> typedef struct _chaine { - char* str; - int len; + char *str; + int len; } chaine; -int length(char* phrase) { - if (NULL == phrase) return -1;; - int len = 0; - while (0 != phrase[len]) { - len++; - } - return len; +int length(char *phrase) { + if (NULL == phrase) { + return -1; + } + int len = 0; + while (0 != phrase[len]) { + len++; + } + return len; } -chaine chaine_build(char* phrase) { - chaine ch; - ch.len = length(phrase); - ch.str = malloc((ch.len+1)*sizeof(char)); - for (int i=0;i<ch.len;i++) { - ch.str[i] = phrase[i]; - } - return ch; +chaine chaine_build(char *phrase) { + chaine ch; + ch.len = length(phrase); + ch.str = malloc((ch.len + 1) * sizeof(char)); + for (int i = 0; i < ch.len; i++) { + ch.str[i] = phrase[i]; + } + return ch; } chaine deep_copy(chaine ch) { - return chaine_build(ch.str); + return chaine_build(ch.str); } // Dangereux, car plusieurs pointeurs sur le même tableau de caractères !!! // A éviter !!! chaine shallow_copy(chaine ch) { - chaine cpy; - cpy.len = ch.len; - cpy.str = ch.str; - return cpy; + chaine cpy; + cpy.len = ch.len; + cpy.str = ch.str; + return cpy; } -// S'il y a plusieurs pointeurs sur le même tableau de caractères, +// S'il y a plusieurs pointeurs sur le même tableau de caractères, // les autres pointeurs ne seront pas mis à NULL -void chaine_free(chaine* ch) { - if (NULL != ch->str) - free(ch->str); - ch->str = NULL; - } - ch->len = -1; +void chaine_free(chaine *ch) { + if (NULL != ch->str) { + free(ch->str); + ch->str = NULL; + } + ch->len = -1; } void main() { - char* tutu = malloc(10*sizeof(char)); - for (int i=0;i<6;i++) tutu[i] = 'b'; - tutu[6] = 0; - chaine ch = chaine_build(tutu); - chaine tmp = deep_copy(ch); - ch.str[0] = 'a'; - printf("%d\n",ch.len); - printf("%s\n",ch.str); - printf("%d\n",tmp.len); - printf("%s\n",tmp.str); + char *tutu = malloc(10 * sizeof(char)); + for (int i = 0; i < 6; i++) + tutu[i] = 'b'; + tutu[6] = 0; + chaine ch = chaine_build(tutu); + chaine tmp = deep_copy(ch); + ch.str[0] = 'a'; + printf("%d\n", ch.len); + printf("%s\n", ch.str); + printf("%d\n", tmp.len); + printf("%s\n", tmp.str); } - - - - - - - - - diff --git a/source_codes/recursivity/rec_fibonacci.c b/source_codes/recursivity/rec_fibonacci.c index 0c8a4874704743ccf94af3801892bf6db08cd652..eb134a868a5855ec01efce19537b652ad96030ee 100644 --- a/source_codes/recursivity/rec_fibonacci.c +++ b/source_codes/recursivity/rec_fibonacci.c @@ -3,20 +3,36 @@ // Suite de Fibonacci: a_n = a_{n-1} + a_{n-2}, a_0 = 0, a_1 = 1 int fib(int n); +int fib_imp(int n); int main() { - int n; - printf("n="); - scanf("%d",&n); - printf("%d\n",fib(n)); + int n; + printf("n="); + scanf("%d", &n); + printf("%d\n", fib(n)); + printf("%d\n", fib_imp(n)); } // Suite de Fibonacci: a_n = a_{n-1} + a_{n-2}, a_0 = 0, a_1 = 1 int fib(int n) { - switch(n) { - case 0: return 0; - case 1: return 1; - default: return fib(n-1)+fib(n-2); - } + switch (n) { + case 0: + return 0; + case 1: + return 1; + default: + return fib(n - 1) + fib(n - 2); + } } +int fib_imp(int n) { + int fib0 = 1; + int fib1 = 1; + int fib = n == 0 ? 0 : fib1; + for (int i = 2; i < n; ++i) { + fib = fib0 + fib1; + fib0 = fib1; + fib1 = fib; + } + return fib; +} diff --git a/source_codes/refactor_with_functions/.gitignore b/source_codes/refactor_with_functions/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c5ed9534211ed38b60f9eaf429a5610ce303587f --- /dev/null +++ b/source_codes/refactor_with_functions/.gitignore @@ -0,0 +1,13 @@ +factorielle_refactored +tri_select_refactored_part +chess_queen_refactored +nb1er_refactored +tri_select_to_refactor +eratosthene_refactored +anagramme_refactored +palindrome_refactored +array_1D_init_find_min_refactored +tri_select_refactored +pgcd_refactored +chess_queen_refactored_part +ppcm_refactored diff --git a/source_codes/refactor_with_functions/Makefile b/source_codes/refactor_with_functions/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..75f84c991b55660d30b00240129d0619b773b634 --- /dev/null +++ b/source_codes/refactor_with_functions/Makefile @@ -0,0 +1,18 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +EXECS := $(shell find . -type f -iname '*.c' | sed 's/\.c//g') + +all: $(EXECS) + +$(EXECS): %: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o $(EXECS) .gitignore + diff --git a/source_codes/refactor_with_functions/chess_queen_refactored_part.c b/source_codes/refactor_with_functions/chess_queen_refactored_part.c index d3d3a91cd1dc35978b132fa0772b33bdb8a0ee9a..c8f99762bdd418cb5aa2083fb1319f353a6fab60 100644 --- a/source_codes/refactor_with_functions/chess_queen_refactored_part.c +++ b/source_codes/refactor_with_functions/chess_queen_refactored_part.c @@ -1,67 +1,72 @@ #include <stdio.h> #include <stdlib.h> -typedef enum _piece {SAFE, VULN, QUEEN} piece; +typedef enum _piece { SAFE, VULN, QUEEN } piece; -void print(int n,int m,cell tab[n][m]); -void init_board(int n,int m,cell tab[n][m]); -void couverture(int n,int m,cell tab[n][m],int r_x,int r_y); +void print(int n, int m, piece tab[n][m]); +void init_board(int n, int m, piece tab[n][m]); +void couverture(int n, int m, piece tab[n][m], int r_x, int r_y); void main() { - int n=8; - piece board[n][n]; - init(n,n,board,SAFE); - - print(n,n,board); - printf("Entrez la colonne de la reine (1..%d): ",n); - int r_j; - scanf("%d",&r_j); - r_j--; - printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a'); - char ch[1]; - scanf("%s",ch); - couverture(n,n,board,ch[0]-'a',r_j); - print(n,n,board); + int n = 8; + piece board[n][n]; + init(n, n, board, SAFE); + + print(n, n, board); + printf("Entrez la colonne de la reine (1..%d): ", n); + int r_j; + scanf("%d", &r_j); + r_j--; + printf("Entrez la ligne de la reine ('a'..'%c'): ", n - 1 + 'a'); + char ch[1]; + scanf("%s", ch); + couverture(n, n, board, ch[0] - 'a', r_j); + print(n, n, board); } -void print(int n,int m,piece board[n][m]) { - for (int i=n-1;i>=0;i--) { - printf("%c ",'a'+i); - for (int j=0;j<m;j++) { - switch(board[i][j]) { - case VULN: printf(" *"); break; - case SAFE : printf(" o"); break; - case QUEEN: printf(" R"); - } - } - printf("\n"); - } - printf("\n "); - for (int j=0;j<m;j++) { - printf(" %d",j+1); - } - printf("\n"); +void print(int n, int m, piece board[n][m]) { + for (int i = n - 1; i >= 0; i--) { + printf("%c ", 'a' + i); + for (int j = 0; j < m; j++) { + switch (board[i][j]) { + case VULN: + printf(" *"); + break; + case SAFE: + printf(" o"); + break; + case QUEEN: + printf(" R"); + } + } + printf("\n"); + } + printf("\n "); + for (int j = 0; j < m; j++) { + printf(" %d", j + 1); + } + printf("\n"); } -void couverture(int n,int m,piece board[n][m],int r_i,int r_j) { - //colonne de la reine - for (int k=0;k<n;k++) { - board[k][r_j] = VULN; - } - //ligne de la reine - for (int k=0;k<m;k++) { - board[r_i][k] = VULN; - } - //diagonale montante - for (int k=0;r_i+k<n && r_j+k<m;k++) { - board[r_i+k][r_j+k] = VULN; - } - //compléter les autres diagonales - - board[r_i][r_j] = QUEEN; +void couverture(int n, int m, piece board[n][m], int r_i, int r_j) { + // colonne de la reine + for (int k = 0; k < n; k++) { + board[k][r_j] = VULN; + } + // ligne de la reine + for (int k = 0; k < m; k++) { + board[r_i][k] = VULN; + } + // diagonale montante + for (int k = 0; r_i + k < n && r_j + k < m; k++) { + board[r_i + k][r_j + k] = VULN; + } + // compléter les autres diagonales + + board[r_i][r_j] = QUEEN; } -void init(int n,int m,piece tab[n][m],piece pce) { - // à compléter +void init(int n, int m, piece tab[n][m], piece pce) { + // à compléter } diff --git a/source_codes/sorting/.gitignore b/source_codes/sorting/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0b58fcdcc82a1637b65620db6a563fca2019f983 --- /dev/null +++ b/source_codes/sorting/.gitignore @@ -0,0 +1,6 @@ +tris_base_part +tris_base +quicksort +heapsort_main +heapsort.o +quicksort_part diff --git a/source_codes/sorting/Makefile b/source_codes/sorting/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..97109d9815036dde0ab442c1bbbd10b0e29c2e4b --- /dev/null +++ b/source_codes/sorting/Makefile @@ -0,0 +1,36 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +all: tris_base_part tris_base quicksort heapsort_main quicksort_part + +tris_base_part: tris_base_part.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +tris_base: tris_base.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +quicksort: quicksort.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +quicksort_part: quicksort_part.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +heapsort_main: heapsort_main.c heapsort.o + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + @echo $@ >> .gitignore + @echo *.o >> .gitignore + + +heapsort.o: heapsort.h + +.PHONY: clean all + +clean: + rm -f *.o tris_base tris_base_part quicksort_part quicksort heapsort_main .gitignore + diff --git a/source_codes/structures/.gitignore b/source_codes/structures/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..3b0be08e19b108167024c329497a073d8237d480 --- /dev/null +++ b/source_codes/structures/.gitignore @@ -0,0 +1,2 @@ +fractions_part +fractions diff --git a/source_codes/structures/Makefile b/source_codes/structures/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..75f84c991b55660d30b00240129d0619b773b634 --- /dev/null +++ b/source_codes/structures/Makefile @@ -0,0 +1,18 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +EXECS := $(shell find . -type f -iname '*.c' | sed 's/\.c//g') + +all: $(EXECS) + +$(EXECS): %: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o $(EXECS) .gitignore + diff --git a/source_codes/structures/fractions.c b/source_codes/structures/fractions.c index 75f36a55b69cc23ffe4bbbb06e5a9500da6060c7..8ff0dfb97c19906619b0b01bd656ea2650a50014 100644 --- a/source_codes/structures/fractions.c +++ b/source_codes/structures/fractions.c @@ -1,166 +1,192 @@ +#include <assert.h> #include <stdio.h> #include <stdlib.h> -#include <assert.h> typedef struct _fraction { - int num; - int den; + int num; + int den; } fraction; void print(fraction frac) { - printf(" %d/%d ",frac.num,frac.den); + printf(" %d/%d ", frac.num, frac.den); +} + +int pgcd(int n, int m) { + assert(n > 0 && m > 0); + int tmp_n = n, tmp_m = m; + while (tmp_n % tmp_m > 0) { + int tmp = tmp_n; + tmp_n = tmp_m; + tmp_m = tmp % tmp_m; + } + return tmp_m; +} + +void reduire(fraction *frac) { + if (0 == frac->num) { + frac->den = 1; + } else { + int gcd = pgcd(abs(frac->num), frac->den); + frac->num /= gcd; + frac->den /= gcd; + } } -int pgcd(int n,int m) { - assert(n > 0 && m > 0); - int tmp_n = n,tmp_m = m; - while (tmp_n%tmp_m > 0) { - int tmp = tmp_n; - tmp_n = tmp_m; - tmp_m = tmp%tmp_m; - } - return tmp_m; +fraction fraction_build(int num, int den) { + assert(den != 0); + int sign = den / abs(den); + fraction res = {sign * num, sign * den}; + reduire(&res); + return res; } -void reduire(fraction* frac) { - if (0 == frac->num) { - frac->den = 1; - } else { - int gcd = pgcd(abs(frac->num),frac->den); - frac->num /= gcd; - frac->den /= gcd; - } +fraction add(fraction frac1, fraction frac2) { + return fraction_build( + frac1.num * frac2.den + frac1.den * frac2.num, frac1.den * frac2.den); } -fraction fraction_build(int num,int den) { - assert(den != 0); - int sign = den/abs(den); - fraction res = {sign*num,sign*den}; - reduire(&res); - return res; +fraction add1(int n, fraction frac) { + return add(fraction_build(n, 1), frac); } -fraction add(fraction frac1,fraction frac2) { - return fraction_build(frac1.num*frac2.den+frac1.den*frac2.num,frac1.den*frac2.den); +fraction add2(fraction frac, int n) { + return add1(n, frac); } -fraction add1(int n,fraction frac) { - return add(fraction_build(n,1),frac); +void add_inplace(fraction *frac1, fraction frac2) { + *frac1 = add(*frac1, frac2); } -fraction add2(fraction frac,int n,) { - return add1(n,frac); +void neg_inplace(fraction *frac1) { + frac1->num = -frac1->num; } -void add_inplace(fraction* frac1,fraction frac2) { - *frac1 = add(*frac1,frac2); +fraction neg(fraction frac) { + fraction f = frac; + neg_inplace(&f); + return f; } -fraction sub(fraction frac1,fraction frac2) { - return add(frac1,fraction_build(-frac2.num,frac2.den)); +fraction sub(fraction frac1, fraction frac2) { + return add(frac1, fraction_build(-frac2.num, frac2.den)); } -fraction sub1(int n,fraction frac) { - return sub(fraction_build(n,1),frac); +fraction sub1(int n, fraction frac) { + return sub(fraction_build(n, 1), frac); } -fraction sub2(fraction frac,int n,) { - return add(frac,-n); +fraction sub2(fraction frac, int n) { + return add2(frac, -n); } -void sub_inplace(fraction* frac1,fraction frac2) { - *frac1 = sub(*frac1,frac2); +void sub_inplace(fraction *frac1, fraction frac2) { + *frac1 = sub(*frac1, frac2); } -fraction mult(fraction frac1,fraction frac2) { - return fraction_build(frac1.num*frac2.num,frac1.den*frac2.den);; +fraction mult(fraction frac1, fraction frac2) { + return fraction_build(frac1.num * frac2.num, frac1.den * frac2.den); + ; } -fraction mult1(int n,fraction frac) { - return mult(frac,fraction_build(n,1)); +fraction mult1(int n, fraction frac) { + return mult(frac, fraction_build(n, 1)); } -fraction mult2(fraction frac,int n) { - return mult1(n,frac); +fraction mult2(fraction frac, int n) { + return mult1(n, frac); } -void mult_inplace(fraction* frac1,fraction frac2) { - *frac1 = mult(*frac1,frac2); +void mult_inplace(fraction *frac1, fraction frac2) { + *frac1 = mult(*frac1, frac2); } -fraction divide(fraction frac1,fraction frac2) { - assert(frac2.num != 0); - int sign = frac2.num/abs(frac2.num); - return mult(frac1,fraction_build(sign*frac2.den,abs(frac2.num))); +fraction divide(fraction frac1, fraction frac2) { + assert(frac2.num != 0); + int sign = frac2.num / abs(frac2.num); + return mult(frac1, fraction_build(sign * frac2.den, abs(frac2.num))); } -fraction div1(int n,fraction frac) { - return divide(fraction_build(n,1),frac); +fraction div1(int n, fraction frac) { + return divide(fraction_build(n, 1), frac); } -fraction div2(fraction frac,int n) { - return divide(frac,fraction_build(n,1)); +fraction div2(fraction frac, int n) { + return divide(frac, fraction_build(n, 1)); } -void divide_inplace(fraction* frac1,fraction frac2) { - *frac1 = divide(*frac1,frac2); +void divide_inplace(fraction *frac1, fraction frac2) { + *frac1 = divide(*frac1, frac2); } -fraction puiss(fraction frac,int n) { - fraction prod = fraction_build(1,1); - for (int i=1;i<=abs(n);i++) { - prod = mult(prod,frac); - } - if (n < 0) { - prod = div1(1,prod); - } - return prod; +fraction puiss(fraction frac, int n) { + fraction prod = fraction_build(1, 1); + for (int i = 1; i <= abs(n); i++) { + prod = mult(prod, frac); + } + if (n < 0) { + prod = div1(1, prod); + } + return prod; } float reel(fraction frac) { - return (float)frac.num/(float)frac.den; -} - -fraction compute(fraction f1,fraction f2,char op) { - fraction res; - switch(op) { - case 'x': res = mult(f1,f2); break; - case '+': res = add(f1,f2); break; - case '/': res = divide(f1,f2); break; - case '-': res = sub(f1,f2); break; - case 'p': res = puiss(f1,f2.num); break; - default : printf("Pas implémenté\n"); - } - return res; -} - -void main(int argc,char** argv) { - fraction f1,f2; - switch(argc) { - case 3: - printf("%d\n",pgcd(atoi(argv[1]),atoi(argv[2]))); - break; - case 5: - // teste si le 2ème argument est un dénominateur (donc > 0) - if ('1' <= argv[2][0] && argv[2][0] <= '9') { - f1 = fraction_build(atoi(argv[1]),atoi(argv[2])); - f2 = fraction_build(atoi(argv[4]),1); - print(compute(f1,f2,argv[3][0])); - } else { - f1 = fraction_build(atoi(argv[1]),1); - f2 = fraction_build(atoi(argv[3]),atoi(argv[4])); - print(compute(f1,f2,argv[2][0])); - } - break; - case 6: - f1 = fraction_build(atoi(argv[1]),atoi(argv[2])); - print(f1); printf("\n"); - f2 = fraction_build(atoi(argv[4]),atoi(argv[5])); - print(f2); printf("\n"); - print(compute(f1,f2,argv[3][0])); - break; - default: printf("Pas implémenté\n"); - } - printf("\n"); + return (float)frac.num / (float)frac.den; +} + +fraction compute(fraction f1, fraction f2, char op) { + fraction res; + switch (op) { + case 'x': + res = mult(f1, f2); + break; + case '+': + res = add(f1, f2); + break; + case '/': + res = divide(f1, f2); + break; + case '-': + res = sub(f1, f2); + break; + case 'p': + res = puiss(f1, f2.num); + break; + default: + printf("Pas implémenté\n"); + } + return res; +} + +void main(int argc, char **argv) { + fraction f1, f2; + switch (argc) { + case 3: + printf("%d\n", pgcd(atoi(argv[1]), atoi(argv[2]))); + break; + case 5: + // teste si le 2ème argument est un dénominateur (donc > 0) + if ('1' <= argv[2][0] && argv[2][0] <= '9') { + f1 = fraction_build(atoi(argv[1]), atoi(argv[2])); + f2 = fraction_build(atoi(argv[4]), 1); + print(compute(f1, f2, argv[3][0])); + } else { + f1 = fraction_build(atoi(argv[1]), 1); + f2 = fraction_build(atoi(argv[3]), atoi(argv[4])); + print(compute(f1, f2, argv[2][0])); + } + break; + case 6: + f1 = fraction_build(atoi(argv[1]), atoi(argv[2])); + print(f1); + printf("\n"); + f2 = fraction_build(atoi(argv[4]), atoi(argv[5])); + print(f2); + printf("\n"); + print(compute(f1, f2, argv[3][0])); + break; + default: + printf("Pas implémenté\n"); + } + printf("\n"); } diff --git a/source_codes/structures/fractions_part.c b/source_codes/structures/fractions_part.c index 8c0095a3103c588a7aa32968ec9d98e1dfb2c2cc..2a0b105cc52586996068def22e42a04afcda7c69 100644 --- a/source_codes/structures/fractions_part.c +++ b/source_codes/structures/fractions_part.c @@ -1,172 +1,187 @@ +#include <assert.h> #include <stdio.h> #include <stdlib.h> -#include <assert.h> typedef struct _fraction { - int num; - int den; + int num; + int den; } fraction; void print(fraction frac) { - printf(" %d/%d ",frac.num,frac.den); + printf(" %d/%d ", frac.num, frac.den); } -int pgcd(int n,int m) { - assert(n > 0 && m > 0); - int tmp_n = n,tmp_m = m; - while (tmp_n%tmp_m > 0) { - int tmp = tmp_n; - tmp_n = tmp_m; - tmp_m = tmp%tmp_m; - } - return tmp_m; +int pgcd(int n, int m) { + assert(n > 0 && m > 0); + int tmp_n = n, tmp_m = m; + while (tmp_n % tmp_m > 0) { + int tmp = tmp_n; + tmp_n = tmp_m; + tmp_m = tmp % tmp_m; + } + return tmp_m; } -void reduire(fraction* frac) { - if (0 == frac->num) { - frac->den = 1; - } else { - int gcd = pgcd(abs(frac->num),frac->den); - frac->num /= gcd; - frac->den /= gcd; - } +void reduire(fraction *frac) { + if (0 == frac->num) { + frac->den = 1; + } else { + int gcd = pgcd(abs(frac->num), frac->den); + frac->num /= gcd; + frac->den /= gcd; + } } -fraction fraction_build(int num,int den) { - assert(den != 0); - int sign = den/abs(den); - fraction res = {sign*num,sign*den}; - reduire(&res); - return res; +fraction fraction_build(int num, int den) { + assert(den != 0); + int sign = den / abs(den); + fraction res = {sign * num, sign * den}; + reduire(&res); + return res; } -fraction add(fraction frac1,fraction frac2) { - return fraction_build(frac1.num*frac2.den+frac1.den*frac2.num,frac1.den*frac2.den); +fraction add(fraction frac1, fraction frac2) { + return fraction_build( + frac1.num * frac2.den + frac1.den * frac2.num, frac1.den * frac2.den); } -fraction add1(int n,fraction frac) { - return add(fraction_build(n,1),frac); +fraction add1(int n, fraction frac) { + return add(fraction_build(n, 1), frac); } -fraction add2(fraction frac,int n,) { - return add1(n,frac); +fraction add2(fraction frac, int n) { + return add1(n, frac); } -void add_inplace(fraction* frac1,fraction frac2) { - *frac1 = add(*frac1,frac2); +void add_inplace(fraction *frac1, fraction frac2) { + *frac1 = add(*frac1, frac2); } -fraction sub(fraction frac1,fraction frac2) { - return add(frac1,fraction_build(-frac2.num,frac2.den)); +fraction sub(fraction frac1, fraction frac2) { + return add(frac1, fraction_build(-frac2.num, frac2.den)); } -fraction sub1(int n,fraction frac) { - //à compléter - return fraction_build(0,1); +fraction sub1(int n, fraction frac) { + //à compléter + return fraction_build(0, 1); } -fraction sub2(fraction frac,int n,) { - //à compléter - return fraction_build(0,1); +fraction sub2(fraction frac, int n) { + //à compléter + return fraction_build(0, 1); } -void sub_inplace(fraction* frac1,fraction frac2) { - //à compléter +void sub_inplace(fraction *frac1, fraction frac2) { + //à compléter } -fraction mult(fraction frac1,fraction frac2) { - return fraction_build(frac1.num*frac2.num,frac1.den*frac2.den); +fraction mult(fraction frac1, fraction frac2) { + return fraction_build(frac1.num * frac2.num, frac1.den * frac2.den); } -fraction mult1(int n,fraction frac) { - //à compléter - return fraction_build(0,1); +fraction mult1(int n, fraction frac) { + //à compléter + return fraction_build(0, 1); } -fraction mult2(fraction frac,int n) { - //à compléter - return fraction_build(0,1); +fraction mult2(fraction frac, int n) { + //à compléter + return fraction_build(0, 1); } -void mult_inplace(fraction* frac1,fraction frac2) { - //à compléter +void mult_inplace(fraction *frac1, fraction frac2) { + //à compléter } -fraction divide(fraction frac1,fraction frac2) { - assert(frac2.num != 0); - int sign = frac2.num/abs(frac2.num); - return mult(frac1,fraction_build(sign*frac2.den,abs(frac2.num))); +fraction divide(fraction frac1, fraction frac2) { + assert(frac2.num != 0); + int sign = frac2.num / abs(frac2.num); + return mult(frac1, fraction_build(sign * frac2.den, abs(frac2.num))); } -fraction div1(int n,fraction frac) { - //à compléter - return fraction_build(0,1); +fraction div1(int n, fraction frac) { + //à compléter + return fraction_build(0, 1); } -fraction div2(fraction frac,int n) { - //à compléter - return fraction_build(0,1); +fraction div2(fraction frac, int n) { + //à compléter + return fraction_build(0, 1); } -void divide_inplace(fraction* frac1,fraction frac2) { - //à compléter +void divide_inplace(fraction *frac1, fraction frac2) { + //à compléter } -fraction puiss(fraction frac,int n) { - fraction prod = fraction_build(1,1); - for (int i=1;i<=abs(n);i++) { - prod = mult(prod,frac); - } - if (n < 0) { - prod = div1(1,prod); - } - return prod; +fraction puiss(fraction frac, int n) { + fraction prod = fraction_build(1, 1); + for (int i = 1; i <= abs(n); i++) { + prod = mult(prod, frac); + } + if (n < 0) { + prod = div1(1, prod); + } + return prod; } float reel(fraction frac) { - return (float)frac.num/(float)frac.den; -} - -fraction compute(fraction f1,fraction f2,char op) { - fraction res; - switch(op) { - case 'x': res = mult(f1,f2); break; - case '+': res = add(f1,f2); break; - case '/': res = divide(f1,f2); break; - case '-': res = sub(f1,f2); break; - case 'p': res = puiss(f1,f2.num); break; - default : printf("Pas implémenté\n"); - } - return res; -} - -void main(int argc,char** argv) { - fraction f1,f2; - switch(argc) { - case 3: - printf("%d\n",pgcd(atoi(argv[1]),atoi(argv[2]))); - break; - case 5: - // teste si le 2ème argument est un dénominateur (donc > 0) - if ('1' <= argv[2][0] && argv[2][0] <= '9') { - f1 = fraction_build(atoi(argv[1]),atoi(argv[2])); - f2 = fraction_build(atoi(argv[4]),1); - print(compute(f1,f2,argv[3][0])); - } else { - f1 = fraction_build(atoi(argv[1]),1); - f2 = fraction_build(atoi(argv[3]),atoi(argv[4])); - print(compute(f1,f2,argv[2][0])); - } - break; - case 6: - f1 = fraction_build(atoi(argv[1]),atoi(argv[2])); - print(f1); printf("\n"); - f2 = fraction_build(atoi(argv[4]),atoi(argv[5])); - print(f2); printf("\n"); - print(compute(f1,f2,argv[3][0])); - break; - default: printf("Pas implémenté\n"); - } - printf("\n"); + return (float)frac.num / (float)frac.den; +} + +fraction compute(fraction f1, fraction f2, char op) { + fraction res; + switch (op) { + case 'x': + res = mult(f1, f2); + break; + case '+': + res = add(f1, f2); + break; + case '/': + res = divide(f1, f2); + break; + case '-': + res = sub(f1, f2); + break; + case 'p': + res = puiss(f1, f2.num); + break; + default: + printf("Pas implémenté\n"); + } + return res; +} + +void main(int argc, char **argv) { + fraction f1, f2; + switch (argc) { + case 3: + printf("%d\n", pgcd(atoi(argv[1]), atoi(argv[2]))); + break; + case 5: + // teste si le 2ème argument est un dénominateur (donc > 0) + if ('1' <= argv[2][0] && argv[2][0] <= '9') { + f1 = fraction_build(atoi(argv[1]), atoi(argv[2])); + f2 = fraction_build(atoi(argv[4]), 1); + print(compute(f1, f2, argv[3][0])); + } else { + f1 = fraction_build(atoi(argv[1]), 1); + f2 = fraction_build(atoi(argv[3]), atoi(argv[4])); + print(compute(f1, f2, argv[2][0])); + } + break; + case 6: + f1 = fraction_build(atoi(argv[1]), atoi(argv[2])); + print(f1); + printf("\n"); + f2 = fraction_build(atoi(argv[4]), atoi(argv[5])); + print(f2); + printf("\n"); + print(compute(f1, f2, argv[3][0])); + break; + default: + printf("Pas implémenté\n"); + } + printf("\n"); } diff --git a/source_codes/tableaux_1d/.gitignore b/source_codes/tableaux_1d/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a131353cd4b7b80a0865a8c9beedc1c9227982c9 --- /dev/null +++ b/source_codes/tableaux_1d/.gitignore @@ -0,0 +1,6 @@ +array_1D_init_find_min +palindrome +eratosthene +tri_select +anagramme +tri_select_ebauche diff --git a/source_codes/tableaux_1d/Makefile b/source_codes/tableaux_1d/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..75f84c991b55660d30b00240129d0619b773b634 --- /dev/null +++ b/source_codes/tableaux_1d/Makefile @@ -0,0 +1,18 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +EXECS := $(shell find . -type f -iname '*.c' | sed 's/\.c//g') + +all: $(EXECS) + +$(EXECS): %: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o $(EXECS) .gitignore + diff --git a/source_codes/tableaux_1d/tri_select_ebauche.c b/source_codes/tableaux_1d/tri_select_ebauche.c index 2ada6c532f5393d0e360f0826e7686399ede7f17..2ad897b4dd89a31dd65e7f3fa13fcba95a73d964 100644 --- a/source_codes/tableaux_1d/tri_select_ebauche.c +++ b/source_codes/tableaux_1d/tri_select_ebauche.c @@ -5,43 +5,43 @@ const int SIZE = 13; // Tri par sélection void main() { - //déclaration et intialisation du tableau - srand(time(NULL)); - double tab[SIZE]; - for (int i=0;i<SIZE;i++) { - tab[i] = 100.0*(rand()/(double)RAND_MAX); - } - - //impression du tableau - for (int i=0;i<SIZE;i++) { - printf("%.2lf ",tab[i]); - } - printf("\n"); - //à compléter - int debut = 0; - for (....) { //à compléter - // recherche du plus petit élément du sous-tableau de début à SIZE - int ind_min = 0; // à remplacer 0 par debut - double val_min = tab[0]; // à remplacer 0 par debut - for (int i = 1; i < SIZE; ++i) { //à remplacer 1 par debut+1 - if (val_min > tab[i]) { - val_min = tab[i]; - ind_min = i; - } - } - printf("val. min. = %.2lf / index min. = %d\n ",val_min,ind_min); - // permuter le plus petit élément avec le premier élément du tableau - double tmp = tab[0]; // à remplacer 0 par debut - tab[0] = tab[ind_min]; // à remplacer 0 par debut - tab[ind_min] = tmp; - } + // déclaration et intialisation du tableau + srand(time(NULL)); + double tab[SIZE]; + for (int i = 0; i < SIZE; i++) { + tab[i] = 100.0 * (rand() / (double)RAND_MAX); + } - //impression du tableau - for (int i=0;i<SIZE;i++) { - printf("%.2lf ",tab[i]); - } - printf("\n"); + // impression du tableau + for (int i = 0; i < SIZE; i++) { + printf("%.2lf ", tab[i]); + } + printf("\n"); + //à compléter + int debut = 0; + for (int k = 0; k < -1; ++k) { //à compléter, ce code est FAUX + // recherche du plus petit élément du sous-tableau de début à SIZE + int ind_min = 0; // à remplacer 0 par debut + double val_min = tab[0]; // à remplacer 0 par debut + for (int i = 1; i < SIZE; ++i) { //à remplacer 1 par debut+1 + if (val_min > tab[i]) { + val_min = tab[i]; + ind_min = i; + } + } + printf("val. min. = %.2lf / index min. = %d\n ", val_min, ind_min); + // permuter le plus petit élément avec le premier élément du tableau + double tmp = tab[0]; // à remplacer 0 par debut + tab[0] = tab[ind_min]; // à remplacer 0 par debut + tab[ind_min] = tmp; + } - //validation que le tableau est trié - //à compléter + // impression du tableau + for (int i = 0; i < SIZE; i++) { + printf("%.2lf ", tab[i]); + } + printf("\n"); + + // validation que le tableau est trié + //à compléter } diff --git a/source_codes/tableaux_2d/.gitignore b/source_codes/tableaux_2d/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..041e808484d27dc47b02a4d96acddc84abb26b4e --- /dev/null +++ b/source_codes/tableaux_2d/.gitignore @@ -0,0 +1,4 @@ +chess_queen_part +chess_queen +calcul_matrix +matrix.o diff --git a/source_codes/tableaux_2d/Makefile b/source_codes/tableaux_2d/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..9a1970ea712640bab94cdb42935ab9525d4fc2c4 --- /dev/null +++ b/source_codes/tableaux_2d/Makefile @@ -0,0 +1,27 @@ +CC:=gcc +SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +all: chess_queen_part chess_queen calcul_matrix + +chess_queen_part: chess_queen_part.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +chess_queen: chess_queen.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +calcul_matrix: calcul_matrix.c matrix.o + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + @echo $@ >> .gitignore + @echo *.o >> .gitignore + +matrix.o: matrix.h + +.PHONY: clean all + +clean: + rm -f *.o chess_queen_part chess_queen calcul_matrix .gitignore + diff --git a/source_codes/tableaux_2d/chess_queen.c b/source_codes/tableaux_2d/chess_queen.c index 60a7cb588ce6dce129c1f01fd2a3e035f3707eab..79b62d6f8c578981ec083a6c0943c2e7a5a85c9f 100644 --- a/source_codes/tableaux_2d/chess_queen.c +++ b/source_codes/tableaux_2d/chess_queen.c @@ -1,71 +1,75 @@ #include <stdio.h> #include <stdlib.h> -typedef enum _piece {SAFE, VULN, QUEEN} piece; - -void print(int n,int m,cell tab[n][m]); -void init_board(int n,int m,cell tab[n][m]); -void couverture(int n,int m,cell tab[n][m],int r_x,int r_y); +typedef enum _piece { SAFE, VULN, QUEEN } piece; +void print(int n, int m, piece tab[n][m]); +void init_board(int n, int m, piece tab[n][m]); +void couverture(int n, int m, piece tab[n][m], int r_x, int r_y); void main() { - int n=8; - piece board[n][n]; - init(n,n,board,SAFE); - - print(n,n,board); - printf("Entrez la colonne de la reine (1..%d): ",n); - int r_j; - scanf("%d",&r_j); - r_j--; - printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a'); - char ch[1]; - scanf("%s",ch); - couverture(n,n,board,ch[0]-'a',r_j); - print(n,n,board); + int n = 8; + piece board[n][n]; + init(n, n, board, SAFE); + + print(n, n, board); + printf("Entrez la colonne de la reine (1..%d): ", n); + int r_j; + scanf("%d", &r_j); + r_j--; + printf("Entrez la ligne de la reine ('a'..'%c'): ", n - 1 + 'a'); + char ch[1]; + scanf("%s", ch); + couverture(n, n, board, ch[0] - 'a', r_j); + print(n, n, board); } -void print(int n,int m,piece board[n][m]) { - for (int i=n-1;i>=0;i--) { - printf("%c ",'a'+i); - for (int j=0;j<m;j++) { - switch(board[i][j]) { - case VULN: printf(" *"); break; - case SAFE : printf(" o"); break; - case QUEEN: printf(" R"); - } - } - printf("\n"); - } - printf("\n "); - for (int j=0;j<m;j++) { - printf(" %d",j+1); - } - printf("\n"); +void print(int n, int m, piece board[n][m]) { + for (int i = n - 1; i >= 0; i--) { + printf("%c ", 'a' + i); + for (int j = 0; j < m; j++) { + switch (board[i][j]) { + case VULN: + printf(" *"); + break; + case SAFE: + printf(" o"); + break; + case QUEEN: + printf(" R"); + } + } + printf("\n"); + } + printf("\n "); + for (int j = 0; j < m; j++) { + printf(" %d", j + 1); + } + printf("\n"); } -void couverture(int n,int m,piece board[n][m],int r_i,int r_j) { - for (int k=0;k<n;k++) { - board[k][r_j] = VULN; //colonne de la reine - } - for (int k=0;k<m;k++) { - board[r_i][k] = VULN; //ligne de la reine - int tmp = r_j-k; - if (0 <= r_i+tmp && r_i+tmp < n) { //diagonale montante - board[r_i+tmp][k] = VULN; - } - if (0 <= r_i-tmp && r_i-tmp < n) { //diagonale descendante - board[r_i-tmp][k] = VULN; - } - } - board[r_i][r_j] = QUEEN; +void couverture(int n, int m, piece board[n][m], int r_i, int r_j) { + for (int k = 0; k < n; k++) { + board[k][r_j] = VULN; // colonne de la reine + } + for (int k = 0; k < m; k++) { + board[r_i][k] = VULN; // ligne de la reine + int tmp = r_j - k; + if (0 <= r_i + tmp && r_i + tmp < n) { // diagonale montante + board[r_i + tmp][k] = VULN; + } + if (0 <= r_i - tmp && r_i - tmp < n) { // diagonale descendante + board[r_i - tmp][k] = VULN; + } + } + board[r_i][r_j] = QUEEN; } -void init(int n,int m,piece tab[n][m],piece pce) { - for (int i=0;i<n;i++) { - for (int j=0;j<m;j++) { - tab[i][j] = pce; - } - } +void init(int n, int m, piece tab[n][m], piece pce) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + tab[i][j] = pce; + } + } } diff --git a/source_codes/tableaux_2d/chess_queen_part.c b/source_codes/tableaux_2d/chess_queen_part.c index d3d3a91cd1dc35978b132fa0772b33bdb8a0ee9a..c8f99762bdd418cb5aa2083fb1319f353a6fab60 100644 --- a/source_codes/tableaux_2d/chess_queen_part.c +++ b/source_codes/tableaux_2d/chess_queen_part.c @@ -1,67 +1,72 @@ #include <stdio.h> #include <stdlib.h> -typedef enum _piece {SAFE, VULN, QUEEN} piece; +typedef enum _piece { SAFE, VULN, QUEEN } piece; -void print(int n,int m,cell tab[n][m]); -void init_board(int n,int m,cell tab[n][m]); -void couverture(int n,int m,cell tab[n][m],int r_x,int r_y); +void print(int n, int m, piece tab[n][m]); +void init_board(int n, int m, piece tab[n][m]); +void couverture(int n, int m, piece tab[n][m], int r_x, int r_y); void main() { - int n=8; - piece board[n][n]; - init(n,n,board,SAFE); - - print(n,n,board); - printf("Entrez la colonne de la reine (1..%d): ",n); - int r_j; - scanf("%d",&r_j); - r_j--; - printf("Entrez la ligne de la reine ('a'..'%c'): ",n-1+'a'); - char ch[1]; - scanf("%s",ch); - couverture(n,n,board,ch[0]-'a',r_j); - print(n,n,board); + int n = 8; + piece board[n][n]; + init(n, n, board, SAFE); + + print(n, n, board); + printf("Entrez la colonne de la reine (1..%d): ", n); + int r_j; + scanf("%d", &r_j); + r_j--; + printf("Entrez la ligne de la reine ('a'..'%c'): ", n - 1 + 'a'); + char ch[1]; + scanf("%s", ch); + couverture(n, n, board, ch[0] - 'a', r_j); + print(n, n, board); } -void print(int n,int m,piece board[n][m]) { - for (int i=n-1;i>=0;i--) { - printf("%c ",'a'+i); - for (int j=0;j<m;j++) { - switch(board[i][j]) { - case VULN: printf(" *"); break; - case SAFE : printf(" o"); break; - case QUEEN: printf(" R"); - } - } - printf("\n"); - } - printf("\n "); - for (int j=0;j<m;j++) { - printf(" %d",j+1); - } - printf("\n"); +void print(int n, int m, piece board[n][m]) { + for (int i = n - 1; i >= 0; i--) { + printf("%c ", 'a' + i); + for (int j = 0; j < m; j++) { + switch (board[i][j]) { + case VULN: + printf(" *"); + break; + case SAFE: + printf(" o"); + break; + case QUEEN: + printf(" R"); + } + } + printf("\n"); + } + printf("\n "); + for (int j = 0; j < m; j++) { + printf(" %d", j + 1); + } + printf("\n"); } -void couverture(int n,int m,piece board[n][m],int r_i,int r_j) { - //colonne de la reine - for (int k=0;k<n;k++) { - board[k][r_j] = VULN; - } - //ligne de la reine - for (int k=0;k<m;k++) { - board[r_i][k] = VULN; - } - //diagonale montante - for (int k=0;r_i+k<n && r_j+k<m;k++) { - board[r_i+k][r_j+k] = VULN; - } - //compléter les autres diagonales - - board[r_i][r_j] = QUEEN; +void couverture(int n, int m, piece board[n][m], int r_i, int r_j) { + // colonne de la reine + for (int k = 0; k < n; k++) { + board[k][r_j] = VULN; + } + // ligne de la reine + for (int k = 0; k < m; k++) { + board[r_i][k] = VULN; + } + // diagonale montante + for (int k = 0; r_i + k < n && r_j + k < m; k++) { + board[r_i + k][r_j + k] = VULN; + } + // compléter les autres diagonales + + board[r_i][r_j] = QUEEN; } -void init(int n,int m,piece tab[n][m],piece pce) { - // à compléter +void init(int n, int m, piece tab[n][m], piece pce) { + // à compléter }