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 :

Calcul des 0 et 1 dans une matrice


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut Calcul des 0 et 1 dans une matrice
    Bonjours;

    dans une matrice de taille m*n qui contient seulement des '0' et des '1', je veux calculer la succession des deux éléments dans chaque ligne.

    Exemple:
    Si la première ligne de la matrice est : 0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0
    la première ligne de la matrice résultat doit être: 5 3 4 2 2
    C'est-à-dire: 5 zéro, suivit de 3 un, suivit de 4 zéros, etc.…

    et ainsi de suite pour chaque ligne

    j'ai dèjà la reponse pour le cas d'un tableau:
    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
     
    int main(int argc, char * argv[])
    { 
    int k=0;
      //declaration & initialisation
        int *t=new int[ligne];
        int *resultat=new int[ligne];for(k=0; k<ligne; k++){resultat[k]=0;} 
     
    //  remplir le tableau à partir d'un fichier
        t=loadTableau(fff,fichier,ligne);
     
     
        int current = 0;
        int current_pos = 0;
     
        for(k=0; k<ligne*colone; k++){
            if(t[k] == current)
                resultat[current_pos]++;
            else
            {
                resultat[++current_pos]++;
                current = t[k];
            }
        }
     
        k = 0;
     
    //overture du fichier resultat
    	finput=fopen(fichier_res,"a");
     
     
    // ecriture du résultat
        while(k < ligne && resultat[k] > 0){
            fprintf(finput,"%d ",resultat[k]);
            k++;
        }fprintf(finput,"\n");
    }
    j'ai essayé de généraliser ce code pour le cas d'une matrice comme suit:

    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
     
    int main(int argc, char * argv[])
    {   
     
     int k=0,s=0;
     
    int **t;
    t=new int*[ligne ];
    for(k=0; k<ligne ; k++){ t[k]=new int[colone];}
     
    int **resultat;
    resultat=new int*[ligne ];
    for(k=0; k<ligne; k++){ resultat[k]=new int[colone];}
    for(k=0; k<ligne; k++){for(s=0; s<colone; s++){resultat[k][s]=0;}} 
     
     
    t=loadMatrice(f,fichier,ligne,colone);
     
        int current = 0;
        int current_pos = 0; 
     
        for(k=0; k<ligne; k++){
          for(s=0; s<colone; s++){
            if(t[k][s] == current)
                resultat[current_pos][s]++;
             else
            {
                resultat[++current_pos][s]++;
                 current = t[k][s];
            }
    		}}
     
        k = 0,s=0;
    	finput=fopen(fichier_res,"a");
        while(k<ligne && s<colone && resultat[k][s] > 0){
     
            fprintf(finput,"%d %d %d\n ",k,s,resultat[k][s]); 
     
    		 k++;s++;}fprintf(finput,"\n");
    	system("pause");
    	return 0;
    }
    malheureusement ça donne pas le bon résultat ! y a-t-il d'autre truc pour faire cette généralisation, ou autre idée qui répond au problème ?

    cordialement

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    salut,
    je me trompe peut-être, mais si tu voit la matrice comme un tableau a deux dimensions, tu peut utiliser le code que tu a déjà, dans une boucle ou la variable qui s'incrémente est le numéro de la ligne (c'est a dire que ton tu lit chaque colonne de la ligne L).

    Je n'ai pas vraiment regarder le code que tu a fait donc si sa se trouve c'est déjà sa que tu a essayer ...

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour,

    Plusieurs remarque avant de continuer plus loin. C++ veux dire utilisation de std::vector quand on le peux!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *t=new int[ligne];
        int *resultat=new int[ligne];for(k=0; k<ligne; k++){resultat[k]=0;}
    NON! Utilise les std::vector. tu n'as absolument aucun intérêt d'utilisation l'allocation dynamique comme tu le fais ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<int> t(ligne);
    std::vector<int> resultat(ligne);
    Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    finput=fopen(fichier_res,"a");
    NON! C++ -> fstream
    http://cpp.developpez.com/faq/cpp/?page=fichiers
    Homer J. Simpson


  4. #4
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    en réalité c'est un code en C, seul les déclaration qui sont en C++ (j'ai de problème avec malloc 'est pourquoi j'utilise new)

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Un code en C, mais compilé avec un compilateur c++? sinon l'opérateur new ne serait pas connu...
    Quel genre de problèmes as-tu avec malloc qui serait réglé (ou peut être *apparament* réglé) par un passage à new?

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    lorsque j'utilise malloc, je suis obligé d'ajouter un cast, sinon le compilateur me signale un erreur (je travaille avec vc++ 2010)

    je declare une matrice comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int **matrice;
    matrice=(int**)malloc(ligne*sizeof(int));
    for(int i=0;i<ligne;i++) matrice[i]=(int *)malloc(colonne*sizeof(int));
    donc avec new c'est simple puisque le compilateur c++.

    pour le problème je viens de trouver la solution comme suit:

    _créer une fonction qui calcule les 0 et 1 dans un tableau
    _ utiliser cette fonction pour calculer la matrice ligne par ligne

    la fonction est:

    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
     
    int* printArray(int *input,int max)
    {
    	int *res;res=(int*)malloc(max*sizeof(int));for(int i = 0; i<max; i++) {res[i]=0;}
     	int current_kind = -1;
     	int count = 0;int cp=0;
    	for(int i = 0; i<max; ++i) {
     
     		if (current_kind!=input[i]) 
    		{  
    			if (count!=0)  res[ cp]=count; 
    			current_kind = input[i] ;
    			count = 1;cp++; 
    		} else { count++; }
     
    		}
    	res[cp]=count; 
    return res;	
    }
    merci pour les remarques !

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

    Si tu souhaites compiler en C :
    Propriétés du projet > C/C++ > Avancé > Compilation sous, tu choisis Compiler comme code C (/TC)

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/01/2014, 13h06
  2. [Débutant] calculer nombre des 1 dans une matrice
    Par angel_tn dans le forum Images
    Réponses: 3
    Dernier message: 02/05/2010, 07h33
  3. Réponses: 4
    Dernier message: 05/05/2007, 19h12
  4. Réponses: 3
    Dernier message: 30/03/2007, 22h24
  5. Extraction des composantes des pixels dans une matrice
    Par hanane78 dans le forum Images
    Réponses: 7
    Dernier message: 11/03/2007, 22h12

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