Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.83 KB | None | 0 0
  1. /* ------------------------------------------------------------------------ */
  2. /**
  3. * \file Tp2.c
  4. * \brief Programme réalisant des recherches et des tris d'une
  5. * table de films chargée à partir d'un fichier.
  6. *
  7. * \author <indiquer ici votre nom et votre groupe>
  8. *
  9. * \date <indiquer ici la date du TP>
  10. *
  11. * \version 1.0
  12. *
  13. * \note NE PAS OUBLIER D'EFFECTUER CETTE OPERATION :
  14. * --------------------------------------------
  15. * Menu Projet/Propriétés de ...
  16. * puis dans la boite de dialoque développer à gauche
  17. * "Propriétés de configuration" et sélectionner "Général"
  18. * puis ans la rubrique "Jeu de caractères" choisissez
  19. * "Non défini" en lieu et place de "Utiliser le jeu de
  20. * caractères Unicode"
  21. *
  22. * \remark Le fichier utilisé doit être rangé dans le dossier
  23. * contenant ce fichier (Tp2.c)
  24. *
  25. */
  26.  
  27. /* ------------------------------------------------------------------------ */
  28. /* I N C L U D Es S T A N D A R Ds */
  29. /* ------------------------------------------------------------------------ */
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include <string.h>
  33. #include <math.h>
  34. #include <time.h>
  35.  
  36. #include <sys/types.h>
  37. #include <sys/timeb.h>
  38.  
  39. #if defined (_WIN32)
  40. #include <windows.h>
  41. #pragma comment(lib, "Ws2_32.lib")
  42. #elif defined (__unix__)
  43. #include <unistd.h>
  44. #include <netdb.h>
  45. #include <sys/socket.h>
  46. #include <netinet/in.h>
  47. #include <arpa/inet.h>
  48. #endif
  49.  
  50.  
  51. #if defined (_MSC_VER)
  52. /*
  53. * Sélection du niveau le plus élevé d'affichage des messages
  54. * d'avertissement
  55. */
  56. #pragma warning( push, 4 )
  57.  
  58. /*
  59. * Désactivation de l'affichage des messages d'avertissement liés à
  60. * l'utilisation de fonctions dépréciées par Visual C++ car remplacées
  61. * par des fonctions spécifiques plus sûres mais non standards
  62. */
  63. #pragma warning( disable : 4996 )
  64. #endif
  65.  
  66. /* ------------------------------------------------------------------------ */
  67. /* C O N S T A N T E S S Y M B O L I Q U E S */
  68. /* ------------------------------------------------------------------------ */
  69.  
  70.  
  71. #define FILENAME "Films.txt"
  72.  
  73. #define MAXLEN 256
  74. #define MAXFILENAME 64
  75. #define MAXFILMS 1000
  76. #define MAXNOM 40
  77. #define FILMS_PAR_PAGE 20
  78.  
  79.  
  80. #if defined(_WIN32)
  81.  
  82. #endif
  83.  
  84.  
  85. /* ------------------------------------------------------------------------ */
  86. /* D E F I N I T I O N S D E T Y P E S */
  87. /* ------------------------------------------------------------------------ */
  88.  
  89. typedef struct
  90. {
  91. char Titre[MAXNOM+1];
  92. char Genre[MAXNOM+1];
  93. unsigned int Annee;
  94. char Pays[MAXNOM+1];
  95. float Entrees;
  96. } T_Film ;
  97.  
  98.  
  99. /* ------------------------------------------------------------------------ */
  100. /* P R O T O T Y P E S D E F O N C T I O N S */
  101. /* ------------------------------------------------------------------------ */
  102. unsigned int Charger (const char *Filename, T_Film F[]);
  103. void Afficher (const T_Film F[], int n);
  104.  
  105. int Recherche_seq_Titre (const T_Film F[], int n, const char * pTitre );
  106. int Recherche_dicR_Entree (const T_Film F[], int Debut, int Fin, float Entree);
  107.  
  108. void Tri_Insertion_Titre (T_Film F[], int n);
  109.  
  110. void mergeSortByAnnee (T_Film F[], int n);
  111. void mergeSort_Annee (T_Film F[], int debut, int fin);
  112. void merge_Annee (T_Film F[], int debut, int milieu, int fin);
  113.  
  114. void test_Afficher (const T_Film F[], int n);
  115. void test_Recherche_seq_Titre (const T_Film F[], int n);
  116. void test_Recherche_dicR_Entree (const T_Film F[], int n);
  117. void test_Tri_Insertion_Titre (T_Film F[], int n);
  118. void test_mergeSort (T_Film F[], int n);
  119.  
  120. void epilogue(void);
  121.  
  122.  
  123. /* ------------------------------------------------------------------------ */
  124. /* V A R I A B L E S G L O B A L E S */
  125. /* ------------------------------------------------------------------------ */
  126. struct
  127. {
  128. unsigned long nbComparaisons;
  129. unsigned long nbAffectations;
  130. } resultat = {0L, 0L};
  131.  
  132. /* ------------------------------------------------------------------------ */
  133. /* F O N C T I O N P R I N C I P A L E */
  134. /* ------------------------------------------------------------------------ */
  135. int main(void)
  136. {
  137. T_Film Films[MAXFILMS] = {{""}}; /* Table des films */
  138. int nbFilms; /* Nombre de films */
  139. char fileName[] = FILENAME; /* Nom du fichiers des films */
  140.  
  141. atexit(epilogue);
  142. /* Initialisation du générateur de nombres aléatoires */
  143. srand((unsigned int)time(NULL));
  144.  
  145.  
  146. printf("Chargement du fichier \"%s\" ... ", fileName);
  147. nbFilms = Charger (fileName, Films);
  148. if (nbFilms == 0) return EXIT_FAILURE;
  149. printf("effectue.\n%d film(s) chargee(s) dans la table des films\n",
  150. nbFilms);
  151.  
  152. test_Afficher(Films, nbFilms);
  153.  
  154. test_Tri_Insertion_Titre(Films, nbFilms);
  155.  
  156. #if(0)
  157. test_Recherche_seq_Titre(Films, nbFilms);
  158. test_Recherche_dicR_Entree(Films, nbFilms);
  159. test_test_Tri_Insertion_Titre(Films, nbFilms);
  160. test_mergeSort(Films, nbFilms);
  161. #endif
  162.  
  163. return 0;
  164. }
  165.  
  166.  
  167. /* ------------------------------------------------------------------------ */
  168. /* F O N C T I O N S A C O M P L E T E R */
  169. /* ------------------------------------------------------------------------ */
  170. int Recherche_seq_Titre (const T_Film F[], int n, const char * pTitre )
  171. {
  172. int i=0, TEST;
  173. resultat.nbComparaisons=0;
  174. resultat.nbAffectations=0;
  175. while (i < n)
  176. {
  177. TEST = strcmp ( F[i].Titre , pTitre);
  178. if (TEST == 0)
  179. return i;
  180. resultat.nbComparaisons = resultat.nbComparaisons + 1;
  181. i = i+1;
  182. }
  183. return -1;
  184. }
  185.  
  186. /* ------------------------------------------------------------------------ */
  187. int Recherche_dicR_Entree (const T_Film F[], int Debut, int Fin, float Entree)
  188. {
  189. int Test, milieu;
  190. if ( Debut > Fin)
  191. return -1;
  192. milieu = (Debut + Fin) / 2;
  193. resultat.nbComparaisons = resultat.nbComparaisons + 1;
  194. if ( Entree == F[milieu].Entrees)
  195. return milieu;
  196. else
  197. {
  198. resultat.nbComparaisons = resultat.nbComparaisons + 1;
  199. if (F[milieu].Entrees < Entree)
  200. return Recherche_dicR_Entree ( F, milieu+1, Fin, Entree);
  201. else return Recherche_dicR_Entree ( F, Debut , milieu-1, Entree);
  202. }
  203. return -1;
  204. }
  205.  
  206.  
  207. /* ------------------------------------------------------------------------ */
  208. void Tri_Insertion_Titre (T_Film F[], int n)
  209. {
  210. int i, j;
  211. T_Film aux;
  212. for (i=0; i<n; i++)
  213. {
  214. aux = F[i];
  215. resultat.nbAffectations = resultat.nbAffectations +1;
  216. j=i;
  217. resultat.nbComparaisons = resultat.nbComparaisons +1;
  218. while (j > 0 && 0 > strcmp (aux.Titre, F[j-1].Titre))
  219. {
  220. F[j] = F[j-1];
  221. resultat.nbAffectations = resultat.nbAffectations +1;
  222. j--;
  223. }
  224. F[j] = aux;
  225. resultat.nbAffectations = resultat.nbAffectations +1;
  226. }
  227. }
  228.  
  229.  
  230.  
  231.  
  232. /* ------------------------------------------------------------------------ */
  233. T_Film aux[MAXFILMS / 2 + 2];
  234. void merge_Annee (T_Film F[], int d, int m, int f)
  235. {
  236. int i, j, k;
  237. memcpy (aux, &F[d], (f-d+1)*sizeof(T_Film));
  238. i=0; j=m-d+1; k=0;
  239. while (i<=m-d && j<=f-d)
  240. {
  241. resultat.nbComparaisons++;
  242. if (aux[i].Annee <= aux[j].Annee)
  243. {F[d+ k++] = aux[i++];
  244. resultat.nbAffectations++;}
  245. else {
  246. F[d + k++] = aux[j++];
  247. resultat.nbAffectations++;}
  248. }
  249. for (; i<= m-d; F[d+ k++] = aux [i++]);
  250. for (; j<= f-d; F[d+ k++] = aux [j++]);
  251. resultat.nbAffectations+=2;
  252.  
  253. }
  254.  
  255.  
  256. /* ------------------------------------------------------------------------ */
  257. /* F O N C T I O N S D E T E S T A C O M P L E T E R */
  258. /* ------------------------------------------------------------------------ */
  259.  
  260. void test_Recherche_dicR_Entree (const T_Film F[], int n)
  261. {
  262. int indice;
  263. float Entree;
  264. printf("Entrez le titre des films (. pour arreter)\n");
  265. while (1)
  266. {
  267. printf("Quel est le nombre d'entrees? ");
  268. scanf ("%f", &Entree);
  269. if (Entree == 0)
  270. return;
  271. memset(&resultat, 0, sizeof resultat);
  272. indice = Recherche_dicR_Entree (F, 0, n-1, Entree);
  273. if (indice == -1)
  274. printf("Il n'y a pas de film avec \"%s\" entrées\n", Entree);
  275. else
  276. Afficher(&F[indice], 1);
  277. printf("Nombre de comparaison(s) = %lu\n", resultat.nbComparaisons);
  278. }
  279. }
  280.  
  281.  
  282.  
  283. /* ------------------------------------------------------------------------ */
  284. void test_Tri_Insertion_Titre (T_Film F[], int n)
  285. {
  286.  
  287. memset(&resultat, 0, sizeof resultat);
  288.  
  289. printf("Liste des 10 premiers films tries:\n");
  290.  
  291. Tri_Insertion_Titre (F,n);
  292.  
  293. Afficher(F, n);
  294.  
  295. printf("Nombre de comparaison(s) = %lu\n", resultat.nbComparaisons);
  296. printf("Nombre de affectation(s) = %lu\n", resultat.nbAffectations);
  297.  
  298. }
  299. /* ------------------------------------------------------------------------ */
  300. void test_mergeSort (T_Film F[], int n)
  301. {
  302. /* À compléter */
  303. }
  304. /* ------------------------------------------------------------------------ */
  305. /* F O N C T I O N S M I S E S À D I S P O S I T I O N */
  306. /* ------------------------------------------------------------------------ */
  307. void test_Afficher (const T_Film F[], int n)
  308. {
  309. int indice;
  310.  
  311. /* Quelques exemples d'utilisation de la fonction d'affichage */
  312. printf("\nAffichage des 5 premiers films\n");
  313. Afficher(F, 5);
  314.  
  315. printf("\nAffichage des 3 derniers films\n");
  316. Afficher(&F[n - 3], 3);
  317.  
  318. indice = rand() % (n - 3);
  319. printf("\nAffichage de 3 films a partir du %deme film\n", indice + 1);
  320. Afficher(&F[indice], 3);
  321. }
  322.  
  323. /* ------------------------------------------------------------------------ */
  324. void test_Recherche_seq_Titre (const T_Film F[], int n)
  325. {
  326. int indice;
  327. char titre[MAXNOM + 1] = "";
  328. char *p;
  329.  
  330. printf("Entrez le titre des films (. pour arreter)\n");
  331. while (1)
  332. {
  333. printf("Quel film ? ");
  334. fgets(titre, sizeof titre, stdin);
  335. if ((p = strchr(titre, '\n')) != NULL)
  336. *p = '\0';
  337. else
  338. while (getc(stdin) != '\n');
  339.  
  340. if (titre [0] == '\0' || titre [0] == '.')
  341. return;
  342.  
  343. memset(&resultat, 0, sizeof resultat);
  344. indice = Recherche_seq_Titre (F, n, titre);
  345. if (indice == -1)
  346. printf("Le film \"%s\" est inconnue\n", titre);
  347. else
  348. Afficher(&F[indice], 1);
  349. printf("Nombre de comparaison(s) = %lu\n",
  350. resultat.nbComparaisons);
  351. }
  352. }
  353.  
  354.  
  355. /* ------------------------------------------------------------------------ */
  356. void mergeSortByAnnee(T_Film F[], int n)
  357. {
  358. mergeSort_Annee(F, 0, n - 1);
  359. }
  360.  
  361. void mergeSort_Annee(T_Film F[], int debut, int fin)
  362. {
  363. int milieu;
  364.  
  365. if (debut < fin)
  366. {
  367. milieu = (debut + fin) /2;
  368. mergeSort_Annee(F, debut, milieu);
  369. mergeSort_Annee(F, milieu + 1, fin);
  370. merge_Annee(F, debut, milieu, fin);
  371. }
  372. }
  373.  
  374. /* ------------------------------------------------------------------------ */
  375. /**
  376. * \brief Cette fonction charge le contenu d'un fichier texte contenant
  377. * des informations sur des films dans une table de films
  378. *
  379. * \param Filename nom du fichier contenant les informations
  380. * \param V la table recevant les informations sur les films.
  381. *
  382. * \return le nombre de films rangés dans la table. Zéro si l'ouverture
  383. * du fichier échoue, ou s'il est vide.
  384. *
  385. */
  386. unsigned int Charger (const char *Filename, T_Film F[])
  387. {
  388. FILE *fp_in;
  389. char Ligne [MAXLEN+1];
  390. char *p;
  391. int NoChamp;
  392. int NoFilm;
  393. T_Film film;
  394.  
  395. fp_in = fopen(Filename, "rt");
  396. if (fp_in == NULL)
  397. {
  398. fprintf(stderr, "\nOuverture du fichier %s impossible\n", Filename);
  399. return 0;
  400. }
  401.  
  402. /* Ignorer la 1ère ligne qui est la ligne de titre */
  403. fgets(Ligne, sizeof Ligne, fp_in);
  404.  
  405. for (NoFilm = 0; fgets(Ligne, sizeof Ligne, fp_in) != NULL;NoFilm++)
  406. {
  407. p = strtok(Ligne, "\n\t");
  408. memset(&film, 0, sizeof film);
  409. for ( NoChamp = 0; p != NULL; NoChamp++)
  410. {
  411. switch(NoChamp)
  412. {
  413. case 0: /* Titre du film */
  414. strcpy(film.Titre, p);
  415. break;
  416.  
  417. case 1: /* Genre du film */
  418. strcpy(film.Genre, p);
  419. break;
  420.  
  421. case 2: /* Année */
  422. sscanf(p, "%d", &film.Annee);
  423. break;
  424.  
  425. case 3: /* Pays du film */
  426. strcpy(film.Pays, p);
  427. break;
  428.  
  429. case 4: /* Nombre d'entrées en millions*/
  430. sscanf(p, "%f", &film.Entrees);
  431. break;
  432.  
  433. default: /* On ne devrait jamais atteindre ce cas */
  434. printf("\aErreur\n");
  435. break;
  436. } /* Fin du switch */
  437. p = strtok(NULL, "\n\t");
  438. } /* Fin du for (No ... */
  439. F[NoFilm] = film;
  440. }
  441. fclose(fp_in);
  442. return NoFilm;
  443. }
  444.  
  445. /* ------------------------------------------------------------------------ */
  446. /**
  447. * \brief Affiche sur l'écran les informations des n premiers films
  448. * rangés dans une table des films
  449. *
  450. * \param V tables de films (Titre, Genre, Année, Pays, Entrées)
  451. * \param n nombre de films à afficher
  452. *
  453. * \return néant
  454. *
  455. * \remark une pause est effectuée après l'affichage d'un certain
  456. * nombre de films
  457. *
  458. */
  459. void Afficher (const T_Film F[], int n)
  460. {
  461. int i;
  462.  
  463. printf(" +------------------------------+--------------------+------+------+--------+\n");
  464. printf(" | TITRE | GENRE |ANNEE | PAYS | ENTRRES|\n");
  465. printf(" +------------------------------+--------------------+------+------+--------+\n");
  466. for (i = 0; i < n ; i++)
  467. {
  468. printf(" | %-29s| %-18s | %4d | %-3s | %-2.2f |",
  469. F[i].Titre,
  470. F[i].Genre,
  471. F[i].Annee,
  472. F[i].Pays,
  473. F[i].Entrees);
  474.  
  475.  
  476. printf("\n");
  477.  
  478. if ((i+1) % FILMS_PAR_PAGE == 0)
  479. system("PAUSE");
  480. }
  481. printf(" +------------------------------+--------------------+------+------+--------+\n");
  482. }
  483.  
  484. /* ------------------------------------------------------------------------ */
  485. void epilogue(void)
  486. {
  487. static const char * jour[] = {
  488. "Dimanche", "Lundi", "Mardi", "Mercredi",
  489. "Jeudi", "Vendredi", "Samedi"};
  490.  
  491. static const char * mois[] = {
  492. "Janvier", "Fevrier", "Mars" , "Avril" , "Mai" , "Juin" ,
  493. "Juillet", "Aout" , "Septembre", "Octobre", "Novembre", "Decembre",
  494. };
  495.  
  496. time_t ltime;
  497. struct tm * today;
  498. char userName[MAXLEN + 1] = "";
  499. char hostName[MAXLEN + 1] = "";
  500. unsigned long name_len = MAXLEN + 1;
  501.  
  502. #if defined (_WIN32)
  503. WSADATA wsaData;
  504. #endif
  505.  
  506. struct hostent * pHostEntry;
  507. struct in_addr *pinAddr;
  508.  
  509. #if defined (_WIN32)
  510. WSAStartup(MAKEWORD(2,2), &wsaData);
  511. #endif
  512.  
  513. /* Nom de l'utilisateur */
  514. #if defined (_WIN32)
  515. GetUserName(userName, &name_len);
  516. #elif defined (__unix__)
  517. getlogin_r(userName,name_len);
  518. #endif
  519. printf("\n%-9.9s ", userName);
  520.  
  521. /* Nom de l'ordinateur */
  522. gethostname(hostName, MAXLEN);
  523.  
  524. /* Nom réseau et adresse IP de l'ordinateur */
  525. pHostEntry = gethostbyname(hostName);
  526. if (pHostEntry != NULL)
  527. {
  528. printf("%-13.10s ", pHostEntry->h_name);
  529. pinAddr = ((struct in_addr *)pHostEntry->h_addr_list[0]);
  530. if (pinAddr != NULL)
  531. printf("%s ", inet_ntoa(*pinAddr));
  532. }
  533.  
  534. /* Date et heure */
  535. tzset();
  536. time(&ltime);
  537. today = localtime(&ltime);
  538. printf("%9s %d %s %4d a %dh %dmn %ds\n",
  539. jour[today->tm_wday], today->tm_mday,
  540. mois[today->tm_mon], today->tm_year + 1900,
  541. today->tm_hour, today->tm_min, today->tm_sec);
  542.  
  543. #if defined (_WIN32)
  544. WSACleanup();
  545. #endif
  546. }
  547. /* ------------------------------------------------------------- THE END -- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement