| |  |  | | Renix |  | Inördinaire |  | Dieu scandinave |  |  |  | 590 messages postés | 
 | |  Posté le 08-04-2004 à 02:25:22         
 
 |  | Voici le topic le plus long et le plus inutile de ce forum, soit la source complète de mon TP de programmation. Si vous avez à vous plaindre, dites-le à M. Maelstrom, c'est lui qui l'as voulu... 
 On prends un grand respire:
 
 //Auteur: Rémi Boucher
 //Travail Pratique #2 - Gestion de matériel informatique
 #include <iostream>
 #include <iomanip>
 #include <fstream>
 using namespace std;
 
 const int MAX=21,
 MAX_CHAR=31,
 MAX_COM=50;
 
 ofstream ecrire; //Pour éviter qu'il réecrive toujours par-dessus le fichier à chaque écriture
 
 void main(void) {
 int codeComposant[MAX], //Parallèle avec composant
 listeComposant[MAX_COM][MAX_COM] = {0}, //Parallèle avec compagnie
 nb, l=0, before=0;
 char composant[MAX][MAX_CHAR],
 compagnie[MAX_COM][MAX_CHAR];
 
 //Prototypes des fonctions
 int chargerTableau(int[], int[][MAX_COM], char[][MAX_CHAR], char[][MAX_CHAR], int *);
 void ecriture(int[], char[][MAX_CHAR], int, int *);
 void ecriture2(int[], char[][MAX_CHAR], int[][MAX_COM], char[][MAX_CHAR], int *, int *);
 void tri(int[], int[][MAX_COM], char[][MAX_CHAR], char[][MAX_CHAR], int *);
 void recherche(int[], int[][MAX_COM], char[][MAX_CHAR], char[][MAX_CHAR], int *);
 
 //Appelle la première fonction
 nb = chargerTableau(codeComposant, listeComposant, composant, compagnie, &l);
 
 //Affiche l'entête avec le nombre de composants et de fabricants
 cout << "Index des fabricants de composants informatiques par Remi Boucher"
 << endl
 << "Il y a " << nb << " composants et " << l << " compagnies." << endl;
 cout << "................................................................................"
 << endl;
 
 //Appelle les autres fonctions
 ecriture(codeComposant, composant, nb, &l);
 ecriture2(codeComposant, composant, listeComposant, compagnie, &l, &before);
 tri(codeComposant, listeComposant, composant, compagnie, &l);
 before = 1; //Dis à la fonction ecriture2 que le tri à été fait, pour modifier l'entête
 ecriture2(codeComposant, composant, listeComposant, compagnie, &l, &before);
 recherche(codeComposant, listeComposant, composant, compagnie, &l);
 }
 
 //Charge les tableaux à partir du fichier et retourne le nombre maximal d'entrées
 int chargerTableau(int codeComposant[], int listeComposant[][MAX_COM],
 char composant[][MAX_CHAR], char compagnie[][MAX_CHAR], int *l) {
 
 int i, j=0, k, m, n, longueur;
 char composantTemp[MAX_CHAR],
 composantTemp2[MAX_CHAR],
 nomTemp[MAX_CHAR],
 nomTemp2[MAX_CHAR];
 
 void delGuillemet(char[MAX_CHAR]);
 
 //Ouverture du fichier
 ifstream fichier;
 fichier.open("materiel.txt",ios::in);
 if (!fichier) {
 cerr << "Erreur ouverture fichiern";
 exit(1);
 }
 
 i=0;
 *l=0;
 //Première lecture
 fichier >> codeComposant  >> composantTemp;
 while (!fichier.eof() && (i<MAX) && (*l<MAX_COM)) {
 
 //Traite le nom des composants
 longueur = strlen(composantTemp);
 //Concatène les mots si le nom du composant en contient plusieurs
 if (composantTemp[longueur-1] != '"') {
 while (composantTemp[longueur-1] != '"') {
 fichier >> composantTemp2;
 strcat(composantTemp," ");
 strcat(composantTemp,composantTemp2);
 longueur = strlen(composantTemp);
 }
 }
 delGuillemet(composantTemp); //Appelle la fonction pour supprimer les guillemets
 strcpy(composant[i],composantTemp); //Copie le nom sans guillemet dans le tableau
 
 //Traite le nom des compagnies
 do {
 fichier >> nomTemp; //Première lecture
 strcpy(nomTemp2,nomTemp); //Copie vers une chaîne temporaire en cas de concaténage
 longueur = strlen(nomTemp);
 
 //Concatène les noms tant qu'ils ne finissent pas par ',' ou ';'
 while(nomTemp[longueur-1] != ',' && nomTemp[longueur-1] !=';') {
 fichier >> nomTemp;
 longueur = strlen(nomTemp);
 strcat(nomTemp2," ");
 strcat(nomTemp2,nomTemp);
 }
 longueur = strlen(nomTemp2);
 nomTemp2[longueur-1] = '';
 k=0;
 //Vérifie si la compagnie est déjà dans le tableau
 for (j=0;j<*l;j++) {
 if (strcmp(compagnie[j],nomTemp2) == 0)
 k=1;
 }
 if (k == 0) {
 strcpy(compagnie[*l],nomTemp2);
 (*l)++;
 }
 
 //Inscris les valeurs correspondantes dans listeComposant
 n=0;
 while (strcmp(compagnie[n],nomTemp2) != 0) {
 n++;
 }
 m = 0;
 while (listeComposant[n][m] != 0) {
 m++;
 }
 listeComposant[n][m] = codeComposant[i];
 
 longueur = strlen(nomTemp);
 }
 while(nomTemp[longueur-1] != ';');
 
 
 //Autre lecture
 i++;
 fichier >> codeComposant[i] >> composantTemp;
 }
 return i;
 }
 
 //Écris dans tp2.rap la liste des composants avec leur code
 void ecriture(int codeComposant[], char composant[][MAX_CHAR], int nb, int *l) {
 int i=0;
 
 //Initialisation du fichier d'écriture
 ecrire.open("tp2.rap",ios::out);
 if (!ecrire) {
 cerr << "Erreur ecriture fichiern";
 exit(1);
 }
 
 //Inscrit l'entête
 ecrire << "Index des fabricants de composants informatiques par Remi Boucher"
 << endl
 << "Il y a " << nb << " composants et " << *l << " compagnies." << endl;
 
 //Inscris le code et le nom des composants
 ecrire << endl << "Code " << "Nom du composant" << endl;
 for (i=0;i<nb;i++) {
 ecrire << codeComposant[i] << " " << composant[i] << endl;
 }
 }
 
 //Écris dans tp2.rap la liste des compagnies avec les composants qu'ils fabriquent et leur code
 void ecriture2(int codeComposant[], char composant[][MAX_CHAR], int listeComposant[][MAX_COM],
 char compagnie[][MAX_CHAR], int *l, int *before) {
 int i=0, j=0, k=0;
 
 //Change l'entête si le tri est effectué ou non
 if (*before == 0)
 ecrire << "nIndex des compagnies avant le trin" << endl;
 else
 ecrire << "nIndex des compagnies apres le trin" << endl;
 
 //Inscris les données
 for (i=0;i<*l;i++) {
 ecrire << compagnie[i] << endl;
 j=0;
 while (listeComposant[i][j] != 0) {
 ecrire << listeComposant[i][j];
 k=0;
 while (listeComposant[i][j] != codeComposant[k]) {
 k++;
 }
 j++;
 ecrire << " " << composant[k] << endl;
 }
 ecrire << endl;
 }
 //Ferme le fichier écrit si le tri est effectué
 if (*before == 1)
 ecrire.close();
 }
 
 //Tri les compagnies en ordre alphabétique tout en faisant suivre leurs tableaux respectifs
 void tri(int codeComposant[], int listeComposant[][MAX_COM],
 char composant[][MAX_CHAR], char compagnie[][MAX_CHAR], int *l) {
 int i, j, k, m, temp2;
 char temp[MAX_CHAR];
 
 for (i=0;i<*l;i++) {
 k=i;
 j=i+1;
 //Teste deux entrées du tableau
 while (j<*l) {
 if (stricmp(compagnie[j], compagnie[k])<0)
 k=j;
 j++;
 }
 //Effectue le changement
 strcpy(temp, compagnie[i]);
 strcpy(compagnie[i], compagnie[k]);
 strcpy(compagnie[k], temp);
 for (m=0;m<MAX;m++) {
 //Synchronise le 2e tableau avec le premier
 temp2 = listeComposant[i][m];
 listeComposant[i][m] = listeComposant[k][m];
 listeComposant[k][m] = temp2;
 }
 }
 }
 
 //Recherche les compagnies par leur première lettre, puis par leur nom complet
 //Affiche les composants que la compagnie trouvée fabrique
 void recherche(int codeComposant[], int listeComposant[][MAX_COM],
 char composant[][MAX_CHAR], char compagnie[][MAX_CHAR], int *l) {
 int i, j, k, m, n, o,
 longueur;
 char lettre[2], //Nécessaire que ce soit une chaîne pour vérifier avec stricmp()
 nom[MAX_CHAR];
 
 bool ok;
 
 //Première lecture de la lettre
 cout << "Interrogation de l'index des compagnies" << endl;
 cout << "Entrez la premiere lettre du nom de compagnie (0 pour terminer): ";
 cin >> lettre;
 while (strcmp(lettre,"0"
  != 0) { cout << endl;
 j=0;
 for (i=0;i<*l;i++) {
 //Compare le premier caractère des deux chaînes, sans prendre la casse en compte
 if (strnicmp(compagnie[i],lettre,1) == 0) {
 cout << compagnie[i] << endl;
 j++; //Indicateur de présence de compagnie
 }
 }
 
 //Si aucune compagnie commence par cette lettre
 if (j == 0) {
 cout << "Aucun nom ne commence par cette lettre" << endl;
 cout << "nEntrez la premiere lettre du nom de compagnie (0 pour terminer): ";
 cin >> lettre;
 }
 
 else {
 //Lecture du nom
 cout << "nEntrez le nom de compagnie desire en remplacant les espaces"
 << " par des tirets: ";
 cin >> nom;
 do {
 ok = false; //Indicateur d'erreur
 longueur = strlen(nom);
 //Remplace les tirets par des espaces
 for (k=0;k<longueur;k++) {
 if (nom[k] == '-')
 nom[k] = ' ';
 }
 m=0;
 while (stricmp(nom,compagnie[m]) != 0 && m<*l) {
 m++; //Trouve l'index de la compagnie dans le tableau
 }
 if (m != *l) {
 cout << endl;
 cout << compagnie[m] << endl;
 n=0;
 //Affiche le numéro du composant
 while (listeComposant[m][n] != 0) {
 cout << listeComposant[m][n];
 o=0;
 //Trouve le numéro d'index correspondant au numéro dans composant[][]
 while (codeComposant[o] != listeComposant[m][n]) {
 o++;
 }
 cout << " " << composant[o] << endl;
 n++;
 cout << "nEntrez la premiere lettre"
 << " du nom de compagnie (0 pour terminer): ";
 cin >> lettre;
 }
 }
 //Si le nom n'est pas trouvé
 else {
 cout << "Aucun nom trouve" << endl;
 cout << "nEntrez le nom de compagnie desire en remplacant les espaces"
 << " par des tirets: ";
 cin >> nom;
 ok = true; //Indicateur d'erreur activé
 }
 }
 while (ok);
 }
 }
 }
 
 //Supprime les guillemets du nom des composants
 void delGuillemet(char composantTemp[MAX_CHAR]) {
 int longueur,
 m;
 char nom[MAX_CHAR];
 
 longueur = strlen(composantTemp);
 
 //Décale tout les caractères pour supprimer le guillemet du début
 for (m=0;m<longueur;m++) {
 nom[m] = composantTemp[m+1];
 }
 strcpy(composantTemp,nom);
 
 //Supprime le guillement de la fin (le remplace par un caractère de fin de chaîne)
 longueur = strlen(composantTemp);
 composantTemp[longueur-1] = '';
 }
 
 10ko de bonheur, merci
 
 Message édité le 08-04-2004 à 02:25:59 par Renix
 
 --------------------
 You're free to be all that you want to - [i]Birdie
 | 
 |  | | Renix |  | Inördinaire |  | Dieu scandinave |  |  |  | 590 messages postés | 
 | |  Posté le 08-04-2004 à 02:26:29         
 
 |  | Ohh, comme vous êtes chanceux, il a même pas imbriqué 
 
 --------------------
 You're free to be all that you want to -  Birdie
 | 
 |  | | maelstrom |  | 9.8 m/s² qu\'y disent. poooooo sûr. |  | Membre de la gang |  |  |  | 557 messages postés | 
 | |  Posté le 08-04-2004 à 18:12:11       
 
 |  | té bin tata pourquoi tu upload pas le fichier compilé pis tu met pas un lien??? au moins on pourrait voir à quoi y sert ton prog sans se péter les yeux dedans   
 
 --------------------
 
   | 
 |  | | Renix |  | Inördinaire |  | Dieu scandinave |  |  |  | 590 messages postés | 
 | |  Posté le 08-04-2004 à 19:40:01         
 
 |  | Il sert absolument à rien, à part classer des données mises dans un fichier .txt 
 et si tu veux pas te péter les yeux, copie/colle dans Visual C++, tu vas voir plus clair
 
 
 --------------------
 You're free to be all that you want to -  Birdie
 | 
 |  | | maelstrom |  | 9.8 m/s² qu\'y disent. poooooo sûr. |  | Membre de la gang |  |  |  | 557 messages postés | 
 | |  Posté le 16-04-2004 à 16:14:42       
 
 |  | dans la suite du thread le plus long et inutile... 
 3...
 
 
 --------------------
 
   | 
 |  | | maelstrom |  | 9.8 m/s² qu\'y disent. poooooo sûr. |  | Membre de la gang |  |  |  | 557 messages postés | 
 | |  Posté le 16-04-2004 à 16:15:54       
 
 |  | 2... 
 
 --------------------
 
   | 
 |  | | maelstrom |  | 9.8 m/s² qu\'y disent. poooooo sûr. |  | Membre de la gang |  |  |  | 557 messages postés | 
 | |  Posté le 16-04-2004 à 16:16:55       
 
 |  | 1... 
 
 --------------------
 
   | 
 |  | | maelstrom |  | 9.8 m/s² qu\'y disent. poooooo sûr. |  | Membre de la gang |  |  |  | 557 messages postés | 
 | |  Posté le 16-04-2004 à 16:17:57       
 
 |  | wééé!! 500e message inutile du forum!!! 
 sortons les ptites trompettes qui font du bruit *
 
 
 --------------------
 
   | 
 |  |  | 
 |