Matrice avec valeurs aleatoires en C

maria_silva Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
maria_silva Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -
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;
}



5 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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]
0
maria_silva Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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;
}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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é ?
0
maria_silva Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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!
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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....
0
maria_silva Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maria_silva Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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;
}
0