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 :

procédure Saisie matrice


Sujet :

C

  1. #1
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut procédure Saisie matrice
    Bonjour à tous

    je suis nouvelle dans ce domaine de développement en C, je veux écrire une procédure Saisie qui permet la saisie d’une matrice d’entiers V de taille M x N. M et N sont inférieurs ou égales à une constante donnée MAX = 100

    j'ai trouvé deux problèmes :
    1* au niveau de test N,M<= Max
    2* au niveau remplissage Matrice
    voici mon 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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define Max 100
     
    void saisie(int **V,int *m,int *n)
    {   int i,j;
        printf("Saisie dimension du matrice \n") ;
        //do{
        printf("Donner nombre de ligne= ");
        scanf("%d",m);
        printf("Donner nombre de colonne= ");
        scanf("%d",n);
        //}while ((n>Max)&&(m>Max));
        // allocation dynamique de la taille de mat
        V=(int **)malloc((*m)*(sizeof(int)));
        printf("Saisie élément du matrice \n") ;
        for(i=0;i<(*m);i++)
        {
             V[i] = (int*) malloc((*n) * sizeof(int));
     
            for(j=0;j<(*n);j++)
            {
            printf("Donner valeur de case [%d,%d]= ",i+1,j+1);
            scanf("%d",&V[i][j]);
            }
        }
    }
    int main()
    {   int M[10][10];
        saisie(M,3,3);
        return 0;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    D'ici, je vois deux problèmes:
    • Tu confonds tableau statique et dynamique:
      • Tu passes un tableau statique à ta fonction, dans laquelle tu alloues un tableau dynamiquement
      • Les type int[10][10] et int** ne sont pas compatibles.
    • Tu tentes de modifier un paramètre pointeur de pointeur, mais tu ne prends pas celui-ci par pointeur: Pour faire ça, il te manque un niveau d'indirection.


    Donc, première chose à savoir: Quel type de tableau veux-tu utiliser? Un tableau 2D statique de dimensions 10*10, ou un tableau 2D dynamique de dimensions déterminées à l'exécution?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    tableau statique
    a l’utilisateur de faire entrer le nombre de ligne et colonne qu'il veux

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Et si l'utilisateur entre des tailles supérieures à la taille statique, le programme doit refuser, c'est ça?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    oui
    j'ai mis la boucle de répéter je sais pas juste ou faux c'est pour ça j'ai mis en commentaire

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Dans ce cas, tu n'as pas d'allocation dynamique à faire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    je met do while ou j'enleve ?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Tu le mets (tu peux même mettre toute l'entrée des dimensions dans une fonction à part) et tu enlèves les appels à malloc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define Max 10
     
    void saisie(int V[10][10],int m,int n)
    {
        int i,j;
        printf("Saisie dimension du matrice \n") ;
        do{
        printf("Donner nombre de ligne= ");
        scanf("%d",&m);
        printf("Donner nombre de colonne= ");
        scanf("%d",&n);
        }while ((n>Max)&&(m>Max));
     
        printf("Saisie élément du matrice \n") ;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
            printf("Donner valeur de case [%d,%d]= ",i+1,j+1);
            scanf("%d",&V[i][j]);
            }
        }
    }
    void affichage(int MAT[10][10],int m, int n)
    {   int i,j;
        printf("Affichage du matrice \n") ;
        for(i=0;i<m;i++)
        {   for(j=0;j<n;j++)
            {
            printf("[%d,%d]= %d ",i+1,j+1,MAT[i][j]);
            }
            printf("\n");
        }
    }
    c'est bon le code ?

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'est pas trop mal, mais tu devrais prendre n et m par pointeurs dans ta fonction de saisie.
    De plus, il faudrait ajouter de la gestion d'erreur pour scanf(), qui est une fonction très capricieuse (mal l'utiliser peut résulter en une boucle infinie!)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 792
    Par défaut
    Hello,

    Il y a à mon sens deux erreurs dans la boucle do....while lors de l'input:
    1) Le test dans le while est faux: ce n'est pas && qu'il faut mettre, mais ||: répéter la boucle tant qu'une ou les deux données sont > Max
    2) Ce test ne tient pas compte d'une entrée <= 0, qui donnera pour cette donnée un résultat vrai dans la condtion du while

    Bon courage & a+

    Edgar;

  12. #12
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut Probleme dans Procedure Saisie Matrice
    Re-bonjour,

    j'ai changé dans procédure saisie et j'ai ajouté de main pour tester mais ca marche pas non plus




    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
    void saisie(int V[10][10],int *m,int *n)
    {
        int i,j;
        printf("Saisie dimension du matrice \n") ;
        do{
        printf("Donner nombre de ligne= ");
        scanf("%d",m);
        printf("Donner nombre de colonne= ");
        scanf("%d",n);
        }while ((*n>Max)||(*m>Max)||(*n<1)||(*m<1));
    
        printf("Saisie élément du matrice \n") ;
        for(i=0;i<*m;i++)
        {
            for(j=0;j<*n;j++)
            {
            printf("Donner valeur de case [%d,%d]= ",i+1,j+1);
            scanf("%d",&V[i][j]);
            }
        }
    }
    
    
    int main(void)
    {
        int l,c;
        int MAT[100][100];
    
        saisie(MAT,l,c);
       
        return 0;
    }
    warning: passing argument 1 of 'saisie' from incompatible pointer type [enabled by default]| !!!!!

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Oh, pour l'amour de fuck...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    Merci pour ta réponse Mais SVP sans les mots de ( l'amour de fuck)

    Les deux procédures saisie et affichage fonctionne bien et juste

    Maintenant je voudrais bien implémenter une procédure Extraction_Ligne qui permet d’extraire la ligne i d’une matrice d’entiers V de taille M x N dans un tableau T

    voici mon essai j’espère qu'il est juste ? que pensez vous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Extraction_ligne(int MAT[Max][Max],int l,int *Tab[Max])
    {
        int i,j,k=0;
        for (i=0;i<10;i++) // i parcours les lignes
        {   if (i=l)
            for (j=0;j<10;j++)  //j parcours les colonnes
                Tab[k]=MAT[l][j];
                k++;
        }
    }

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pourquoi int* Tab[MAX]?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    pour dire que le tableau est une variable de sortie et qui change de valeur au début il est vide puis il sera plein

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    L'intention est louable... mais un tantinet erronée

    int *Tab[Max] représente un tableau de pointeurs sur int et non un pointeur sur un tableau de int.
    La syntaxe pour passer un pointeur sur un tableau de Max int utilise des parenthèses comme ceci :
    puis (*Tab)[i] pour accéder aux éléments.

    Mais c'est inutile ici, car les tableaux sont passés par adresse (celle de la première case) ; int Tab[Max] tout court est amplement suffisant ici pour pouvoir modifier les cases du tableau d'origine.
    Voir la FAQ Comment passer un tableau en paramètre à une fonction ? à ce sujet.

    Remarques par rapport au code de ton message d'avant :
    • Attention à la comparaison : if (i==l), sinon tu affectes l à i, puis vérifies si le résultat est non nul. Je ne saurais te conseiller d'utiliser au moins les options -Wall -Wextra à la compilation, ou d'écouter un peu mieux ton compilateur
    • Le parcours selon les lignes i est inutile : tu traites juste la ligne l.
    • La variable k est inutile : utilise j à la place.
    • Enfin, d'où vient ce 10 ? Ne serait-ce pas plutôt Max ?

  18. #18
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    Merci pour vos remarques,

    j'ai pas fais attention à ces fautes, je l'est corrigé et j'ai ajouté un bot de code pour voir le contenu de tableau qui contient la ligne extraite :

    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
    void Extraction_ligne(int MAT[Max][Max],int l,int Tab[Max])
    {
        int i=0,j,k=0;
     
        while (i!=l)
        {
            i++;
        }
            for (j=0;j<Max;j++)
            {
                Tab[k]=MAT[l][j];
                k++;
            }
    }
     
    void aff (int T[Max])
    {int i;
        for (i=0;i<Max;i++)
            printf("** %d**",T[i]);
    }
    Mais il affiche des nombres non de la matrice ??

  19. #19
    Invité
    Invité(e)
    Par défaut
    Cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        while (i!=l)
        {
            i++;
        }
    (autant faire i = l; ) ne sert strictement à rien : tu as l !
    Et k peut être remplacé par j :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for (j=0;j<Max;j++)
        {
            Tab[j]=MAT[l][j];
        }
    Par contre rien dans ce que tu montres ne justifie des valeurs erronées, cela doit venir d'autre part.

    À noter que les noms de variable tout en majuscules sont habituellement utilisés pour les constantes #define de compilation, et les noms commençant par une majuscule pour les types (bon, certains préfèreront rajouter des t_).

  20. #20
    Membre confirmé
    Femme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 135
    Par défaut
    au niveau de main j'ai mis pour tester les deux procédures extraction ligne et afficher le tableau en sortie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Extraction_ligne(MAT,2,T);
    aff(T);
    avec le code de procédure affiche tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void aff(int T[Max])
    {int i;
        for (i=0;i<Max;i++)
            printf("** %d**",T[i]);
    }
    il m'affiche ce résultat dans éxecution
    Nom : atef C.PNG
Affichages : 8330
Taille : 9,1 Ko

Discussions similaires

  1. saisie d'une matrice
    Par SavoitTout dans le forum Général Java
    Réponses: 7
    Dernier message: 26/04/2008, 13h52
  2. Réponses: 8
    Dernier message: 29/12/2007, 20h38
  3. Saisie d'une matrice
    Par nichols dans le forum MATLAB
    Réponses: 5
    Dernier message: 18/12/2007, 08h29
  4. Réponses: 5
    Dernier message: 10/11/2007, 10h20
  5. Saisie de données dans une procédure stockée
    Par Hastaroth dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/10/2004, 09h54

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