Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ------------------------------------------------------------------------ */
- /**
- * \file Tp2.c
- * \brief Programme réalisant des recherches et des tris d'une
- * table de films chargée à partir d'un fichier.
- *
- * \author <indiquer ici votre nom et votre groupe>
- *
- * \date <indiquer ici la date du TP>
- *
- * \version 1.0
- *
- * \note NE PAS OUBLIER D'EFFECTUER CETTE OPERATION :
- * --------------------------------------------
- * Menu Projet/Propriétés de ...
- * puis dans la boite de dialoque développer à gauche
- * "Propriétés de configuration" et sélectionner "Général"
- * puis ans la rubrique "Jeu de caractères" choisissez
- * "Non défini" en lieu et place de "Utiliser le jeu de
- * caractères Unicode"
- *
- * \remark Le fichier utilisé doit être rangé dans le dossier
- * contenant ce fichier (Tp2.c)
- *
- */
- /* ------------------------------------------------------------------------ */
- /* I N C L U D Es S T A N D A R Ds */
- /* ------------------------------------------------------------------------ */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include <time.h>
- #include <sys/types.h>
- #include <sys/timeb.h>
- #if defined (_WIN32)
- #include <windows.h>
- #pragma comment(lib, "Ws2_32.lib")
- #elif defined (__unix__)
- #include <unistd.h>
- #include <netdb.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #endif
- #if defined (_MSC_VER)
- /*
- * Sélection du niveau le plus élevé d'affichage des messages
- * d'avertissement
- */
- #pragma warning( push, 4 )
- /*
- * Désactivation de l'affichage des messages d'avertissement liés à
- * l'utilisation de fonctions dépréciées par Visual C++ car remplacées
- * par des fonctions spécifiques plus sûres mais non standards
- */
- #pragma warning( disable : 4996 )
- #endif
- /* ------------------------------------------------------------------------ */
- /* C O N S T A N T E S S Y M B O L I Q U E S */
- /* ------------------------------------------------------------------------ */
- #define FILENAME "Films.txt"
- #define MAXLEN 256
- #define MAXFILENAME 64
- #define MAXFILMS 1000
- #define MAXNOM 40
- #define FILMS_PAR_PAGE 20
- #if defined(_WIN32)
- #endif
- /* ------------------------------------------------------------------------ */
- /* D E F I N I T I O N S D E T Y P E S */
- /* ------------------------------------------------------------------------ */
- typedef struct
- {
- char Titre[MAXNOM+1];
- char Genre[MAXNOM+1];
- unsigned int Annee;
- char Pays[MAXNOM+1];
- float Entrees;
- } T_Film ;
- /* ------------------------------------------------------------------------ */
- /* P R O T O T Y P E S D E F O N C T I O N S */
- /* ------------------------------------------------------------------------ */
- unsigned int Charger (const char *Filename, T_Film F[]);
- void Afficher (const T_Film F[], int n);
- int Recherche_seq_Titre (const T_Film F[], int n, const char * pTitre );
- int Recherche_dicR_Entree (const T_Film F[], int Debut, int Fin, float Entree);
- void Tri_Insertion_Titre (T_Film F[], int n);
- void mergeSortByAnnee (T_Film F[], int n);
- void mergeSort_Annee (T_Film F[], int debut, int fin);
- void merge_Annee (T_Film F[], int debut, int milieu, int fin);
- void test_Afficher (const T_Film F[], int n);
- void test_Recherche_seq_Titre (const T_Film F[], int n);
- void test_Recherche_dicR_Entree (const T_Film F[], int n);
- void test_Tri_Insertion_Titre (T_Film F[], int n);
- void test_mergeSort (T_Film F[], int n);
- void epilogue(void);
- /* ------------------------------------------------------------------------ */
- /* V A R I A B L E S G L O B A L E S */
- /* ------------------------------------------------------------------------ */
- struct
- {
- unsigned long nbComparaisons;
- unsigned long nbAffectations;
- } resultat = {0L, 0L};
- /* ------------------------------------------------------------------------ */
- /* F O N C T I O N P R I N C I P A L E */
- /* ------------------------------------------------------------------------ */
- int main(void)
- {
- T_Film Films[MAXFILMS] = {{""}}; /* Table des films */
- int nbFilms; /* Nombre de films */
- char fileName[] = FILENAME; /* Nom du fichiers des films */
- atexit(epilogue);
- /* Initialisation du générateur de nombres aléatoires */
- srand((unsigned int)time(NULL));
- printf("Chargement du fichier \"%s\" ... ", fileName);
- nbFilms = Charger (fileName, Films);
- if (nbFilms == 0) return EXIT_FAILURE;
- printf("effectue.\n%d film(s) chargee(s) dans la table des films\n",
- nbFilms);
- test_Afficher(Films, nbFilms);
- test_Tri_Insertion_Titre(Films, nbFilms);
- #if(0)
- test_Recherche_seq_Titre(Films, nbFilms);
- test_Recherche_dicR_Entree(Films, nbFilms);
- test_test_Tri_Insertion_Titre(Films, nbFilms);
- test_mergeSort(Films, nbFilms);
- #endif
- return 0;
- }
- /* ------------------------------------------------------------------------ */
- /* F O N C T I O N S A C O M P L E T E R */
- /* ------------------------------------------------------------------------ */
- int Recherche_seq_Titre (const T_Film F[], int n, const char * pTitre )
- {
- int i=0, TEST;
- resultat.nbComparaisons=0;
- resultat.nbAffectations=0;
- while (i < n)
- {
- TEST = strcmp ( F[i].Titre , pTitre);
- if (TEST == 0)
- return i;
- resultat.nbComparaisons = resultat.nbComparaisons + 1;
- i = i+1;
- }
- return -1;
- }
- /* ------------------------------------------------------------------------ */
- int Recherche_dicR_Entree (const T_Film F[], int Debut, int Fin, float Entree)
- {
- int Test, milieu;
- if ( Debut > Fin)
- return -1;
- milieu = (Debut + Fin) / 2;
- resultat.nbComparaisons = resultat.nbComparaisons + 1;
- if ( Entree == F[milieu].Entrees)
- return milieu;
- else
- {
- resultat.nbComparaisons = resultat.nbComparaisons + 1;
- if (F[milieu].Entrees < Entree)
- return Recherche_dicR_Entree ( F, milieu+1, Fin, Entree);
- else return Recherche_dicR_Entree ( F, Debut , milieu-1, Entree);
- }
- return -1;
- }
- /* ------------------------------------------------------------------------ */
- void Tri_Insertion_Titre (T_Film F[], int n)
- {
- int i, j;
- T_Film aux;
- for (i=0; i<n; i++)
- {
- aux = F[i];
- resultat.nbAffectations = resultat.nbAffectations +1;
- j=i;
- resultat.nbComparaisons = resultat.nbComparaisons +1;
- while (j > 0 && 0 > strcmp (aux.Titre, F[j-1].Titre))
- {
- F[j] = F[j-1];
- resultat.nbAffectations = resultat.nbAffectations +1;
- j--;
- }
- F[j] = aux;
- resultat.nbAffectations = resultat.nbAffectations +1;
- }
- }
- /* ------------------------------------------------------------------------ */
- T_Film aux[MAXFILMS / 2 + 2];
- void merge_Annee (T_Film F[], int d, int m, int f)
- {
- int i, j, k;
- memcpy (aux, &F[d], (f-d+1)*sizeof(T_Film));
- i=0; j=m-d+1; k=0;
- while (i<=m-d && j<=f-d)
- {
- resultat.nbComparaisons++;
- if (aux[i].Annee <= aux[j].Annee)
- {F[d+ k++] = aux[i++];
- resultat.nbAffectations++;}
- else {
- F[d + k++] = aux[j++];
- resultat.nbAffectations++;}
- }
- for (; i<= m-d; F[d+ k++] = aux [i++]);
- for (; j<= f-d; F[d+ k++] = aux [j++]);
- resultat.nbAffectations+=2;
- }
- /* ------------------------------------------------------------------------ */
- /* 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 */
- /* ------------------------------------------------------------------------ */
- void test_Recherche_dicR_Entree (const T_Film F[], int n)
- {
- int indice;
- float Entree;
- printf("Entrez le titre des films (. pour arreter)\n");
- while (1)
- {
- printf("Quel est le nombre d'entrees? ");
- scanf ("%f", &Entree);
- if (Entree == 0)
- return;
- memset(&resultat, 0, sizeof resultat);
- indice = Recherche_dicR_Entree (F, 0, n-1, Entree);
- if (indice == -1)
- printf("Il n'y a pas de film avec \"%s\" entrées\n", Entree);
- else
- Afficher(&F[indice], 1);
- printf("Nombre de comparaison(s) = %lu\n", resultat.nbComparaisons);
- }
- }
- /* ------------------------------------------------------------------------ */
- void test_Tri_Insertion_Titre (T_Film F[], int n)
- {
- memset(&resultat, 0, sizeof resultat);
- printf("Liste des 10 premiers films tries:\n");
- Tri_Insertion_Titre (F,n);
- Afficher(F, n);
- printf("Nombre de comparaison(s) = %lu\n", resultat.nbComparaisons);
- printf("Nombre de affectation(s) = %lu\n", resultat.nbAffectations);
- }
- /* ------------------------------------------------------------------------ */
- void test_mergeSort (T_Film F[], int n)
- {
- /* À compléter */
- }
- /* ------------------------------------------------------------------------ */
- /* 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 */
- /* ------------------------------------------------------------------------ */
- void test_Afficher (const T_Film F[], int n)
- {
- int indice;
- /* Quelques exemples d'utilisation de la fonction d'affichage */
- printf("\nAffichage des 5 premiers films\n");
- Afficher(F, 5);
- printf("\nAffichage des 3 derniers films\n");
- Afficher(&F[n - 3], 3);
- indice = rand() % (n - 3);
- printf("\nAffichage de 3 films a partir du %deme film\n", indice + 1);
- Afficher(&F[indice], 3);
- }
- /* ------------------------------------------------------------------------ */
- void test_Recherche_seq_Titre (const T_Film F[], int n)
- {
- int indice;
- char titre[MAXNOM + 1] = "";
- char *p;
- printf("Entrez le titre des films (. pour arreter)\n");
- while (1)
- {
- printf("Quel film ? ");
- fgets(titre, sizeof titre, stdin);
- if ((p = strchr(titre, '\n')) != NULL)
- *p = '\0';
- else
- while (getc(stdin) != '\n');
- if (titre [0] == '\0' || titre [0] == '.')
- return;
- memset(&resultat, 0, sizeof resultat);
- indice = Recherche_seq_Titre (F, n, titre);
- if (indice == -1)
- printf("Le film \"%s\" est inconnue\n", titre);
- else
- Afficher(&F[indice], 1);
- printf("Nombre de comparaison(s) = %lu\n",
- resultat.nbComparaisons);
- }
- }
- /* ------------------------------------------------------------------------ */
- void mergeSortByAnnee(T_Film F[], int n)
- {
- mergeSort_Annee(F, 0, n - 1);
- }
- void mergeSort_Annee(T_Film F[], int debut, int fin)
- {
- int milieu;
- if (debut < fin)
- {
- milieu = (debut + fin) /2;
- mergeSort_Annee(F, debut, milieu);
- mergeSort_Annee(F, milieu + 1, fin);
- merge_Annee(F, debut, milieu, fin);
- }
- }
- /* ------------------------------------------------------------------------ */
- /**
- * \brief Cette fonction charge le contenu d'un fichier texte contenant
- * des informations sur des films dans une table de films
- *
- * \param Filename nom du fichier contenant les informations
- * \param V la table recevant les informations sur les films.
- *
- * \return le nombre de films rangés dans la table. Zéro si l'ouverture
- * du fichier échoue, ou s'il est vide.
- *
- */
- unsigned int Charger (const char *Filename, T_Film F[])
- {
- FILE *fp_in;
- char Ligne [MAXLEN+1];
- char *p;
- int NoChamp;
- int NoFilm;
- T_Film film;
- fp_in = fopen(Filename, "rt");
- if (fp_in == NULL)
- {
- fprintf(stderr, "\nOuverture du fichier %s impossible\n", Filename);
- return 0;
- }
- /* Ignorer la 1ère ligne qui est la ligne de titre */
- fgets(Ligne, sizeof Ligne, fp_in);
- for (NoFilm = 0; fgets(Ligne, sizeof Ligne, fp_in) != NULL;NoFilm++)
- {
- p = strtok(Ligne, "\n\t");
- memset(&film, 0, sizeof film);
- for ( NoChamp = 0; p != NULL; NoChamp++)
- {
- switch(NoChamp)
- {
- case 0: /* Titre du film */
- strcpy(film.Titre, p);
- break;
- case 1: /* Genre du film */
- strcpy(film.Genre, p);
- break;
- case 2: /* Année */
- sscanf(p, "%d", &film.Annee);
- break;
- case 3: /* Pays du film */
- strcpy(film.Pays, p);
- break;
- case 4: /* Nombre d'entrées en millions*/
- sscanf(p, "%f", &film.Entrees);
- break;
- default: /* On ne devrait jamais atteindre ce cas */
- printf("\aErreur\n");
- break;
- } /* Fin du switch */
- p = strtok(NULL, "\n\t");
- } /* Fin du for (No ... */
- F[NoFilm] = film;
- }
- fclose(fp_in);
- return NoFilm;
- }
- /* ------------------------------------------------------------------------ */
- /**
- * \brief Affiche sur l'écran les informations des n premiers films
- * rangés dans une table des films
- *
- * \param V tables de films (Titre, Genre, Année, Pays, Entrées)
- * \param n nombre de films à afficher
- *
- * \return néant
- *
- * \remark une pause est effectuée après l'affichage d'un certain
- * nombre de films
- *
- */
- void Afficher (const T_Film F[], int n)
- {
- int i;
- printf(" +------------------------------+--------------------+------+------+--------+\n");
- printf(" | TITRE | GENRE |ANNEE | PAYS | ENTRRES|\n");
- printf(" +------------------------------+--------------------+------+------+--------+\n");
- for (i = 0; i < n ; i++)
- {
- printf(" | %-29s| %-18s | %4d | %-3s | %-2.2f |",
- F[i].Titre,
- F[i].Genre,
- F[i].Annee,
- F[i].Pays,
- F[i].Entrees);
- printf("\n");
- if ((i+1) % FILMS_PAR_PAGE == 0)
- system("PAUSE");
- }
- printf(" +------------------------------+--------------------+------+------+--------+\n");
- }
- /* ------------------------------------------------------------------------ */
- void epilogue(void)
- {
- static const char * jour[] = {
- "Dimanche", "Lundi", "Mardi", "Mercredi",
- "Jeudi", "Vendredi", "Samedi"};
- static const char * mois[] = {
- "Janvier", "Fevrier", "Mars" , "Avril" , "Mai" , "Juin" ,
- "Juillet", "Aout" , "Septembre", "Octobre", "Novembre", "Decembre",
- };
- time_t ltime;
- struct tm * today;
- char userName[MAXLEN + 1] = "";
- char hostName[MAXLEN + 1] = "";
- unsigned long name_len = MAXLEN + 1;
- #if defined (_WIN32)
- WSADATA wsaData;
- #endif
- struct hostent * pHostEntry;
- struct in_addr *pinAddr;
- #if defined (_WIN32)
- WSAStartup(MAKEWORD(2,2), &wsaData);
- #endif
- /* Nom de l'utilisateur */
- #if defined (_WIN32)
- GetUserName(userName, &name_len);
- #elif defined (__unix__)
- getlogin_r(userName,name_len);
- #endif
- printf("\n%-9.9s ", userName);
- /* Nom de l'ordinateur */
- gethostname(hostName, MAXLEN);
- /* Nom réseau et adresse IP de l'ordinateur */
- pHostEntry = gethostbyname(hostName);
- if (pHostEntry != NULL)
- {
- printf("%-13.10s ", pHostEntry->h_name);
- pinAddr = ((struct in_addr *)pHostEntry->h_addr_list[0]);
- if (pinAddr != NULL)
- printf("%s ", inet_ntoa(*pinAddr));
- }
- /* Date et heure */
- tzset();
- time(<ime);
- today = localtime(<ime);
- printf("%9s %d %s %4d a %dh %dmn %ds\n",
- jour[today->tm_wday], today->tm_mday,
- mois[today->tm_mon], today->tm_year + 1900,
- today->tm_hour, today->tm_min, today->tm_sec);
- #if defined (_WIN32)
- WSACleanup();
- #endif
- }
- /* ------------------------------------------------------------- THE END -- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement