controle
This commit is contained in:
192
main.c
Normal file
192
main.c
Normal file
@@ -0,0 +1,192 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Renvoie la racine carrée d'un nombre entier positif, sinon -1
|
||||
int racineCarre(int nb) {
|
||||
if (nb == 0 || nb == 1) return nb;
|
||||
|
||||
int prob = nb / 2;
|
||||
int nextProb;
|
||||
|
||||
while (1) {
|
||||
nextProb = (prob + nb / prob) / 2;
|
||||
|
||||
if (nextProb >= prob) {
|
||||
break;
|
||||
};
|
||||
|
||||
prob = nextProb;
|
||||
}
|
||||
|
||||
if ((prob * prob) == nb) {
|
||||
return prob;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Renvoie un tableau de racine carré de tab
|
||||
int* racineCarreTab(int tab[], int taille) {
|
||||
int* result = (int*)malloc(taille * sizeof(int));
|
||||
for (int i = 0; i < taille; i++) {
|
||||
result[i] = racineCarre(tab[i]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Renvoie un tableau tirer
|
||||
int* TriSpecial(int tab[], int taille) {
|
||||
int nonEntier = 0;
|
||||
for (int i = 0; i < taille; i++) {
|
||||
if (racineCarre(tab[i]) == -1) {
|
||||
nonEntier++;
|
||||
}
|
||||
}
|
||||
|
||||
int* result = (int*)malloc(taille * sizeof(int));
|
||||
|
||||
if (nonEntier % 2 == 0) {
|
||||
int somme = 0;
|
||||
for (int i = 0; i < taille; i++) {
|
||||
somme += tab[i]; // Calcul somme
|
||||
}
|
||||
|
||||
for (int i = 0; i < taille; i++) {
|
||||
if (i % 2 == 0) { // Pair
|
||||
result[i] = tab[i];
|
||||
} else { // Impair
|
||||
result[i] = somme * tab[i];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int* racines = (int*)malloc(taille * sizeof(int));
|
||||
int somme = 0;
|
||||
for (int i = 0; i < taille; i++) {
|
||||
racines[i] = racineCarre(tab[i]);
|
||||
somme += racines[i]; // Calcul somme
|
||||
}
|
||||
|
||||
for (int i = 0; i < taille; i++) {
|
||||
if (i % 2 == 0) { // Pair
|
||||
result[i] = racines[i];
|
||||
} else { // Impair
|
||||
result[i] = somme * tab[i];
|
||||
}
|
||||
}
|
||||
|
||||
free(racines);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
printf("========== Test racineCarre ==========\n");
|
||||
printf("racineCarre(9) = %d\n", racineCarre(9));
|
||||
printf("racineCarre(10) = %d\n", racineCarre(10));
|
||||
printf("\n");
|
||||
|
||||
printf("========== Test racineCarreTab ==========\n");
|
||||
int tab1[] = {9, 25, 4};
|
||||
int tab2[] = {10, 36, 2};
|
||||
|
||||
int* result1 = racineCarreTab(tab1, 3);
|
||||
printf("racineCarreTab([9, 25, 4]) = ");
|
||||
for (int i = 0; i < 3; i++) {
|
||||
printf("%d ", result1[i]);
|
||||
}
|
||||
printf("\n");
|
||||
free(result1);
|
||||
|
||||
int* result2 = racineCarreTab(tab2, 3);
|
||||
printf("racineCarreTab([10, 36, 2]) = ");
|
||||
for (int i = 0; i < 3; i++) {
|
||||
printf("%d ", result2[i]);
|
||||
}
|
||||
printf("\n\n");
|
||||
free(result2);
|
||||
|
||||
printf("========== Test TriSpecial ==========\n");
|
||||
int tab3[] = {3, 5, 25, 16};
|
||||
int* result3 = TriSpecial(tab3, 4);
|
||||
printf("TriSpecial([3, 5, 25, 16]) = ");
|
||||
for (int i = 0; i < 4; i++) {
|
||||
printf("%d ", result3[i]);
|
||||
}
|
||||
printf("\n");
|
||||
free(result3);
|
||||
|
||||
int tab4[] = {36, 9, 100, 2, 3, 7};
|
||||
int* result4 = TriSpecial(tab4, 6);
|
||||
printf("TriSpecial([36, 9, 100, 2, 3, 7]) = ");
|
||||
for (int i = 0; i < 6; i++) {
|
||||
printf("%d ", result4[i]);
|
||||
}
|
||||
printf("\n\n");
|
||||
free(result4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// int main(void) {
|
||||
// Racine carrée
|
||||
// printf("%d\n", racineCarre(9));
|
||||
// printf("%d\n", racineCarre(16));
|
||||
// printf("-----------------\n");
|
||||
// donne bien racineCarree(9) → 3 et racineCarree(10) → -1
|
||||
|
||||
// Racine carrée tab
|
||||
// int tab1[] = {9,25,4};
|
||||
// int tab2[] = {10,36,2};
|
||||
// int* result1 = racineCarreTab(tab1, 3);
|
||||
// int* result2 = racineCarreTab(tab2, 3);
|
||||
// for (int i = 0; i < 3; i++) {
|
||||
// printf("%d ", result1[i]);
|
||||
// }
|
||||
|
||||
// for (int i = 0; i < 3; i++) {
|
||||
// printf("%d ", result2[i]);
|
||||
// }
|
||||
|
||||
// Test profiler avec racineCarrreTab
|
||||
// int tab[10000];
|
||||
// for (int i = 0; i < 10000; i++) {
|
||||
// tab[i] = 1000000 + i;
|
||||
// }
|
||||
|
||||
// for (int repeat = 0; repeat < 10000; repeat++) {
|
||||
// int* a = racineCarreTab(tab, 10000);
|
||||
// free(a);
|
||||
// }
|
||||
|
||||
// Tri spéciale
|
||||
// int tab1[] = {3, 5, 25, 16};
|
||||
// int* result1 = TriSpecial(tab1, 4);
|
||||
// printf("Test 1 : ");
|
||||
// for (int i = 0; i < 4; i++) {
|
||||
// printf("%d ", result1[i]);
|
||||
// }
|
||||
// printf("\n");
|
||||
// free(result1);
|
||||
// // donne bien TriSpecial([3,5,25,16]) → [3,245,25,784]
|
||||
|
||||
// int tab2[] = {36, 9, 100, 2, 3, 7};
|
||||
// int* result2 = TriSpecial(tab2, 6);
|
||||
// printf("Test 2 : ");
|
||||
// for (int i = 0; i < 6; i++) {
|
||||
// printf("%d ", result2[i]);
|
||||
// }
|
||||
// printf("\n");
|
||||
// free(result2);
|
||||
// donne bien TriSpecial([36,9,100,2,3,7]) → [6,144,10,32,-1,112]
|
||||
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// gcc main.c -o app
|
||||
// ./app
|
||||
|
||||
// (Profiling)
|
||||
// gcc -pg main.c -o app
|
||||
// ./app
|
||||
// gprof "app.exe" gmon.out
|
Reference in New Issue
Block a user