Files
CONTROLE_DEV51_Creuzet/main.c

192 lines
4.7 KiB
C
Raw Normal View History

2025-10-15 17:23:39 +02:00
#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