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

Langage C++ Discussion :

Opérations dans un tableau à deux dimensions


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Par défaut Opérations dans un tableau à deux dimensions
    Salut à tous!
    Après votre soutien ans faille, j'ai pu avancer sérieusement dans la comprehension et la résolution des soucis concernant un bout de code que j'ai posté sur ce forum il y a peu.
    Je reviens une fois de plus avec un problème qui me freine depuis quelques jours déjà.
    Il s'agit des opérations sur un tableau à deux dimensions.
    Prenons une cellule quelconque du tableau. Cette cellule peut avoir trois résultats différents venant des opérations effectuées: Par exemple: On peut décider d'ajouter une unité à la valeur de la cellule de gauche, chercher la racine carrée de celle juste au dessus ou alors diviser la valeur de la cellule diagonale précédente par un nombre impair. La suite consiste à afficher le plus grand résultat provenant de ces trois opérations. Jusqu'ici, il n'y pas de problème. Là où le code devient intéressant et malheureusement compliqué est qu'il faut ensuite indiquer de quelle direction vient ce plus grand résultat(gauche, dessus ou diagonale). Il est à noter que chaque cellule est susceptible d'avoir un plus grand résultat différent des autres cellules. Pour pouvoir, indiquer de quel sens vient le plus grand résultat, j'ai pensé à uniformiser ce plus grand résultat. c'est à dire si ce plus grand vient de la cellule de gauche, j'écris 2 par exemple. S'il vient de la cellule au dessus, j'écris 1 et s'il vient de la diagonale, j'écris 3. C'est à ce niveau que mon code dérange. À la compilation, telle que les lignes 28, 32 et 36 sont écrites, les résultats sont bons et représentent les opérations sur les cellules correspondantes. Mais en remplaçant diag par 3 par exemple à la ligne 28, left par 2 à la ligne 32 et above par 1 à la ligne 36, les cellules n'affichent plus les vraies directions. C'est à dire on obtiendrait un 2 à la place de 1 ou 1 à la place de 3, puisqu'en comparant ces directions aux vrais résultats des opération, on voit qu'il n'a pas concordance. 3 par exemple indiquerait que le plus grand résultat vient de la diagonale précédente, tandis que 2 indiquerait que le plus grand résultat viendrait de la cellule de gauche..., donc ces chiffres indiqueraient non plus le plus grand résultat, mais de quelle direction vient ce grand résultat.

    Le problème donc se pose lorsque je change diag, left et above en chiffres.
    Pouvez-vous s'il vous plait jeter un coup d'œil sur mon code et m'aider à contourner cette difficulté?

    Je vous serai gré.

    Merci d'avance.


    Voici mon bout de code.

    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
    std::string str1 = "ABABA";
    	std::string str2 = "BBBBBAAA";
            double diag, left, above;
     
    	matrix<double> m (str1.size()+1, str2.size()+1);
     
     
    	for(size_t i=0;i<m.size1 ();++i){m(i,0)=i;}
    	for(size_t j=1;j<m.size2 ();++j){m(0,j)=j;}
     
    	for(size_t i=1;i<m.size1();++i){
    	for(size_t j=1;j<m.size2();++j){
    		if(str1[i-1] == str2[j-1])
                {
                    diag = m(i-1, j-1)+ 1;
                }
                else
                {
                    diag = m(i-1, j-1);
                }
     
                left = m(i-1, j) - 1;
                above = m(i, j-1) - 1;
     
           // Ici, je choisis le plus grand résultat.
           if(diag >= left && diag >= above)
                {
                    m(i, j) = diag;
                }
                else if(left >= diag && left >= above)
                {
                    m(i, j) = left; 
                }
                else if(above >= diag && above >= left)
                {
                    m(i, j) = above; 
                }
    	}}
     
    	//affichage
    	std::cout<<"    ";
    	for(size_t j=0;j<m.size2 ();++j){std::cout << str2[j] << " ";} std::cout << "\n";
     
    	for(size_t i=0;i<m.size1 ();++i){
     
    		if(i==0){		std::cout <<"  ";}
    		else{std::cout << str1[i-1]<<" ";}
     
     
    		for(size_t j=0;j<m.size2();++j){
    			std::cout << m(i,j)<<" ";
    		}
    		std::cout <<"\n";
    	}

  2. #2
    Invité
    Invité(e)
    Par défaut
    salut,

    t'es pas clair.
    Ta cellule elle contient quoi. Une valeur, ou la direction de la plus grande cellule aux alentours prise parmi diag, left, above?

    Car si elle contient une valeur (par exemple la plus grande des cellules aux alentours), alors par définition même, sa valeur ne correspondra pas à la direction.

    Tu n'as qu'à stocker un couple valeur/direction dans chaque cellule

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Par défaut
    Salut galerien69 et merci pour ta réponse.
    Après les calculs, chaque cellule contient une valeur, un nombre représentant le plus grand des trois qui proviennent des opérations. Je veux stocker la plus grande valeur de diag, left et above. Cela signifie que jusqu'ici, j'ai pris une valeur sur tois. Cette valeur prise peut venir de la cellule de gauche, diagonale ou du dessus. Ici, je veux identifier la direction de laquelle vient cette grande valeur. Si la cette grande valeur vient de la diagonale, alors au lieu de la conserver, j'écris plutot le chiffre 3. Si la grande valeur vient de gauche, alor sj'écris 2.... La grande valeur d'une cellule est differente de celle de l'autre, et c'est pourquoi il faut quelque chose pour désigner toute les grande valeur.
    Ton idée de stocker valeur/direction est pertinante, et je t eserai reconnaissant si tu me guidais un peu dans son implémentation. Je n'ai pas encore eu à stocker deux valeurs dans le meme cellule d'un tableau.

    Merci d'avance.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ben je me répète encore une fois t'es pas clair
    Je veux stocker la plus grande valeur de diag, left et above....
    Si la cette grande valeur vient de la diagonale, alors au lieu de la conserver.
    Donc après calcul de ta grille, que dois tu connaitre pour une cellule donnée.
    La valeur la plus grande de diag left et above?
    La direction?
    Les deux?

    Je n'ai pas encore eu à stocker deux valeurs dans le meme cellule d'un tableau.
    ben au pire tu fais deux tableaux. Un qui stocke la valeur, un qui stocke la direction

    Sinon, tu fais une structure pair pour stocker tes deux nombres ou en réutilises une (ex: std::pair<double, size_t>, ou size_t représente la direction) et tu fais une matrice de ta pair : matrix<std::pair<double, size_t> >).

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 48
    Par défaut
    Salut galerien69 et merci pour ta réponse.
    Je fais trois opération differente et je stocke le plus grand résultat dans la cellule (i, j). Pour deux cellules differentes, j'aurai donc 6 résultats differents (trois par cellule) et je vais choisir chaque fois le plus grand résultats. je veux en fin de compte la direction, qui doit etre déterminée par la position de la cellule ayant donné le grand résultat.

  6. #6
    Invité
    Invité(e)
    Par défaut
    je veux en fin de compte la direction, qui doit etre déterminée par la position de la cellule ayant donné le grand résultat.
    ok

    ben dans ce cas là tu ne peux te contenter de ne préserver que la direction.

    Donc il faut que tu stocke la valeur et la direction d'une itération à l'autre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre un fichier csv dans un tableau à deux dimensions
    Par neeux dans le forum Général Python
    Réponses: 5
    Dernier message: 05/03/2007, 16h36
  2. Réponses: 6
    Dernier message: 25/02/2007, 17h56
  3. Réponses: 9
    Dernier message: 05/01/2007, 20h04
  4. Rechercher dans un tableau deux dimensions
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 28/09/2006, 20h29
  5. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38

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