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

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Vérifier que deux lignes ou colonnes soient égales dans un tableau
    Bonjour tout le monde !

    Je débute depuis quelques temps le langage C, et j'aurais besoin de votre aide pour un exercice dans lequel je suis bloqué :

    J'ai un tableau d'entiers 2D dans lequel on a par exemple |2|5|4|8| / |3|5|2|1| / |2|5|4|8| le but de l'exercice est de créer une fonction qui vérifie si le tableau a les même lignes et colonnes. Je me penche à procéder de cette façon : créer la fonction qui prendra en paramètre le fameux tableau 2D puis "transformer" ce tableau 2D en deux tableaux 1D (en créant deux autres tableaux, un pour les lignes et un pour les colonnes) dans lequel on aurait |2548||3521||2548| pour les lignes.

    Ainsi je pourrais vérifier si par exemple j'ai : tab1D[i] == tab1D[i+2] (pour les lignes)

    Le seul soucis c'est que je ne sais pas comment je dois procéder pour prendre tous les éléments de la première ligne du tableau 2D pour ensuite les concaténer puis les affecter dans la première case du tableau 1D. De plus je ne sais pas non plus créer un autre tableau 1D où j'ai |232||555||424||818| pour vérifier si j'ai les bonnes colonnes.

    Je vous remercie par avance pour votre aide !

  2. #2
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 017
    Points : 6 700
    Points
    6 700
    Par défaut
    Tu veux un secret


    Ton tableau est stocké en mémoire en tableau 1D. Et donc, pour un tableau 2D, il est stocké les lignes mises bout à bout.
    Et n'oublie pas que l'identifiant de ton tableau est le pointeur de la première case (indice 0)

    Donc :
    • tab[i] est équivalent à *(tab + i)
    • tab[i][j] est équivalent à tab[i * nb_columns + j]
    • tab[i][j] est équivalent à *(tab + i * nb_columns + j)


  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Salut merci de ta réponse !

    Je comprends ce que tu veux dire mais je ne sais néanmoins pas où est ce que tu veux en venir
    Le pointeur de mon tableau correspond à sa première case indice 0 là où je dois mettre chaque case (qui contient un chiffre) du tableau 2D concaténé.
    Peux-tu m'en dire un peu plus ?

  4. #4
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 017
    Points : 6 700
    Points
    6 700
    Par défaut
    Citation Envoyé par NightPhantom Voir le message
    Je comprends ce que tu veux dire mais je ne sais néanmoins pas où est ce que tu veux en venir
    Le pointeur de mon tableau correspond à sa première case indice 0 là où je dois mettre chaque case (qui contient un chiffre) du tableau 2D concaténé.
    Peux-tu m'en dire un peu plus ?
    Parce que tu t'y prends mal (si je comprends bien ton exercice)

    Il ne faut pas créer des tableaux, ce sont juste 2 boucles imbriquées.

    Pour vérifier les colonnes : Pour index_column qui va de 0 à (nb_column - 1) il faut que tab[index_row][index_column] soit égal à tab[index_row + 1][index_column]
    Pour vérifier les lignes: Pour index_row qui va de 0 à (nb_row - 1) il faut que tab[index_row][index_column] soit égal à tab[index_row][index_column + 1]

    Ton exercice ne me plait pas (*), mais peut-être qu'en utilisant les pointeurs on peut simplifier les accès/ la double boucle : il faudrait réfléchir/ tester


    * : pour moi, un tableau qui a les mêmes lignes et les mêmes colonnes (donc en même temps), c'est une matrice carrée avec la même valeur.
    Donc, (si nb_column est égal à nb_row ), tu fais cela en 1 seule boucle qui parcourt toute ta matrice (de 0 à (nb_row * nb_row - 1)) en testant que tab[index] soit égal à tab[0] (<- tu peux rajouter le test dans la condition de la boucle, ce qui fait 1 ligne de code)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ça y est je viens d'avoir le déclic !
    Donc pour comparer par exemple les lignes dans un tableau carré j'ai fait :

    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
     
     
    int check_row(int* tab, int* nbr_row) 
    {
       for(int row = 0; row < *nbr_row-1 ; row++)
       {
           for(int following = row+1 ; following < *nbr_row-1 ; following++)
           {
     
                for(int col = 0; col < *nbr_row-1 ; col++)
                {
                   if tab[row][col] == tab[following][col])
                   {
                        return 1;
                   }
                   else
                   {
                        return 0;
                   }
                }
           }
        }
    }
    j'ai mis nbr row en paramètre de sorte qu'on peut choisir la taille du tableau : si nbr_row = 6 on aura alors un tableau 6x6
    Néanmoins le compilateur m'affiche deux erreurs : "error subscripted value is neither array nor pointer nor vector" ce qui est étrange car j'ai mis *tab en paramètre
    et en warning "control reaches end of non-void function" ce qui est aussi étrange car je retourne un entier

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 487
    Points : 21 314
    Points
    21 314
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par NightPhantom Voir le message
    Ça y est je viens d'avoir le déclic !
    Pas tout à fait...

    Citation Envoyé par NightPhantom Voir le message
    Donc pour comparer par exemple les lignes dans un tableau carré j'ai fait :
    Tu n'as comparé que la première case !!!

    Quand on travaille sur des ensembles de trucs (un tableau est un ensemble de cases) et qu'on veut vérifier si l'ensemble répond à une propriété précise (ici l'ensemble 1 égal à l'ensemble 2), il faut alors partir du principe qu'il répond par défaut et chercher un cas qui n'y répond pas. Si tu ne le trouves pas, alors il y répond réelleemnt.

    Donc pour vérifier si deux tableaux sont égaux, tu considères qu'il le sont et tu cherches une différence => ça correspond presque à ce que tu as fait... sauf que le return 1 doit se mettre à la fin de la boucle de test.

    Citation Envoyé par NightPhantom Voir le message
    Néanmoins le compilateur m'affiche deux erreurs : "error subscripted value is neither array nor pointer nor vector" ce qui est étrange car j'ai mis *tab en paramètre
    Un int *tab correspond à un tableau 1D et ne peut pas s'assimiler à un tableau 2D. Et un int **tab ne peut pas marcher car sans repère sur les dimensions initiales, le C ne sait pas comment se caler pour s'adresser à une case en [x][y] (ou plus). Ce qu'indique foetus quand il te donne les règles de transformation 2D vers 1D. Accessoirement tu peux faire un essai : tu dessines sur un papier quadrillé un tableau rectangulaire, tu places un "X" sur une des cases, puis tu redessines le même tableau mais cette fois sur une seule ligne et tu essayes de remettre le "X" à la même case sans utiliser les dimensions du tableau initial...

    Citation Envoyé par NightPhantom Voir le message
    et en warning "control reaches end of non-void function" ce qui est aussi étrange car je retourne un entier
    Le compilo ne voit pas de return quand les boucles se terminent. Et il ne se rend pas compte que ton algo renverra quand-même quelque chose vu qu'il y a un return dans le if et dans le else. Mais c'est quand-même un signe qui aurait dû t'alerter sur la validité d'un tel algo...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/12/2009, 16h20
  2. [XSL] passer sur le tableau suivant apres X lectures
    Par zejo63 dans le forum XSL/XSLT/XPATH
    Réponses: 18
    Dernier message: 13/07/2007, 17h53
  3. Réponses: 1
    Dernier message: 09/03/2007, 17h26
  4. [AJAX] comment passer d'un tableau de chaine javascript à jsp
    Par youp_db dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/11/2006, 10h25
  5. Passer le résultat (tableau) d'une fonction
    Par coyote90 dans le forum Access
    Réponses: 3
    Dernier message: 10/11/2005, 19h56

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