IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[Debutant] Petit probleme d'initialisation


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut [Debutant] Petit probleme d'initialisation
    Bonjour a tous!

    Je suis nouveau sur le forum mais je le connait depuis un tit moment il m'as bien aider a me sortir de mes TP de C et de l'UML lol!

    Mais la j'ai un petit problème je voit pas trop comment le résoudre j'ai fait plusieurs test pour voir a quel moment je partais dans une boucle infinie mais j'ai pas trouvé. De plus hier soir il marchait trés bien lol!

    Le problème viendrai de mon initialisation des classes je pense. Bon après meme si ca fait quelque temps que je fait du C comme tout les ans on refait la meme chose (type de donnée, pointeur, fichier, ... ) donc je suis prenneur pour toute optimisation. Et aussi pour mieux le présenter sur le forum car la ca fait pas top ...

    Merci!

    Il s'agit d'un petit programme de tris Alphabétique fait sur Visual C++ :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    // Programme de Tri par ordre alphabétique
    //
     
    #include <stdio.h>
    #include <math.h>
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
     
    using namespace std;
     
    /*----------------------------------------------------------------------------*/
    //variables globales
    typedef struct {char mot[100][50]; int n;} tab;
    tab classe[25];
    tab tab_ntr, tab_tr;
     
    /*----------------------------------------------------------------------------*/
    //déclaration des fonctions
    void init_tableau();			//Initialisation des Tableaux trié et non trié
    void saisi();					//Saisi des mots par l'utilisateur
    void init_classes();			//Initialisation des classes
    void classement(int w);			//Rangement des mot par classes
    void vector();					//Mise en vecteur dans le tableau trié
    void affichage(tab tableau);	//Affiche le tableau passé en paramettre
    int test_saisi(char saisi[50]);
     
     
    /*----------------------------------------------------------------------------*/
    //programme principal
    int main()
    {
        //déclaration
        int nombre_etape=0, mot_plugr=0, i=0, j=0, w=1;
        char chaine[10];
     
        do
    	{
    		//intitialisation
    		system("cls");
    		init_tableau();
     
    		//saisi
    		saisi();
     
    		//nombre d'etape en trouvant la taille du mot le plus long
    		for(i=0; i<tab_ntr.n; i++)
    		{
    			if (nombre_etape < strlen(tab_ntr.mot[i]))
    				nombre_etape = strlen(tab_ntr.mot[i]);
    		}
     
    		//traitement
    		for(j=0; j<nombre_etape; j++)
    		{
    			init_classes();
    			classement(j);
    			vector();
    		}
     
    		//Affichage et comfirmation
    		do
    		{
    			//Affichage du tableau trié
    			system("cls");
    			cout<<"\n";
    			affichage(tab_tr);
    			cout<<endl<<endl;
     
    			//Et demande comfirmation pour fermer le programme ou réaliser un autre tri
    			cout<< "Terminer (fin) ou Continuer (tri) ?";
    			cin>>chaine;
     
    			//Vérification de validité de la chaine entrée
    			if(strcmp(chaine,"fin") != 0 && strcmp(chaine,"tri") != 0)
    				{
    					cout<<"\n" <<"  Choix impossible" <<"\n";
    					system("pause");
    				}
    		}while(strcmp(chaine,"fin") != 0 && strcmp(chaine,"tri") != 0 );
    	}while(strcmp(chaine,"tri") == 0 && strcmp(chaine,"fin") != 0);
    	return 0;
    }
     
    /*----------------------------------------------------------------------------*/
    void affichage(tab tableau)
    {
    	int i=0, j=0;
    	//récupération du nombre d'élément du tableau
    	tableau.n = tab_ntr.n;
    	//Balayage et affichage du tableau
    	for(i=0; i<tableau.n; i++)
    	{
    		cout<< " - "<<tableau.mot[i]<<endl;
    	}
    }
     
    /*----------------------------------------------------------------------------*/
    void init_classes()
    {
    	int i=0,j=0,k=0,x=0;
    	//Balayage des classe
    	for(i=0; i<26; i++)
    	{
       		//intialisation des compteur de mot des classes
    		classe[i].n = 0;
    		cout<<"classe : " <<i <<" " <<classe[i].n<<endl;
     
    		//Balayage de tout les mots de la classes pour remplir par des ' '
    		for(j=0; j<100; j++)
    		{
    			for(x=0; x<50; x++)
    			{
    				classe[i].mot[j][x] = ' ';
    			}
    		}
    		system("Pause");
    	}
    }
     
    /*----------------------------------------------------------------------------*/
    void vector()
    {
    	int i=0, k=0, x=0, j=0;
     
    	//Balayage des classes
    	for(i=0; i<26; i++)
    	{	
    		//Balayage des mots de la classe
         	for (k=0; k<classe[i].n; k++)
    		{
          		//Ecriture du mot dans le tableau trié
    			j=0;
    			while(classe[i].mot[k][j]!='\0')
          		{
          			tab_tr.mot[x][j] = classe[i].mot[k][j];
             		j++ ;
          		}
     
    			//Ajout du marqueur de fin de chaine de caractere
    			tab_tr.mot[x][j] = '\0';
    			x++;
    		}
    	}
    }
     
    /*----------------------------------------------------------------------------*/
    void saisi()
    {
    	char saisi[50] = {0};
    	int err=0, i=0;
     
    	//Boucle de saisi ; sorti si le mot entré est 'fin'
    	do
    	{
    		do
    		{
    			err = 0;
    			system("cls");
    			cout<< "-- taper 'fin' pour terminer la saisi -- "<<endl<<endl;
    			cout<<"mots deja entrée : "<<endl;
    			affichage(tab_ntr);
     
    			cout<<endl << "Saisir le ou les nouveaux mots :";
    			cin>>saisi;
     
    			err = test_saisi(saisi);
    			if(err == 1 && strcmp(saisi,"fin") != 0)
    			{
    				cout<<endl <<endl;
    				cout<<"-- Erreur dans la saisi : caractére non conforme -- " <<endl; 
    				cout<<"   ** Caratéres accepté : (A - Z) ou (a - z) **" <<endl <<endl <<endl;
    				system("Pause");
    			}
    		}while(err == 1);
     
    		//Detection que la saisi n'est pas 'fin'
    		if (strcmp(saisi,"fin") != 0)
    		{
    			//recopie de la chaine saisi par l'utilisateur
    			strcpy(tab_ntr.mot[tab_ntr.n], saisi);
    			strcpy(tab_tr.mot[tab_tr.n], saisi);
     
    			//incrémentation des compteurs
    			tab_tr.n++;
    			tab_ntr.n++;
    		}
    	}while (strcmp(saisi,"fin") != 0);
    }
     
    /*----------------------------------------------------------------------------*/
    void init_tableau()
    {
       int i, j;
     
       //Remise a zéro des compteurs
       tab_ntr.n = 0;
       tab_tr.n = 0;
     
       //Balayage de tout les mots pour les remplir par des ' '
       for(i=0; i<100; i++)
       {
    		for(j=0; j<50; j++)
    		{
    			tab_ntr.mot[i][j] = ' ';
    			tab_tr.mot[i][j] = ' ';
    		}
    	}
    }
     
    /*----------------------------------------------------------------------------*/
    void classement(int w)
    {
    	int nbre=0, i=0, j=0, save = 0;
     
    	save = w;	
    	//Balayage de tout les mot du tableau et rangement par classe
    	for(i=0; i<tab_tr.n; i++)
    	{
    		w = save;
    		//Calcul de l'emplacement de la lettre a vérifier en fonction de l'étape
    		w = (strlen(tab_tr.mot[i]) - w) - 1;
    		//On récupere la classe correspondante
    		nbre = tab_tr.mot[i][w];
     
    		//Si w < 0 on a deja vérifier toute les lettres du mot
    		if(w<0)
    		{
    			nbre = 0;
    		}
    		//Vérification si Majuscule ou Minuscule et calcul de la classe correspondante
    		else if(nbre >= 97 && nbre <= 122)
    		{
    			nbre = nbre - 97;
    		}
    		else if(nbre >= 65 && nbre <= 90)
    		{  	
    			nbre = nbre - 65;
    		}
     
    		//Ecriture du mot dans la classe
    		j=0;
    		while(tab_tr.mot[i][j]!='\0')
    		{
          		classe[nbre].mot[classe[nbre].n][j] = tab_tr.mot[i][j];
    			j++ ;
    		}
     
    		//Ajout du marqueur de fin de chaine de caractere
    		classe[nbre].mot[classe[nbre].n][j] = '\0';
    		//incrémentation du compteur de classe
    		classe[nbre].n++;
    	}
    }
     
    /*----------------------------------------------------------------------------*/
    int test_saisi(char saisi[50])
    {
    	int i=0;
    	//on compare tout les caracteres de la chaine
    	do
    	{
    		//Si caractére non comforme on retourne 1
    		if((saisi[i]<'a' || saisi[i]>'z') && (saisi[i]<'A' || saisi[i]>'Z'))
    		{
    			return 1;
    		}
    		i++;
    	}while(saisi[i]!='\0');
    	//Si tout les caractéres sont validés on retourne 0
    	return 0;
    }
    /*----------------------------------------------------------------------------*/

  2. #2
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    et bienvenue !

    Je n'ai pas regarder en détails ton algo mais je pense que comme tu utilise Visual du devrait exécuter ton application pas à pas en utilisant des break points (touche F9 + mode debug). Cela te permettrais de mieux cerner ton problème de boucle infinie.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    Merci a toi!

    sans trop regarder en detail si quelqu'un voit deja un petit trus dans ma fonction init_classes() ca serai sympas

    Disons j'utilise visual mais je suis pas un spécialiste du debug ... ^^ a vrai dire j'ai meme jamais fait lol ^^. je fait essayer les break point deja

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    Bon maintenant ca me fait plus de boucle infini ca m'efface le tableau qui suis comme si j'aller trop loin pour tant je pense avoir bien verifié mes conditions ...

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum

    Déjà, quelques remarques préliminaires sur le code en général:

      • stdio.h
      • string.h
      • stdlib.h

      sont autant de fichier d'en-têtes propre au C, ou en tout cas, antérieurs à la normes dont l'usage devrait être évité en C++

      Tu les remplacera avantageusement par string, sstream (éventuellement, pour les conversions) et iostream
      • strcmp
      • strcpy
      • toutes les fonctions str* en générale

      sont des fonctions essentiellement utilisée en C, dont il est très facile de s'affranchir en C++ (cf [4])
    1. La synthaxe
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      typedef struct {/*...*/}type;
      est typique du C.

      En C++, le fait de créer une structure qu'elle quelle soit (enum, union, struct ou class) déclare automatiquement un type correspondant au nom fourni.

      On peut donc se contenter d'un simple
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      struct nom_de_la_structure{/*...*/};
    2. La gestion de chaîne de caractères à la manière C est une source inépuisable de pièges à c:

      Que l'on essaye
      • de fournir trop de caractères
      • de transformer un nombre en chaine
      • de modifier dynamiquement la taille d'un tableau qui a été déclaré de manière statique
      • certains types de copie et de remplacement

      les occasions de faire une boulettes se rencontrent en permanence

      Le C++ fournit d'origine la classe string - disponible dans l'espace de nommage std grace à la directive #include <string> - qui est de nature à sécuriser grandement la gestion des chaînes de caractères.

      Elle peut même, en cas de besoin, fournir un tableau de caractères "C style" , et elle est particulièrement efficace, en conjonction avec les *stringstream, pour tout ce qui a trait à la conversion nombres<-->chaînes de caractères.

      S'il y a bien une chose dont l'excès ne nuit en rien, c'est sûrement l'utilisation de cette classe
    3. Même en C, on considère que les variables globales et les "nombres magiques", c'est mal...

      Du fait que le C++ est orienté objet, il y a parfaitement moyen de s'arranger pour qu'un type utilisateur (struct ou class) soit responsable des données qu'il utilise, en adjoignant des fonctions permettant d'utiliser ces variables et qui prennent pour l'occasion le doux noms de méthodes

      Autant que faire se peut, et comme tu as déjà touché à l'ULM, on peut se dire que "l'orienté objet" ne t'est pas tout à fait inconnu, il est conseillé de préférer cette approche à une approche "purement séquentielle"
    4. Il semblerait bon que tu réfléchisse à choisir une mise en forme du code qui te convient et que tu prenne l'habitude de la respecter de tous temps.

      Non seulement, une politique d'indentation stricte est de nature à faciliter la vie de ceux qui lisent ton code pour t'aider, mais, en plus, cela facilitera ta vie à toi quand tu voudra reprendre un code écrit trois mois plus tôt...:
      Citation Envoyé par la sagesse populaire
      Un code est plus souvent lu qu'il n'est écrit/modifié
      et de fait, avec les capacités de la plupart des éditeurs de textes actuels, il vaut sûrement mieux perdre éventuellement quelques secondes lors de l'écriture du code pour respecter sa politique de "mise en page", étant donné que c'est pour gagner un maximum de temps chaque fois que tu liras ton code (et encore plus si c'est quelqu'un qui en ignore tout qui le lit )


    Si, déjà, tu prend ces remarques en compte, m'est avis que tu devrais arriver à simplifier grandement tes algorithmes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    Oki merci pour ces conseils .

    Disons j'ai quelque notion de C et C++ mais c'est pas vraiment un matiere tres importante c'est pour ca qu'il y a bcp de mélange ...

    J'ai fait un petit mois de C++ puis 1ans de pause, Hop apres on m'as fait faire du C encore 1 mois histoire d'avoir de quoi ecrire au partiel :p oki de toute facon j'avais oublier lol. Apres hop UML mais bon on devai utiliser que du C... je sais pas pourquoi car le C n'est pas orienté objet, un choix de prof ca aussi plutot que de nous apprendre vraiment comment gérer tout ca. Et hop la j'ai un cours qui est un mélange de C et de C++ comme je viens de la constater lol.

    En tou cas merci.

    Bon j'ai l'impression que ca marche maintenant. Quelque petit bug mais je verra ca vendredi en TP.

Discussions similaires

  1. [debutant]petit probleme lors de la creation du VG (LVM)
    Par pierrot10 dans le forum Administration système
    Réponses: 0
    Dernier message: 06/08/2009, 13h31
  2. [DEBUTANT] Petit probleme
    Par ChRom dans le forum Débuter
    Réponses: 10
    Dernier message: 16/01/2007, 15h17
  3. [DEBUTANT] petit probleme de requete sql
    Par eclipse012 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2006, 15h10
  4. [Débutant] Petit problème pour calcul de somme
    Par kriskikout dans le forum Ada
    Réponses: 4
    Dernier message: 04/11/2006, 06h47
  5. petit probleme de debutant
    Par etudiant72 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/03/2006, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo