util.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961
  1. /*************************************/
  2. /* Auteur : Rémi Synave */
  3. /* Date de création : 01/03/07 */
  4. /* Date de modification : 15/03/15 */
  5. /* Version : 0.4 */
  6. /*************************************/
  7. /***************************************************************************/
  8. /* This file is part of a2ri. */
  9. /* */
  10. /* a2ri is free software: you can redistribute it and/or modify it */
  11. /* under the terms of the GNU Lesser General Public License as published */
  12. /* by the Free Software Foundation, either version 3 of the License, or */
  13. /* (at your option) any later version. */
  14. /* */
  15. /* a2ri is distributed in the hope that it will be useful, */
  16. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  17. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  18. /* GNU Lesser General Public License for more details. */
  19. /* */
  20. /* You should have received a copy of the GNU Lesser General Public */
  21. /* License along with a2ri. */
  22. /* If not, see <http://www.gnu.org/licenses/>. */
  23. /***************************************************************************/
  24. #include "util.h"
  25. /********** INTERMEDIATE TYPES AND FUNCTIONS **********/
  26. /* Les fonctions intermédiaires sont préfixées de IF */
  27. /* et les types intermédiaires de IT */
  28. int
  29. IFlist_int_etape_tri_rapide (
  30. int *t,
  31. int min,
  32. int max,
  33. int type)
  34. {
  35. int temp = t[max];
  36. while (max > min)
  37. {
  38. if (type == ASC)
  39. {
  40. while (max > min && t[min] <= temp)
  41. min++;
  42. }
  43. else
  44. {
  45. while (max > min && t[min] > temp)
  46. min++;
  47. }
  48. if (max > min)
  49. {
  50. t[max] = t[min];
  51. max--;
  52. if (type == ASC)
  53. {
  54. while (max > min && t[max] >= temp)
  55. max--;
  56. }
  57. else
  58. {
  59. while (max > min && t[max] < temp)
  60. max--;
  61. }
  62. if (max > min)
  63. {
  64. t[min] = t[max];
  65. min++;
  66. }
  67. }
  68. }
  69. t[max] = temp;
  70. return (max);
  71. }
  72. void
  73. IFlist_int_tri_rapide (
  74. int *t,
  75. int deb,
  76. int fin,
  77. int type)
  78. {
  79. int mil;
  80. if (deb < fin)
  81. {
  82. mil = IFlist_int_etape_tri_rapide (t, deb, fin, type);
  83. if (mil - deb > fin - mil)
  84. {
  85. IFlist_int_tri_rapide (t, mil + 1, fin, type);
  86. IFlist_int_tri_rapide (t, deb, mil - 1, type);
  87. }
  88. else
  89. {
  90. IFlist_int_tri_rapide (t, deb, mil - 1, type);
  91. IFlist_int_tri_rapide (t, mil + 1, fin, type);
  92. }
  93. }
  94. }
  95. int
  96. IFlist_double_etape_tri_rapide (
  97. double *t,
  98. int min,
  99. int max,
  100. int type)
  101. {
  102. double temp = t[max];
  103. while (max > min)
  104. {
  105. if (type == ASC)
  106. {
  107. while (max > min && t[min] <= temp)
  108. min++;
  109. }
  110. else
  111. {
  112. while (max > min && t[min] > temp)
  113. min++;
  114. }
  115. if (max > min)
  116. {
  117. t[max] = t[min];
  118. max--;
  119. if (type == ASC)
  120. {
  121. while (max > min && t[max] >= temp)
  122. max--;
  123. }
  124. else
  125. {
  126. while (max > min && t[max] < temp)
  127. max--;
  128. }
  129. if (max > min)
  130. {
  131. t[min] = t[max];
  132. min++;
  133. }
  134. }
  135. }
  136. t[max] = temp;
  137. return (max);
  138. }
  139. void
  140. IFlist_double_tri_rapide (
  141. double *t,
  142. int deb,
  143. int fin,
  144. int type)
  145. {
  146. int mil;
  147. if (deb < fin)
  148. {
  149. mil = IFlist_double_etape_tri_rapide (t, deb, fin, type);
  150. if (mil - deb > fin - mil)
  151. {
  152. IFlist_double_tri_rapide (t, mil + 1, fin, type);
  153. IFlist_double_tri_rapide (t, deb, mil - 1, type);
  154. }
  155. else
  156. {
  157. IFlist_double_tri_rapide (t, deb, mil - 1, type);
  158. IFlist_double_tri_rapide (t, mil + 1, fin, type);
  159. }
  160. }
  161. }
  162. /********** MAIN FUNCTIONS **********/
  163. /**
  164. Affiche un message d'erreur et stoppe le programme si la condition n'est pas satisfaite
  165. @param cond condition à satisfaire
  166. @param str message d'erreur à afficher dans le cas contraire
  167. @return aucun
  168. **/
  169. void
  170. a2ri_erreur_critique_si (
  171. int cond,
  172. const char * const str)
  173. {
  174. if (cond)
  175. {
  176. a2ri_printf_debug ("%s\n", str);
  177. exit (EXIT_FAILURE);
  178. }
  179. }
  180. /**
  181. Renvoie un entier compris entre min et max
  182. @param min valeur minimale
  183. @param max valeur maximale
  184. @return un entier
  185. **/
  186. int
  187. rand_int (
  188. int min,
  189. int max)
  190. {
  191. return ((((int) rand ()) % (max - min + 1)) + min);
  192. }
  193. /**
  194. Retourne la position de la valeur tosearch, -1 sinon
  195. @param list tableau d'entier
  196. @param size taille du tableau
  197. @param tosearch entier à chercher
  198. @return position de la première occurence, -1 s'il n'apparait pas dans le tableau
  199. */
  200. int
  201. list_int_contains (
  202. const int * const list,
  203. int size,
  204. int tosearch)
  205. {
  206. int i;
  207. for (i = 0; i < size; i++)
  208. if (list[i] == tosearch)
  209. return i;
  210. return -1;
  211. }
  212. /**
  213. Retourne la position de la valeur tosearch, -1 sinon
  214. @param list tableau de réels
  215. @param size taille du tableau
  216. @param tosearch réel à chercher
  217. @return position de la première occurence, -1 s'il n'apparait pas dans le tableau
  218. */
  219. int
  220. list_double_contains (
  221. const double * const list,
  222. int size,
  223. double tosearch)
  224. {
  225. int i;
  226. for (i = 0; i < size; i++)
  227. if (list[i] == tosearch)
  228. return i;
  229. return -1;
  230. }
  231. /**
  232. Clone la liste
  233. @param list la liste à cloner
  234. @param size taille de la liste
  235. @param list_clone liste clonée
  236. @return 1 si la liste est bien clonée, 0 sinon
  237. **/
  238. int
  239. list_int_clone (
  240. const int * const list,
  241. int size,
  242. int **list_clone)
  243. {
  244. (*list_clone) = (int *) malloc (size * sizeof (int));
  245. a2ri_erreur_critique_si (*list_clone == NULL,
  246. "erreur allocation memoire pour list_clone\nlist_int_clone");
  247. if ((*list_clone) == NULL)
  248. return 0;
  249. for (int i = 0; i < size; i++)
  250. (*list_clone)[i] = list[i];
  251. return 1;
  252. }
  253. /**
  254. Clone la liste
  255. @param list la liste à cloner
  256. @param size taille de la liste
  257. @param list_clone liste clonée
  258. @return 1 si la liste est bien clonée, 0 sinon
  259. **/
  260. int
  261. list_double_clone (
  262. const double * const list,
  263. int size,
  264. double **list_clone)
  265. {
  266. (*list_clone) = (double *) malloc (size * sizeof (double));
  267. a2ri_erreur_critique_si (*list_clone == NULL,
  268. "erreur allocation memoire pour list_clone\nlist_double_clone");
  269. if ((*list_clone) == NULL)
  270. return 0;
  271. for (int i = 0; i < size; i++)
  272. (*list_clone)[i] = list[i];
  273. return 1;
  274. }
  275. /**
  276. calcul de l'intersection de deux liste d'entier
  277. @param list1 premiere liste d'entier
  278. @param size1 taille de la premiere liste
  279. @param list2 seconde liste d'entier
  280. @param size2 taille de la seconde liste
  281. @param list_inter liste d'entier représentatnt l'intersection de list1 et list2
  282. @param size_list_inter taille de la liste d'intersection
  283. @return aucun
  284. */
  285. void
  286. list_int_intersection (
  287. const int * const list1,
  288. int size1,
  289. const int * const list2,
  290. int size2,
  291. int **list_inter,
  292. int *size_list_inter)
  293. {
  294. *list_inter = NULL;
  295. *size_list_inter = 0;
  296. for (int i = 0; i < size1; i++)
  297. {
  298. if (list_int_contains (list2, size2, list1[i]) != -1)
  299. list_int_add (list_inter,
  300. size_list_inter,
  301. list1[i],
  302. WITHOUT_REDUNDANCE);
  303. }
  304. }
  305. /**
  306. Ajoute l'entier toadd en fin de liste
  307. @param list pointeur sur le premier élément du tableau
  308. @param size pointeur sur la taille du tableau
  309. @param toadd entier à ajouter
  310. @param add_type WITH_REDUNDANCE ou WITHOUT_REDUNDANCE <BR> avec redondance : ajout simple <BR> sans redondance : ajout si la valeur n'apparait pas dans la liste
  311. @return 1 si succès, 0 sinon
  312. */
  313. int
  314. list_int_add (
  315. int **list,
  316. int *size,
  317. int toadd,
  318. int add_type)
  319. {
  320. if (add_type == WITHOUT_REDUNDANCE)
  321. if (list_int_contains (*list, *size, toadd) != -1)
  322. return 0;
  323. int *newlist = (int *) malloc (((*size) + 1) * sizeof (int));
  324. a2ri_erreur_critique_si (newlist == NULL,
  325. "erreur allocation memoire pour newlist\nlist_int_add");
  326. int i;
  327. for (i = 0; i < *size; i++)
  328. newlist[i] = (*list)[i];
  329. newlist[*size] = toadd;
  330. free (*list);
  331. (*list) = newlist;
  332. *size = (*size) + 1;
  333. return 1;
  334. }
  335. /**
  336. Ajoute le réel toadd en fin de liste
  337. @param list pointeur sur le premier élément du tableau
  338. @param size pointeur sur la taille du tableau
  339. @param toadd réel à ajouter
  340. @param add_type WITH_REDUNDANCE ou WITHOUT_REDUNDANCE <BR> avec redondance : ajout simple <BR> sans redondance : ajout si la valeur n'apparait pas dans la liste
  341. @return 1 si succès, 0 sinon
  342. */
  343. int
  344. list_double_add (
  345. double **list,
  346. int *size,
  347. double toadd,
  348. int add_type)
  349. {
  350. if (add_type == WITHOUT_REDUNDANCE)
  351. if (list_double_contains (*list, *size, toadd) != -1)
  352. return 0;
  353. double *newlist = (double *) malloc (((*size) + 1) * sizeof (double));
  354. a2ri_erreur_critique_si (newlist == NULL,
  355. "erreur allocation memoire pour newlist\nlist_double_add");
  356. int i;
  357. for (i = 0; i < *size; i++)
  358. newlist[i] = (*list)[i];
  359. newlist[*size] = toadd;
  360. free (*list);
  361. (*list) = newlist;
  362. *size = (*size) + 1;
  363. return 1;
  364. }
  365. /**
  366. Enlève la valeur à la position index
  367. @param list pointeur sur le premier élément du tableau
  368. @param size pointeur sur la taille du tableau
  369. @param index position de l'entier à supprimer
  370. @return 1 si succès, 0 sinon (cas où index>=size)
  371. */
  372. int
  373. list_int_remove (
  374. int **list,
  375. int *size,
  376. int index)
  377. {
  378. int *temp;
  379. if (index >= *size)
  380. return 0;
  381. if(*size==1)
  382. {
  383. free(*list);
  384. *size=0;
  385. *list=NULL;
  386. return 1;
  387. }
  388. for (int i = index; i < (*size) - 1; i++)
  389. (*list)[i] = (*list)[i + 1];
  390. temp = (int *) realloc (*list, ((*size) - 1) * sizeof (int));
  391. a2ri_erreur_critique_si (temp == NULL && *size != 0,
  392. "erreur allocation memoire pour temp\nlist_int_remove");
  393. *list=temp;
  394. *size = (*size) - 1;
  395. a2ri_erreur_critique_si (*list == NULL && *size != 0,
  396. "erreur allocation memoire pour list\nlist_int_remove");
  397. return 1;
  398. }
  399. /**
  400. Enlève la valeur à la position index
  401. @param list pointeur sur le premier élément du tableau
  402. @param size pointeur sur la taille du tableau
  403. @param index position du réel à supprimer
  404. @return 1 si succès, 0 sinon (cas où index>=size)
  405. */
  406. int
  407. list_double_remove (
  408. double **list,
  409. int *size,
  410. int index)
  411. {
  412. double *temp;
  413. if (index >= *size)
  414. return 0;
  415. if(*size==1)
  416. {
  417. free(*list);
  418. *size=0;
  419. *list=NULL;
  420. return 1;
  421. }
  422. for (int i = index; i < (*size) - 1; i++)
  423. (*list)[i] = (*list)[i + 1];
  424. temp = (double *) realloc (*list, ((*size) - 1) * sizeof (double));
  425. a2ri_erreur_critique_si (temp == NULL && *size != 0,
  426. "erreur allocation memoire pour temp\nlist_double_remove");
  427. *list=temp;
  428. *size = (*size) - 1;
  429. a2ri_erreur_critique_si (*list == NULL && *size != 0,
  430. "erreur allocation memoire pour list\nlist_double_remove");
  431. return 1;
  432. }
  433. /**
  434. Mélange la liste d'entier
  435. @param list tableau d'entier
  436. @param size taille du tableau
  437. @return aucun
  438. */
  439. void
  440. list_int_mix (
  441. int *list,
  442. int size)
  443. {
  444. int *list_clone = NULL,
  445. size_clone;
  446. list_int_clone (list, size, &list_clone);
  447. size_clone = size;
  448. for (int i = 0; i < size; i++)
  449. {
  450. int index = rand_int (0, size_clone - 1);
  451. list[i] = list_clone[index];
  452. list_int_remove (&list_clone, &size_clone, index);
  453. }
  454. }
  455. /**
  456. Mélange la liste de réel
  457. @param list tableau de réel
  458. @param size taille du tableau
  459. @return aucun
  460. */
  461. void
  462. list_double_mix (
  463. double *list,
  464. int size)
  465. {
  466. double *list_clone = NULL;
  467. int size_clone;
  468. list_double_clone (list, size, &list_clone);
  469. size_clone = size;
  470. for (int i = 0; i < size; i++)
  471. {
  472. int index = rand_int (0, size_clone - 1);
  473. list[i] = list_clone[index];
  474. list_double_remove (&list_clone, &size_clone, index);
  475. }
  476. }
  477. /**
  478. Affichage de la liste d'entier
  479. @param list tableau d'entier
  480. @param size taille du tableau
  481. @return aucun
  482. */
  483. void
  484. list_int_display (
  485. const int * const list,
  486. int size)
  487. {
  488. int i;
  489. if (size == 0)
  490. return;
  491. printf ("liste :\n%d", list[0]);
  492. for (i = 1; i < size; i++)
  493. printf (" - %d", list[i]);
  494. printf ("\n");
  495. }
  496. /**
  497. Affichage de la liste de réel
  498. @param list tableau de réel
  499. @param size taille du tableau
  500. @return aucun
  501. */
  502. void
  503. list_double_display (
  504. const double * const list,
  505. int size)
  506. {
  507. int i;
  508. if (size == 0)
  509. return;
  510. printf ("liste :\n%lf", list[0]);
  511. for (i = 1; i < size; i++)
  512. printf (" - %lf", list[i]);
  513. printf ("\n");
  514. }
  515. /**
  516. Inverse la liste d'entier
  517. @param list tableau d'entier
  518. @param size taille du tableau
  519. @return aucun
  520. */
  521. void
  522. list_int_reverse (
  523. int *list,
  524. int size)
  525. {
  526. int *listechang = (int *) malloc (size * sizeof (int));
  527. a2ri_erreur_critique_si (listechang == NULL,
  528. "erreur allocation memoire pour list\nlist_int_reverse");
  529. int i;
  530. for (i = 0; i < size; i++)
  531. listechang[i] = list[i];
  532. for (i = 0; i < size; i++)
  533. list[i] = listechang[size - 1 - i];
  534. free (listechang);
  535. }
  536. /**
  537. Inverse la liste de réel
  538. @param list tableau de réel
  539. @param size taille du tableau
  540. @return aucun
  541. */
  542. void
  543. list_double_reverse (
  544. double *list,
  545. int size)
  546. {
  547. double *listechang = (double *) malloc (size * sizeof (double));
  548. a2ri_erreur_critique_si (listechang == NULL,
  549. "erreur allocation memoire pour list\nlist_double_reverse");
  550. int i;
  551. for (i = 0; i < size; i++)
  552. listechang[i] = list[i];
  553. for (i = 0; i < size; i++)
  554. list[i] = listechang[size - 1 - i];
  555. free (listechang);
  556. }
  557. /**
  558. Décale la liste d'entier à droite de "shift" position(s)
  559. @param list tableau d'entier
  560. @param size taille du tableau
  561. @param shift nombre de décalage à droite
  562. @return aucun
  563. */
  564. void
  565. list_int_shift_right (
  566. int *list,
  567. int size,
  568. int shift)
  569. {
  570. int *listechang = (int *) malloc (size * sizeof (int));
  571. a2ri_erreur_critique_si (listechang == NULL,
  572. "erreur allocation memoire pour list\nlist_int_shift_right");
  573. int i;
  574. for (i = 0; i < size; i++)
  575. listechang[i] = list[i];
  576. for (i = 0; i < size; i++)
  577. list[i] = listechang[(i - shift + size) % size];
  578. free (listechang);
  579. }
  580. /**
  581. Décale la liste d'entier à gauche de "shift" position(s)
  582. @param list tableau d'entier
  583. @param size taille du tableau
  584. @param shift nombre de décalage à gauche
  585. @return aucun
  586. */
  587. void
  588. list_int_shift_left (
  589. int *list,
  590. int size,
  591. int shift)
  592. {
  593. int *listechang = (int *) malloc (size * sizeof (int));
  594. a2ri_erreur_critique_si (listechang == NULL,
  595. "erreur allocation memoire pour list\nlist_int_shift_left");
  596. int i;
  597. for (i = 0; i < size; i++)
  598. listechang[i] = list[i];
  599. for (i = 0; i < size; i++)
  600. list[i] = listechang[(i + shift) % size];
  601. free (listechang);
  602. }
  603. /**
  604. Décale la liste de réel à droite de "shift" position(s)
  605. @param list tableau de réel
  606. @param size taille du tableau
  607. @param shift nombre de décalage à droite
  608. @return aucun
  609. */
  610. void
  611. list_double_shift_right (
  612. double *list,
  613. int size,
  614. int shift)
  615. {
  616. double *listechang = (double *) malloc (size * sizeof (double));
  617. a2ri_erreur_critique_si (listechang == NULL,
  618. "erreur allocation memoire pour list\nlist_double_shift_right");
  619. int i;
  620. for (i = 0; i < size; i++)
  621. listechang[i] = list[i];
  622. for (i = 0; i < size; i++)
  623. list[i] = listechang[(i - shift + size) % size];
  624. free (listechang);
  625. }
  626. /**
  627. Décale la liste de réel à gauche de "shift" position(s)
  628. @param list tableau de réel
  629. @param size taille du tableau
  630. @param shift nombre de décalage à gauche
  631. @return aucun
  632. */
  633. void
  634. list_double_shift_left (
  635. double *list,
  636. int size,
  637. int shift)
  638. {
  639. double *listechang = (double *) malloc (size * sizeof (double));
  640. a2ri_erreur_critique_si (listechang == NULL,
  641. "erreur allocation memoire pour list\nlist_double_shift_left");
  642. int i;
  643. for (i = 0; i < size; i++)
  644. listechang[i] = list[i];
  645. for (i = 0; i < size; i++)
  646. list[i] = listechang[(i + shift) % size];
  647. free (listechang);
  648. }
  649. /**
  650. Trouve le plus petit entier de la liste
  651. @param list tableau d'entier
  652. @param size taille du tableau
  653. @return le plus petit entier
  654. */
  655. int
  656. list_int_min (
  657. const int * const list,
  658. int size)
  659. {
  660. int min = list[0];
  661. for (int i = 1; i < size; i++)
  662. if (list[i] < min)
  663. min = list[i];
  664. return min;
  665. }
  666. /**
  667. Trouve le plus grand entier de la liste
  668. @param list tableau d'entier
  669. @param size taille du tableau
  670. @return le plus grand entier
  671. */
  672. int
  673. list_int_max (
  674. const int * const list,
  675. int size)
  676. {
  677. int max = list[0];
  678. for (int i = 1; i < size; i++)
  679. if (list[i] > max)
  680. max = list[i];
  681. return max;
  682. }
  683. /**
  684. Trouve le plus petit réel de la liste
  685. @param list tableau de réel
  686. @param size taille du tableau
  687. @return le plus petit réel
  688. */
  689. double
  690. list_double_min (
  691. const double * const list,
  692. int size)
  693. {
  694. double min = list[0];
  695. for (int i = 1; i < size; i++)
  696. if (list[i] < min)
  697. min = list[i];
  698. return min;
  699. }
  700. /**
  701. Trouve le plus grand réel de la liste
  702. @param list tableau de réel
  703. @param size taille du tableau
  704. @return le plus grand réel
  705. */
  706. double
  707. list_double_max (
  708. const double * const list,
  709. int size)
  710. {
  711. double max = list[0];
  712. for (int i = 1; i < size; i++)
  713. if (list[i] > max)
  714. max = list[i];
  715. return max;
  716. }
  717. /**
  718. Calcul de la moyenne d'une liste d'entier
  719. @param list tableau d'entier
  720. @param size taille du tableau
  721. @return moyenne de la liste
  722. */
  723. double
  724. list_int_average (
  725. const int * const list,
  726. int size)
  727. {
  728. int somme = 0;
  729. for (int i = 0; i < size; i++)
  730. somme += list[i];
  731. return (somme * 1.0) / (size * 1.0);
  732. }
  733. /**
  734. Calcul de la variance d'une liste d'entier
  735. @param list tableau d'entier
  736. @param size taille du tableau
  737. @return variance de la liste
  738. */
  739. double
  740. list_int_variance (
  741. const int * const list,
  742. int size)
  743. {
  744. double moyenne = list_int_average (list, size),
  745. somme = 0;
  746. for (int i = 0; i < size; i++)
  747. somme += (list[i] - moyenne) * (list[i] - moyenne);
  748. return somme / (size * 1.0);
  749. }
  750. /**
  751. Calcul de la moyenne d'une liste de réel
  752. @param list tableau de réel
  753. @param size taille du tableau
  754. @return moyenne de la liste
  755. */
  756. double
  757. list_double_average (
  758. const double * const list,
  759. int size)
  760. {
  761. double somme = 0;
  762. for (int i = 0; i < size; i++)
  763. somme += list[i];
  764. return somme / (size * 1.0);
  765. }
  766. /**
  767. Calcul de la variance d'une liste de réel
  768. @param list tableau de réel
  769. @param size taille du tableau
  770. @return variance de la liste
  771. */
  772. double
  773. list_double_variance (
  774. const double * const list,
  775. int size)
  776. {
  777. double moyenne = list_double_average (list, size);
  778. double somme = 0;
  779. for (int i = 0; i < size; i++)
  780. somme += (list[i] - moyenne) * (list[i] - moyenne);
  781. return somme / (size * 1.0);
  782. }
  783. /**
  784. Tri de la liste d'entier
  785. @param list tableau d'entier
  786. @param size taille du tableau
  787. @param type ASC ou DESC : ordre croissant ou décroissant
  788. @return aucun
  789. */
  790. void
  791. list_int_sort (
  792. int *list,
  793. int size,
  794. int type)
  795. {
  796. IFlist_int_tri_rapide (list, 0, size - 1, type);
  797. }
  798. /**
  799. Tri de la liste de réel
  800. @param list tableau de réel
  801. @param size taille du tableau
  802. @param type ASC ou DESC : ordre croissant ou décroissant
  803. @return aucun
  804. */
  805. void
  806. list_double_sort (
  807. double *list,
  808. int size,
  809. int type)
  810. {
  811. IFlist_double_tri_rapide (list, 0, size - 1, type);
  812. }
  813. /**
  814. Initialisation à zéro d'un temps
  815. @param t pointeur vers un objet temps
  816. @return aucun
  817. */
  818. void
  819. a2ri_time_init (
  820. a2ri_time * t)
  821. {
  822. t->tv_sec = 0;
  823. t->tv_usec = 0;
  824. }
  825. /**
  826. Acquisition de l'heure actuelle
  827. @param t pointeur vers un objet temps
  828. @return aucun
  829. */
  830. a2ri_time
  831. a2ri_get_time (
  832. )
  833. {
  834. a2ri_time retour;
  835. gettimeofday (&retour, NULL);
  836. return retour;
  837. }
  838. /**
  839. Conversion d'un temps en double
  840. @param deb le temps inférieur
  841. @param fin le temps supérieur
  842. @return la conversion en double
  843. */
  844. double
  845. a2ri_time_interval_to_double (
  846. a2ri_time deb,
  847. a2ri_time fin)
  848. {
  849. return ((fin.tv_sec - deb.tv_sec) * 1.0) +
  850. ((fin.tv_usec - deb.tv_usec) / 1000000.0);
  851. }
  852. /**
  853. Affichage du temps séparant les deux variables en secondes
  854. @param debut borne de début
  855. @param fin borne de fin
  856. @return aucun
  857. */
  858. void
  859. a2ri_display_interval_time (
  860. const char * const str,
  861. a2ri_time deb,
  862. a2ri_time fin)
  863. {
  864. printf ("%s%lf\n",
  865. str,
  866. ((fin.tv_sec - deb.tv_sec) * 1.0) +
  867. ((fin.tv_usec - deb.tv_usec) / 1000000.0));
  868. }