Ayuda en C: Funciones y Matrices

Iniciado por outlookk, 4 Febrero 2013, 18:55 PM

0 Miembros y 1 Visitante están viendo este tema.

outlookk

Hola, estoy intentando hacer una matriz de 4x4 que este llena de numeros aleatorios diferentes en una funcion. Se la llama desde otra funcion y se escoje una de las filas creadas y se muestra por pantalla. Esto he hecho, no se como imprimir la fila que escoja el usuario:

void llenarmatriz(char pass[4][4])
{
srand(time(NULL));
char letra;
int i, j, num=0;
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(j<2)
{
num = aleatorio_letra(); //aleatorio de 2 a 6
pass[i][j]=num;
}
else
{
num = aleatorio_numero(); //aleatorio entre 7 y 16
pass[i][j]=num;
}
}
}
for(i=0;i<4;i++)
{
printf("Filas %i: ",i+1);
for(j=0;j<4;j++)
{
if(j<2)
{
printf("%c",escojer[i][j]);
}
else
{
printf("%i",escojer[i][j]);
}
}
printf("\n");
}
}

void pide()
{
char escojer[4][4];
llenarmatriz(escojer);
}

void i_escoj()
{
int op=0;
char matriz[4][4];
llenarmatriz(pass); //aqui quisiera que me de la misma que se genero en llenarmatriz y no una nueva
printf("Escoja: ");
scanf("%d", &op);
printf("%s", obtener(op, matriz));
fclose ( p );
}

char *obtener(int op, char matriz[4][4])
{
char c[5];
int i;
for(i=0; i<4; i++)
c[i] = matriz[op][i];
return c;
}

naderST

Cuando llames a llenarmatriz le pasas como parámetro matriz, esto se pasa por referencia, es decir, lo que tu función llenarmatriz modifique en matriz, la variable original se verá afectada, por lo tanto en tu variable matriz estará almacenada la información que generaste en llenarmatriz

outlookk

Cita de: naderST en  4 Febrero 2013, 19:11 PM
Cuando llames a llenarmatriz le pasas como parámetro matriz, esto se pasa por referencia, es decir, lo que tu función llenarmatriz modifique en matriz, la variable original se verá afectada, por lo tanto en tu variable matriz estará almacenada la información que generaste en llenarmatriz
void *llenarmatriz(char pass[4][4])
{
                 ........
                 ........
                 ........
return matriz;
}
¿Así?

durasno

HOla! primero q nada deberias revisar tu codigo asi no vemos cosas como en la funcion llenarmatriz: usas dos nombres distintos pass y escojer(supongo q te referis a la misma matriz)

Como ya te dijeron, los arreglos se pasan por referencia asi q solo hace falta q lo crees una sola vez y se lo pases a las distintas funciones q sea necesario



Saludos
Ahorrate una pregunta, lee el man

leosansan

#4
Cita de: outlookk en  4 Febrero 2013, 18:55 PM
Hola, estoy intentando hacer una matriz de 4x4 que este llena de numeros aleatorios diferentes en una funcion. Se la llama desde otra funcion y se escoje una de las filas creadas y se muestra por pantalla. Esto he hecho, no se como imprimir la fila que escoja el usuario
La verdad que el código que posteas no se sabe bien por donde cogerlo.
Intentas llenar con aleatorios con una variable "aleatorio_letra" que no hace nada. Eso se lleva a cabo con rand, y fíjate en su uso para que en un caso dé números del 2 al 6 y en el otro del 7 al 16.
Por un lado declaras" char" la matriz e igualas a" int" en la variable num.
Supongo que la matriz es de enteros, ya que la llenas con enteros generados aleatoriamente. Por otro lado, para no liarte con la matriz, que en un lado llamas escoger y en otro pass, lo cual en sí no está mal, aunque sí está mal en la misma función llamarla de forma diferente, como comento durasno, yo la he llamado en todo momento pass para no liarte.
El código hace lo que quieres:

Código (cpp) [Seleccionar]
void llenarmatriz(int pass[4][4])
{
int i, j, num;
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
if(j<2){
num =  2+rand() % (5); //aleatorio de 2 a 6
pass[i][j]=num;
}
else {
num = 7+rand() % (10); //aleatorio entre 7 y 16
pass[i][j]=num;
}
}
}
for(i=0;i<4;i++) {
printf("Filas %d: ",i+1);
for(j=0;j<4;j++){
if(j<2)
         printf("%d ",pass[i][j]);
     else
       printf("%d ",pass[i][j]);
     }
printf("\n");
}
}

void i_escoj(int pass [][4])
{
int op=0;
 printf("Escoja: ");
scanf("%d", &op);
op--;
 obtener(op, pass);
}

void obtener(int op, int pass[][4])
{
 int i;
for(i=0; i<4; i++)
   printf ("%d ",pass[op][i]);
}
#include <stdio.h>
#include <time.h>

int main(void){
 srand(time(NULL));
 int op,pass [4][4];
 llenarmatriz( pass);
 i_escoj(pass);
 return 0;
}


Saluditos!.

P.D: No obstante habría que depurar más tranquilamente el código, como declarar las funciones antes de usarlas, pero eso ya es para tí.

outlookk

Cita de: leosansan en  4 Febrero 2013, 22:29 PM
La verdad que el código que posteas no se sabe bien por donde cogerlo.
Intentas llenar con aleatorios con una variable "aleatorio_letra" que no hace nada. Eso se lleva a cabo con rand, y fíjate en su uso para que en un caso dé números del 2 al 6 y en el otro del 7 al 16.
Por un lado declaras" char" la matriz e igualas a" int" en la variable num.
Supongo que la matriz es de enteros, ya que la llenas con enteros generados aleatoriamente. Por otro lado, para no liarte con la matriz, que en un lado llamas escoger y en otro pass, lo cual en sí no está mal, aunque sí está mal en la misma función llamarla de forma diferente, como comento durasno, yo la he llamado en todo momento pass para no liarte.
El código hace lo que quieres:

Código (cpp) [Seleccionar]
void llenarmatriz(int pass[4][4])
{
int i, j, num;
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
if(j<2){
num =  2+rand() % (5); //aleatorio de 2 a 6
pass[i][j]=num;
}
else {
num = 7+rand() % (10); //aleatorio entre 7 y 16
pass[i][j]=num;
}
}
}
for(i=0;i<4;i++) {
printf("Filas %d: ",i+1);
for(j=0;j<4;j++){
if(j<2)
         printf("%d ",pass[i][j]);
     else
       printf("%d ",pass[i][j]);
     }
printf("\n");
}
}

void i_escoj(int pass [][4])
{
int op=0;
 printf("Escoja: ");
scanf("%d", &op);
op--;
 obtener(op, pass);
}

void obtener(int op, int pass[][4])
{
 int i;
for(i=0; i<4; i++)
   printf ("%d ",pass[op][i]);
}
#include <stdio.h>
#include <time.h>

int main(void){
 srand(time(NULL));
 int op,pass [4][4];
 llenarmatriz( pass);
 i_escoj(pass);
 return 0;
}


Saluditos!.

P.D: No obstante habría que depurar más tranquilamente el código, como declarar las funciones antes de usarlas, pero eso ya es para tí.
Realmente la dibia llenar con aleatorios en letras, por eso la funcion, tu respuesta igual me sirvio mucho, gracias!