ajout travail control machine kara-mosr
This commit is contained in:
193
EX1.c
Normal file
193
EX1.c
Normal file
@@ -0,0 +1,193 @@
|
||||
/*Je me suis pas super bien organise le fichierest long pour rien le main est trop long
|
||||
Je me suis lancer dans l'utilisation d'allocation et de pointeur ce qui etat peut etre pas necessaire
|
||||
j'ai essayer de commenter et de bien expliquer dans reponses.txt pour que ca reste comprehensible
|
||||
Et puis dans le main j'ai mis pas mal de printf qui devrait aider la comprehension a l'execution
|
||||
|
||||
Pour compiler :
|
||||
gcc -pg -o ex1 EX1.c
|
||||
./ex1
|
||||
gprof ./ex1
|
||||
|
||||
Riad Kara-Mostefa
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
int racineCarree(int n) {
|
||||
if (n < 0) return -1;
|
||||
if (n == 0 || n == 1) return n;
|
||||
|
||||
int i = 1;
|
||||
while (i <= n / i) {
|
||||
if ((n % i == 0) && (i == n / i)) {
|
||||
return i;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void racineCarreeTab(const int *in, int *out, size_t size) {
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
out[i] = racineCarree(in[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void affichageTab(const char *label, const int *t, size_t n) {
|
||||
printf("%s[", label);
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
if (i) printf(",");
|
||||
printf("%d", t[i]);
|
||||
}
|
||||
printf("]\n");
|
||||
}
|
||||
|
||||
|
||||
static void affichageTabLL(const char *label, const long long *t, size_t n) {
|
||||
printf("%s[", label);
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
if (i) printf(",");
|
||||
printf("%lld", t[i]);
|
||||
}
|
||||
printf("]\n");
|
||||
}
|
||||
|
||||
|
||||
void TriSpecial(const int *in, size_t n, long long *out) {
|
||||
if (!in || !out || n == 0) return;
|
||||
/*some original et some des racines*/
|
||||
long long SommeOrigine = 0;
|
||||
long long SommeSqrt = 0;
|
||||
size_t nbNonEntieres = 0;
|
||||
/* tab avec les racines carees*/
|
||||
int *roots = (int*)malloc(n * sizeof(int));
|
||||
if (!roots) {
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
int r = racineCarree(in[i]);
|
||||
SommeOrigine += (long long)in[i];
|
||||
SommeSqrt += (long long)r;
|
||||
if (r == -1) ++nbNonEntieres;
|
||||
}
|
||||
roots = NULL;
|
||||
} else {
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
int r = racineCarree(in[i]);
|
||||
roots[i] = r;
|
||||
SommeOrigine += (long long)in[i];
|
||||
SommeSqrt += (long long)r;
|
||||
if (r == -1) ++nbNonEntieres;
|
||||
}
|
||||
}
|
||||
|
||||
const int pair = ((nbNonEntieres % 2) == 0);
|
||||
|
||||
if (pair) {
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
if ((i % 2) == 0) out[i] = (long long)in[i];
|
||||
else out[i] = SommeOrigine * (long long)in[i];
|
||||
}
|
||||
} else {
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
if ((i % 2) == 0) {
|
||||
int r = roots ? roots[i] : racineCarree(in[i]);
|
||||
out[i] = (long long)r;
|
||||
} else {
|
||||
out[i] = SommeSqrt * (long long)in[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(roots);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
printf("EX1 : tests simples\n");
|
||||
printf("racineCarree(9) = %d\n", racineCarree(9));
|
||||
printf("racineCarree(10) = %d\n", racineCarree(10));
|
||||
|
||||
int t1[] = {9,25,4};
|
||||
int r1[3];
|
||||
racineCarreeTab(t1, r1, 3);
|
||||
affichageTab("racineCarreeTab([9,25,4]) = ", r1, 3);
|
||||
|
||||
int t2[] = {10,36,2};
|
||||
int r2[3];
|
||||
racineCarreeTab(t2, r2, 3);
|
||||
affichageTab("racineCarreeTab([10,36,2]) = ", r2, 3);
|
||||
|
||||
/* le gros tableau de test comme demande dans l'exo2 */
|
||||
printf("\nEX2 : gros tableau (racineCarreeTab) \n");
|
||||
const size_t N = 10000;
|
||||
int *big = (int*)malloc(sizeof(int) * N);
|
||||
int *res = (int*)malloc(sizeof(int) * N);
|
||||
/*je verifie l'allocation memeoire*/
|
||||
if (!big || !res) {
|
||||
fprintf(stderr, "Allocation echouee pour EX2\n");
|
||||
free(big); free(res);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* J'ai essaye de genere des carre parfait et des non-carres on va dire pour tester */
|
||||
for (size_t i = 0; i < N; ++i) {
|
||||
int base = 1000000 + (int)(i * 1237);
|
||||
if (i % 997 == 0) {
|
||||
int s = 2000 + (int)(i % 500);
|
||||
base = s * s;
|
||||
}
|
||||
big[i] = base;
|
||||
}
|
||||
|
||||
racineCarreeTab(big, res, N);
|
||||
printf("res (debut 10) = [");
|
||||
for (size_t i = 0; i < 10 && i < N; ++i) {
|
||||
if (i) printf(",");
|
||||
printf("%d", res[i]);
|
||||
}
|
||||
if (N > 10) printf(", ...]");
|
||||
printf("\n");
|
||||
|
||||
printf("\n EX3 : tests TriSpecial\n");
|
||||
{
|
||||
int a1[] = {3,5,25,16};
|
||||
long long out1[4];
|
||||
TriSpecial(a1, 4, out1);
|
||||
affichageTabLL("TriSpecial([3,5,25,16]) = ", out1, 4);
|
||||
}
|
||||
{
|
||||
int a2[] = {36,9,100,2,3,7};
|
||||
long long out2[6];
|
||||
TriSpecial(a2, 6, out2);
|
||||
affichageTabLL("TriSpecial([36,9,100,2,3,7]) = ", out2, 6);
|
||||
}
|
||||
|
||||
/* On utilise un gros tableau comme demandéé dans l'exo4 */
|
||||
printf("\nEX4 : gros tableau (TriSpecial)\n");
|
||||
/*la sortie pour le long tableau de gros elements*/
|
||||
long long *sortieLL = (long long*)malloc(sizeof(long long) * N);
|
||||
if (!sortieLL) {
|
||||
fprintf(stderr, "Allocation echouee pour EX4 (sortieLL)\n");
|
||||
free(big); free(res);
|
||||
return 1;
|
||||
}
|
||||
|
||||
TriSpecial(big, N, sortieLL);
|
||||
/*Je me suis dit que 10 elements suffisait pour voir si on a le resultat attendu donc j'en affiche que 10*/
|
||||
printf("TriSpecial(big) (debut 10) = [");
|
||||
for (size_t i = 0; i < 10 && i < N; ++i) {
|
||||
if (i) printf(",");
|
||||
printf("%lld", sortieLL[i]);
|
||||
}
|
||||
if (N > 10) printf(", ...]");
|
||||
printf("\n");
|
||||
|
||||
/* Nettoyage */
|
||||
free(sortieLL);
|
||||
free(big);
|
||||
free(res);
|
||||
|
||||
return 0;
|
||||
}
|
91
reponses.txt
Normal file
91
reponses.txt
Normal file
@@ -0,0 +1,91 @@
|
||||
|
||||
|
||||
----------------------------------------EX2---------------------------------------
|
||||
1-
|
||||
|
||||
racineCarree : Temps : 0.09s et on a 10 008 appels. Ca fait donc un temps moyen d'appel de 0.01ms
|
||||
|
||||
racineCarreeTab : avec grpof on nous dit que son temps d'execution est de 0s. On a 3 appels qui correspondent aux deux petits tableaux de test que j'ai dans mon main et au tableau
|
||||
avec 10 000 elements tous plus grand que 1 000 000. Si son temps d'execution est aussi cours c'est parce qu'on appelle racineCarree. Si on prend cela en compte on voit que
|
||||
racineCarreeTab s'execute sur 30s environ.
|
||||
|
||||
On a donc racineCarreeTab qui appel 10 006 fois racineCarree et les 2 autres sont dans le main avec les deux petits test que j'ai mis.
|
||||
|
||||
Pour resume on a racineCarreeTab qui ne consomme presque rien car tout est delegue a racineCareeTab qui est appele en boucle pour parcourir le tableau.
|
||||
|
||||
|
||||
|
||||
|
||||
2-
|
||||
Complexite cyclomatioque :
|
||||
|
||||
de racineCarree est de 5 car :
|
||||
1 "if (n < 0)"
|
||||
|
||||
2 "if (n == 0 || n == 1) "
|
||||
|
||||
3 "while (i <= n / i)"
|
||||
|
||||
4 "if ((n % i == 0) && (i == n / i))"
|
||||
|
||||
de racineCareeTab est de 2 car on a que la boucle for :
|
||||
La boucle "for (k = 0; k < size; ++k)"
|
||||
|
||||
|
||||
Complexite Algorithmique :
|
||||
|
||||
---------de racineCarree : O(√n)-------------
|
||||
Si n n’est pas un carré parfait : on ne retourne pas avant la fin. Donc la boucle fait exactement ⌊√n⌋ itérations, puis on sort et on renvoie -1
|
||||
|
||||
Si n est un carré parfait : on retourne à i = √n donc la boucle fait √n itérations (la dernière est celle qui trouve la racine)
|
||||
|
||||
Dans tous les cas, le nombre d’itérations est proportionnel à √n
|
||||
|
||||
-------- de racineCarreeTab dépend ----------
|
||||
|
||||
du nombre d’éléments dans le tableau qu'on note m
|
||||
|
||||
du temps d’exécution de racineCarree() pour chaque élément
|
||||
|
||||
Et Puisque racineCarreeTab appelle racineCarree() m fois (une fois par élément du tableau) le coût total est la somme des coûts de chaque appel :
|
||||
|
||||
On va regarder le pire, c'est celui ou tous les elements du tableau sont proche de l'element le plus grand. Par exemple dans notre exemple avec des valeurs > 1 000 000.
|
||||
On peut dire que toutes les valeurs sont proches de la plus grandes car a cette echelle de grandeur la difference est minim. On peut donc dire que dans le pire des cas
|
||||
la complexite est dependante du max (la plus grande valeurs) et du nombre d'appels a la fonction racineCarree
|
||||
on a comme complexite : O(m * √max)
|
||||
|
||||
|
||||
|
||||
----------------------------EX4--------------------------------
|
||||
La complexite cyclomatique de TriSpecial :
|
||||
|
||||
1 : if (!in || !out || n == 0)
|
||||
|
||||
2 : if (!roots)
|
||||
|
||||
3 : for (...) (branche !roots)
|
||||
|
||||
4 : if (r == -1) (branche !roots)
|
||||
|
||||
5 : for (...) (branche else)
|
||||
|
||||
6 : if (r == -1) (branche else)
|
||||
|
||||
7 : if (pair)
|
||||
|
||||
8 : for (...) (branche pair)
|
||||
|
||||
9 : if (i % 2 == 0) (branche pair)
|
||||
|
||||
10 : for (...) (branche impair)
|
||||
|
||||
11 : if (i % 2 == 0) (branche impair)
|
||||
|
||||
Donc on a une complexite de 12 pour TriSpecial
|
||||
|
||||
La complexite cyclomatique de TriSpecial :
|
||||
|
||||
C'est le meme principe que racineCarreeTab et ca depend du nombre d'appel et de l'element le plus grand
|
||||
|
||||
On a O(N * √M) ou est M est le plus grand nombre et N le nombre d'appel.
|
||||
|
Reference in New Issue
Block a user