Téléchargement
illégal
Posez votre question Signaler

Matrice avec valeurs aleatoires en C

maria_silva 15Messages postés 18 juin 2011Date d'inscription 27 février 2012Dernière intervention - Dernière réponse le 18 juin 2011 à 21:43
Bonjour,
j'ai une matrice de dimension dynamique, je souhaiterai la remplir avec des valeurs aléatoires, mais le code ci-dessous tout ce que me permet c'est de la remplir avec la même valeur dans chaque caisse; le valeur est effectivement aléatoire (entre mon MIN et mon MAX) chaque fois que je lance le programme. Comment ferai-je pour générer un valeur différente dans chaque cellule de ma grille??? De plus, si je souhaite utiliser de valeur avec plus d'un digit, il décale un partie de la caisse...donc comment je pourrais éviter ça???
Merci pour votre réponse.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct tabla{
int nombre[];
}tabla;
typedef tabla* Tabla;
struct matrice
{
int lignes, colonnes;
Tabla **coefficients;
} matrice;
void affiche_matrice( struct matrice *A)
{
int i, j;
for(i=0; i< A->lignes; i++)
{
for(j=0;j< A->colonnes;j++)
{
printf("+-----");
}
printf("+\n");
/*1ere ligne*/
for(j=0;j<A->colonnes;j++)
{
printf("| ");
}
printf("|\n");
/*2ere ligne*/
for(j=0;j<A->colonnes;j++)
{
printf("| ");
}
printf("|\n");
/*3eme ligne*/
for(j=0;j<A->colonnes;j++)
{
printf("| %d ",(*(A->coefficients[i][j])).nombre);
}
printf("|\n");
/*4eme ligne*/
for(j=0;j<A->colonnes;j++)
{
printf("| ");
}
printf("|\n");
/*5eme ligne*/
for(j=0;j<A->colonnes;j++)
{
printf("| ");
}
printf("|\n");
}
for(j=0;j<A->colonnes;j++)
printf("+-----");
printf("+\n");
}
int main (int argc,char *argv [])
{
int *lignes,*colonnes;
int k=0;
int MAX=9;
int MIN=1;
/*lignes=lignes;
colonnes=colonnes;*/
srand(time(NULL));
printf("ingrese lignes:");
scanf("%d",&lignes);
printf("ingrese colonnes:");
scanf("%d",&colonnes);
struct matrice *A = malloc ( sizeof ( struct matrice ) ) ;
int i, taille,j;
A-> lignes=lignes;
A-> colonnes=colonnes;
A-> coefficients = (Tabla**)malloc ( (A -> lignes)* sizeof ( Tabla* ) ) ;
taille=(A->lignes*A->colonnes);
printf("talla %d\n",taille);
tabla* nbr=(tabla*)malloc(sizeof(tabla));
for(k=0;k<taille;k++)
{
nbr->nombre[k]=(rand()%(MAX-MIN-1))+MIN;
}
for(i=0;i<A->lignes;i++)
{
A -> coefficients [i] = (Tabla*)malloc (( A -> colonnes) * sizeof (tabla* ) ) ;
for(j=0;j<A->colonnes;j++)
{
A->coefficients[i][j]=nbr;
}
}
affiche_matrice(A);
return 0;
}
Lire la suite 

Matrice avec valeurs aleatoires en C »

7 réponses
Réponse
+0
moins plus
Mon compilateur m'indique deux erreurs (la même en fait)

error C2440: '=' : impossible de convertir de 'int *' en 'int'
A-> lignes=lignes;
A-> colonnes=colonnes;

Déclares lignes et colonnes comme de type int plutôt que int*

Sinon il y a un truc qui ne va pas avec Tabla
Tu fais un typedef tabla* Tabla, puis des Tabla**, c'est à dire des tabla***
Je trouve que ça commence à faire beaucoup d'étoiles...

Modifies matrice comme ceci :

typedef struct s_mat
{
  int lignes, colonnes;
  int *coefficients;
} matrice

Ensuite applique les modifications nécessaires à ton code, en particulier tu n'a plus besoin d'allouer dynamiquement la matrice, mais uniquement ses coefficients :
A-> coefficients = (int*) malloc (lignes*colonnes*sizeof(int));
Remarque : pour accéder à "A[i][j]" tu devras faire A->coefficients[i+A->lignes*j]
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour, j'ai essayé de faire les changements que tu m'as recommandé (changer de int **coefficients; à int *coefficients; dans la déclaration de mon struct matrice, mais cela ne marche pas.

Le code ci-dessous compile et génère ma matrice malgré les deux warnings dans les printf's (warning: format '%d' expects type 'int *', but argument 2 has type 'int **'). Dans cette partie, je ne comprends pas comment je pourrais lui indiquer de prendre la valeur pour les lignes et les colonnes pour construire la matrice selon la dimension que je veux...et ainsi éliminer les deux warnings.

Le plus important pour moi c'est d'appliquer une valeur différente et aléatoire dans chaque caisse de la matrice.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


typedef struct tabla{ int nombre; }tabla;

typedef tabla* Tabla;

struct matrice
{
int lignes, colonnes;
Tabla **coefficients; } matrice;


void affiche_matrice( struct matrice *A)
{
int i, j;

for(i=0; i< A->lignes; i++)
{
for(j=0;j< A->colonnes;j++)
{ printf("+-----"); }

printf("+\n");


/*1ere ligne*/

for(j=0;j<A->colonnes;j++)
{ printf("| "); }

printf("|\n");

/*2ere ligne*/
for(j=0;j<A->colonnes;j++)
{ printf("| "); }


printf("|\n");


/*3eme ligne*/
for(j=0;j<A->colonnes;j++)
{printf("| %d ",(*(A->coefficients[i][j])).nombre); }

printf("|\n");
/*4eme ligne*/
for(j=0;j<A->colonnes;j++)
{ printf("| "); }
printf("|\n");
/*5eme ligne*/
for(j=0;j<A->colonnes;j++)
{printf("| "); }

printf("|\n");
}
for(j=0;j<A->colonnes;j++)

printf("+-----");
printf("+\n"); }



int main (int argc,char *argv [])
{

int *lignes,*colonnes;
int MAX=9;
int MIN=1;

srand(time(NULL));

printf("ingrese lignes:");
scanf("%d",&lignes);

/*warning: format '%d' expects type 'int *', but argument 2 has type 'int **' */

printf("ingrese colonnes:");
scanf("%d",&colonnes);

struct matrice *A = malloc ( sizeof ( struct matrice ) ) ;

int i, taille,j;

A-> lignes=*lignes;
A-> colonnes=*colonnes;
A-> coefficients = (Tabla**)malloc ( (A -> lignes)* sizeof ( Tabla* ) ) ;
taille=(A->lignes*A->colonnes);
printf("talla %d\n",taille);

tabla* nbr=(tabla*)malloc(sizeof(tabla));

nbr->nombre=(rand()%(MAX-MIN-1))+MIN;

for(i=0;i<A->lignes;i++)
{
A -> coefficients [i] = (Tabla*)malloc (( A -> colonnes) * sizeof (tabla* ) ) ;
for(j=0;j<A->colonnes;j++)
{ A->coefficients[i][j]=nbr; }
}
affiche_matrice(A);
return 0;
}
KX- 18 juin 2011 à 15:01
Tu as toujours tabla*** coefficients ! C'est de là que vient ton erreur pas la peine de chercher ailleurs... Pourquoi ne pas avoir pris en compte les modifications que je t'ai indiqué ?
Ajouter un commentaire
Réponse
+0
moins plus
Je ne sais pas de quelle erreur tu parles!!! tu parles de warnings??? bahhh ce n'est pas une erreur... et j'ai toujours "Tabla **coefficients" (PAS *** COMME TU DIS) parce que le but de mon exercice c'est d'utiliser un pointeur vers un tableau dont chaque case est de type Tabla*. c'est un pointeur vers des pointeurs qui pointent chacun vers les coefficients de la matrice.


Mon code marche (j'ai effectué des corrections dans la declaration de la variable nombre de mon struct tabla)... j'ai juste besoin de mettre une valeur différente dans chaque case.

Merci pour me donner des réponses plus complétes!
KX- 18 juin 2011 à 15:27
Tu as Tabla** avec Tabla défini en tabla* donc au final c'est pareil que tabla***

Et ne dis pas que ton code marche...
Rien que l'initialisation plante parce que tu n'as pas modifié les int* lignes,colonnes comme je te l'avais indiqué, du coup A-> lignes=*lignes; et A-> colonnes=*colonnes; font n'importe quoi !

Et pour que ton aléatoire fonctionne il faut que tu modifies nbr à chaque fois dans le for...
Ça fait mal aux yeux, mais ça donnerait ceci :

for(i=0; i<A->lignes; i++) 
{ 
	A->coefficients[i]=(Tabla*)malloc((A->colonnes)*sizeof(tabla*)); 

	for(j=0; j<A->colonnes; j++) 
	{ 
		tabla* nbr = (tabla*)malloc(sizeof(tabla)); 
		nbr->nombre= (rand()%(MAX-MIN-1))+MIN;
		A->coefficients[i][j]=nbr; 
	} 
} 

Ce serait bien de désallouer la mémoire dynamique à la fin du programme, mais vu les pointeurs de pointeurs de pointeurs que tu utilises ça va être mignon....
Ajouter un commentaire
Réponse
+0
moins plus
Merciii pour ta réponse!!!

J'ai changé mes variables lignes et colonnes a type int sans être pointeurs et ça marche, aussi les valeurs aléatoires!!!

Je vais continuer a travailler sur mon exo car , le but principal c'est d'insérer des pieces (carrés, losanges,etc) de façon aléatoire dans les cases.

Par contre je ne sais pas trop comment simplifier mes pointeurs Tabla*** :s...
Ajouter un commentaire
Réponse
+0
moins plus
Je suis là de nouveau!! :)

J'ai crée un struct qui s'appelle "pièce" avec un contour(o,#,+,*), une forme(carré, losange, croix) et un lettre à l'intérieur(A,B,C,D)..et tout ça en aléatoire. Tout marche bien, mais...

maintenant, j'ai un ptit souci. Je n'arrive pas à intégrer ma fonction qui génère le contour de façon aléatoire. Est-ce que quelqu'un peut m'aider???


Merci BCP et dzlé pour mes messages aussi longs :)

J'ajoute mon code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct piece{
int forme;
int contour;
int lettre;
}piece;

typedef piece* Piece;

struct matrice
{
int lignes, colonnes;
Piece **coefficients;
} matrice;


void affiche_matrice( struct matrice *A)
{
int i, j;

for(i=0; i< A->lignes; i++){
for(j=0;j< A->colonnes;j++){
printf("+-----");

}
printf("+\n");


/*1ere ligne*/
for(j=0;j<A->colonnes;j++)
{
if((*(A->coefficients[i][j])).forme==1) {
printf("|%c%c%c%c%c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else if ((*(A->coefficients[i][j])).forme==2)
{
printf("| %c " ,(*(A->coefficients[i][j])).contour);
}
else if ((*(A->coefficients[i][j])).forme==3)
{
printf("| %c%c%c ",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else{
printf("| ");
}
}
printf("|\n");

/*2ere ligne*/
for(j=0;j<A->colonnes;j++)
{
if((*(A->coefficients[i][j])).forme ==1)
{
printf("|%c %c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==2){
printf("| %c %c ",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==3){
printf("|%c%c %c%c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else
{
printf("| ");
}
}
printf("|\n");

/*3eme ligne*/
for(j=0;j<A->colonnes;j++)
{
if((*(A->coefficients[i][j])).forme ==1){
printf("|%c %c %c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).lettre,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==2){
printf("|%c %c %c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).lettre,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==3){
printf("|%c %c %c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).lettre,(*(A->coefficients[i][j])).contour);
}
else{
printf("| ");
}
}
printf("|\n");
/*4eme ligne*/
for(j=0;j<A->colonnes;j++){

if((*(A->coefficients[i][j])).forme ==1){
printf("|%c %c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==2){
printf("| %c %c ",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==3){
printf("|%c%c %c%c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else{
printf("| ");
}
}
printf("|\n");
/*5eme ligne*/
for(j=0;j<A->colonnes;j++){
if((*(A->coefficients[i][j])).forme ==1){
printf("|%c%c%c%c%c",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==2){
printf("| %c ",(*(A->coefficients[i][j])).contour);
}
else if((*(A->coefficients[i][j])).forme ==3){
printf("| %c%c%c ",(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour,(*(A->coefficients[i][j])).contour);
}
else
{
printf("| ");
}
}
printf("|\n");
}
for(j=0;j<A->colonnes;j++) {

printf("+-----");
}
printf("+\n");



}

int randomcontour()
{
int MIN=0;
int MAX=3;
int W=35;
int X=43;
int Y=42;
int Z=111;
int i=0;
int j,k;
srand(time(NULL));

for(i=MIN;i<MAX+1;i++)
{
j=(rand()%(MAX-MIN+1))+MIN;
}
if(j==0)
{
return Y;
}
if(j==1)
{
return X;
}
if(j==2)
{
return W;
}
if(j==3)
{
return Z;
}
return j;
}



int main (int argc,char *argv [])
{
/*int a=35;
int b=43;
int c=42;
int d=111;
int MAX=a;
int MIN=d;
int k=0;*/

// j'ai crée ces variables pour essayer une fonction random qui utilise les bornes a et d avec les valeurs "int" qui me donnent les contours (o,#,+,*) si les affiche en type char (%c)...mais cela ne marche pas :( //

srand(time(NULL));


printf("%c\n",randomcontour());/* test pour prouver la fonction*/


struct matrice *A = malloc ( sizeof ( struct matrice ) ) ;

int lignes,colonnes;
int i, taille,j;


printf("ingrese lignes:");
scanf("%d",&lignes);

printf("ingrese colonnes:");
scanf("%d",&colonnes);

A-> lignes=lignes;
A-> colonnes=colonnes;
A-> coefficients = (Piece**)malloc ( (A -> lignes)* sizeof ( Piece* ) ) ;
taille=(A->lignes*A->colonnes);
printf("talla %d\n",taille);



for(i=0;i<A->lignes;i++)
{
A -> coefficients [i] = (Piece*)malloc (( A -> colonnes) * sizeof (piece* ) ) ;
for(j=0;j<A->colonnes;j++)
{
piece* nbr=(piece*)malloc(sizeof(piece));
nbr->forme=(rand()%(3-1+1))+1;
nbr->contour='#'; /*CELA OU IL FAUT INTEGRER LA FONCTION*/
nbr->lettre=(rand()%(69-65+1))+65;
A->coefficients[i][j]=nbr;
}
}
affiche_matrice(A);
return 0;
}
Ajouter un commentaire
Ce document intitulé « matrice avec valeurs aleatoires en C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?