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

Télécharger C Discussion :

générer aléatoirement une matrice quelconque


Sujet :

Télécharger C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut générer aléatoirement une matrice quelconque
    Bonsoir,

    je cherches à générer une matrice quelconque puis l'enregistrer dans un fichier texte.
    En fait, j'ai besoin de ce petit algorithme, pour vérifier, après, que toutes les versions peu importe le formats de stockage ( pour une matrice creuse) choisi ont la même matrice résultat.

    voila 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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    #include <time.h>
    #include <string.h>
     
     
    int main()
    {
     
     
     
    long int N;
     
    double* A;
     
     
     
    unsigned long int i,z,j,signe,d,max,min,NNZ;
    FILE *fp;
     
     
    printf("donner la taille de matrice :");
    scanf("%d",&N);
     
     
     
     
    // Allocations
    A = (double*) malloc(N*N*sizeof(double)) ;
     
     
    /*Cette fonction permet de générer aléatoirement une matrice quelconque*/
     
     
     
    /*--------------------------------*/
    /*Mise à zéro de la matrice*/
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
           {
              A[i*N+j]=0;
           }
     
     
     
    /*On génére, d'abord,tous les éléments de la diagonale de la matrice aléatoirement
    afin d'éviter des lignes ou des colonnes vides.*/
    for(i=0;i<N;i++)
    {
      A[i*N+i]=(double)RAND_MAX/(rand()+1);
      signe=rand();
      if(signe<(RAND_MAX/2))
    	  A[i*N+i]*=(-1);
     
    }
     
     
     
    /*Génération de la matrice.*/
    d=NNZ-N;/*calcul du nombre d'éléments non nuls restants*/
    for(z=0;z<d;z++)
    /*Répéter la génération NNZ fois(Nombre d'élèments non nuls)- N fois(Nombre d'éléments déjà placé à la diagonale).*/
    { do
    		{/*Générer des indices colonnes et des indices lignes dont l'élèment correspondant
    		est nul pour éviter la génération du même élément plusieurs fois  */
    		 i=(int)(((float)rand()/RAND_MAX)*(N-1));
    		 j=(int)(((float)rand()/RAND_MAX)*(N-1));
    		} while(A[i*N+j]!=0);
     
    /*Génération de l'élèment ayant les indices générés.*/
    A[i*N+j]=((double)RAND_MAX)/(rand()+1);
    signe=rand();
    if(signe<(RAND_MAX/2))
    A[i*N+j]*=(-1);
    }
     
     
     
    /*------------------------------------*/
     
     fp = fopen("matrice.txt","w+t");
     fprintf(fp," %d \n", N);
     
     for(i=0;i< N;i++)
      {
      for(j=0;j<N;j++)
      {
        fprintf(fp,"%f ", A[i,j]);
      }
    fprintf(fp," \n");
    }
     
    }

    j'espère que vous pourrez m'aider

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

    Ton indentation laisse un peu à désirer, et il y a un peu trop de sauts de lignes à mon gout :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    #include <time.h>
    #include <string.h>
     
     
    int main()
    {
        long int N;
        double* A;
        unsigned long int i,z,j,signe,d,max,min,NNZ;
        FILE *fp;
     
        printf("donner la taille de matrice :");
        scanf("%d",&N);
        // Allocations
        A = (double*) malloc(N*N*sizeof(double)) ;
        /*Cette fonction permet de générer aléatoirement une matrice quelconque*/
     
        /*--------------------------------*/
        /*Mise à zéro de la matrice*/
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
            {
                A[i*N+j]=0;
            }
     
        /*On génére, d'abord,tous les éléments de la diagonale de la matrice aléatoirement
        afin d'éviter des lignes ou des colonnes vides.*/
        for(i=0;i<N;i++)
        {
            A[i*N+i]=(double)RAND_MAX/(rand()+1);
            signe=rand();
            if(signe<(RAND_MAX/2))
                A[i*N+i]*=(-1);
     
        }
     
        /*Génération de la matrice.*/
        d=NNZ-N;/*calcul du nombre d'éléments non nuls restants*/
        for(z=0;z<d;z++)
        /*Répéter la génération NNZ fois(Nombre d'élèments non nuls)- N fois(Nombre d'éléments déjà placé à la diagonale).*/
        { 
            do
            {   /*Générer des indices colonnes et des indices lignes dont l'élèment correspondant
                est nul pour éviter la génération du même élément plusieurs fois  */
                i=(int)(((float)rand()/RAND_MAX)*(N-1));
                j=(int)(((float)rand()/RAND_MAX)*(N-1));
            } while(A[i*N+j]!=0);
     
            /*Génération de l'élèment ayant les indices générés.*/
            A[i*N+j]=((double)RAND_MAX)/(rand()+1);
            signe=rand();
            if(signe<(RAND_MAX/2))
                A[i*N+j]*=(-1);
        }
     
        /*------------------------------------*/
     
        fp = fopen("matrice.txt","w+t");
        fprintf(fp," %d \n", N);
     
        for(i=0;i< N;i++)
        {
            for(j=0;j<N;j++)
            {
                fprintf(fp,"%f ", A[i,j]);
            }
            fprintf(fp," \n");
        }
     
    }
    Ceci fait, on obtient à la compilation gcc -Wall -Wextra main.c -c pas mal d'avertissements :
    • main.c:16:5: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'long in
      t *' [-Wformat=]
           scanf("%d",&N);
           ^
      tu as déclaré N comme un long int, le format adapté est donc (cf. tableau documentation scanf) "%ld".
    • main.c:23:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
           for(i=0;i<N;i++)
                    ^
      main.c:24:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
               for(j=0;j<N;j++)
                        ^
      main.c:31:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
           for(i=0;i<N;i++)
                    ^
      main.c:64:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
           for(i=0;i< N;i++)
                    ^
      main.c:66:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
               for(j=0;j<N;j++)
                        ^
      i et j sont de type unsigned long alors que N est de type long int. Il faudrait dans l'absolu que N soit aussi qualifié de unsigned. Le format précédent deviendrait alors "%lu".
    • main.c:62:5: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long int'
       [-Wformat=]
           fprintf(fp," %d \n", N);
           ^
      Même principe que pour scanf.
      main.c:68:34: warning: left-hand operand of comma expression has no effect [-Wunused-value]
                   fprintf(fp,"%f ", A[i,j]);
                                        ^
      Petite erreur d'étourderie, c'est A[i*N+j].
    • main.c:12:41: warning: unused variable 'min' [-Wunused-variable]
           unsigned long int i,z,j,signe,d,max,min,NNZ;
                                               ^
      main.c:12:37: warning: unused variable 'max' [-Wunused-variable]
           unsigned long int i,z,j,signe,d,max,min,NNZ;
                                           ^
      Tu as déclaré ces variables, mais ne les as pas utilisé. C'est peut-être un oubli, ou cela viendra plus tard, mais actuellement leur déclaration peut être supprimée.
    • main.c:73:1: warning: control reaches end of non-void function [-Wreturn-type]
       }
       ^
      La fonction main() a un retour de type int, mais tu ne retournes aucune valeur.
    • main.c:41:6: warning: 'NNZ' is used uninitialized in this function [-Wuninitialized]
           d=NNZ-N;/*calcul du nombre d'éléments non nuls restants*/
            ^
      Tu as oublié de donner une valeur à la variable NNZ avant de l'utiliser.

    Outre ces erreurs mentionnées par le compilateur, je rajouterais :
    • Tu as oublié de libérer le mémoire allouée avec free().
    • Tu as oublié de refermer la fichier avec fclose().
    • Il est toujours bon de vérifier que la mémoire a bien été allouée (retour de malloc() différent NULL) et que le fichier a bien été ouvert (retour de fopen() différent NULL).

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Commence par poster le programme modifié sur les conseils de Winjerome.
    Ensuite, pourquoi stocker la matrice en "human readable" ? Autant écrire directement le tableau dans un fichier. L'écriture se fait en une seule ligne. Idem pour la lecture.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    voila le programme modifié sur les conseils de Winjerome

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    #include <time.h>
    #include <string.h>
     
     
     main()
    {
        long int N;
        double* A;
        unsigned long int i,z,j,signe,d,NNZ;
        FILE *fp;
     
        printf("donner la taille de matrice :");
        scanf("%lu",&N);
        // Allocations
        A = (double*) malloc(N*N*sizeof(double)) ;
        /*Cette fonction permet de générer aléatoirement une matrice quelconque*/
     
        /*--------------------------------*/
        /*Mise à zéro de la matrice*/
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
            {
                A[i*N+j]=0;
            }
     
        /*On génére, d'abord,tous les éléments de la diagonale de la matrice aléatoirement
        afin d'éviter des lignes ou des colonnes vides.*/
        for(i=0;i<N;i++)
        {
            A[i*N+i]=(double)RAND_MAX/(rand()+1);
            signe=rand();
            if(signe<(RAND_MAX/2))
                A[i*N+i]*=(-1);
     
        }
     
        /*Génération de la matrice.*/
        NNZ= 9;
        d=NNZ-N;/*calcul du nombre d'éléments non nuls restants*/
        for(z=0;z<d;z++)
        /*Répéter la génération NNZ fois(Nombre d'élèments non nuls)- N fois(Nombre d'éléments déjà placé à la diagonale).*/
        {
            do
            {   /*Générer des indices colonnes et des indices lignes dont l'élèment correspondant
                est nul pour éviter la génération du même élément plusieurs fois  */
                i=(int)(((float)rand()/RAND_MAX)*(N-1));
                j=(int)(((float)rand()/RAND_MAX)*(N-1));
            } while(A[i*N+j]!=0);
     
            /*Génération de l'élèment ayant les indices générés.*/
            A[i*N+j]=((double)RAND_MAX)/(rand()+1);
            signe=rand();
            if(signe<(RAND_MAX/2))
                A[i*N+j]*=(-1);
        }
     
        /*------------------------------------*/
     
        fp = fopen("matrice.txt","w+t");
        fprintf(fp," %lu \n", N);
     
        for(i=0;i< N;i++)
        {
            for(j=0;j<N;j++)
            {
                fprintf(fp,"%f ", A[i*N+j]);
            }
            fprintf(fp," \n");
        }
     
     
      fclose(fp);
      free(A);
     
     
     
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2015, 00h06
  2. Comment obternir une matrice triangulaire à partir d'une matrice quelconque ?
    Par membreComplexe12 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 13/11/2011, 22h05
  3. [Turbo Pascal] Générer aléatoirement une chaîne de caractères
    Par bzminfo dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 02/04/2010, 22h08
  4. Subdiviser aléatoirement une matrice
    Par comrad85 dans le forum MATLAB
    Réponses: 12
    Dernier message: 19/10/2008, 22h34
  5. Réponses: 2
    Dernier message: 06/04/2008, 14h51

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