Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: theCdummie en 15 Noviembre 2015, 16:27 pm



Título: Ayuda con calculadora de matrices en C
Publicado por: theCdummie en 15 Noviembre 2015, 16:27 pm
Hola buenas, estoy haciendo una calculadora de matrices en C usando funciones, y tengo un par de dudas, espero que puedan ayudarme.
Cuando llamo a la función pedirMatriz(); y empiezo a introducir los datos, no le estoy pasando bien los datos guardados en las variables de las filas y columnas que tienen las matrices, porque me pide todo el rato que introduzca datos para la fila 1 y una columnas nueva, y no para, no se si me explico.

También me saltan warnings al llamar a la función pedir matriz, que son los siguientes:

c:119:16: warning: 'filasMA' may be used uninitialized on this function
c:119:16: warning: 'columnasMA' may be used uninitialized on this function
c:119:16: warning: 'filasMB' may be used uninitialized on this function
c:119:16: warning: 'columnasMB' may be used uninitialized on this function

Se que pone que deberia usarlas sin inicializar, pero no se como hacerlo :(


El código que tengo es este:

Código:
#include <stdio.h>

#define MAX_FILAS 5 /* Número máximo de filas que puede tener una matriz */
#define MAX_COLUMNAS 5 /* Número máximo de columnas que puede tener una matriz */
#define FALSE 0 /* Cuando el valor de la sentencia es falso, devuelve un 0 */
#define TRUE 1 /* Cuando el valor dela sentencia es verdadero, devuelve un 1 */


/* ---------- Declaración de los prototipos de las funciones ---------- */

void pedirDimensiones (int *filasMA, int *columnasMA, int *filasMB, int *columnasMB);
int menu (void);
void pedirMatriz (int matrizA[MAX_FILAS][MAX_COLUMNAS], int matrizB[MAX_FILAS][MAX_COLUMNAS], int filasMA, int columnasMA, int filasMB, int columnasMB);



int main(void) {

/* ---------- Declaración de constantes ---------- */

int filasMA, columnasMA; /* Almacenan el número de filas y columnas que tiene la Matriz A */
int filasMB, columnasMB; /* Almacenan el número de filas y columnas que tiene la Matriz B */



/* ------------  Programa principal  ------------ */

printf("\n\n** Introduccion de los datos de las matrices **");

/* Llamada a la función pedirDimensiones() */
pedirDimensiones(&filasMA, &columnasMA, &filasMB, &columnasMB);

/* Imprime por pantalla las dimensiones válidas introducidas por teclado */
printf("\nLas dimensiones de la Matriz A son %d Filas por %d Columnas.", filasMA, columnasMA);
printf("\nLas dimensiones de la Matriz A son %d Filas por %d Columnas.", filasMB, columnasMB);

/* Llamada a la función menu() */
menu();

return 0;
}


/* ---------- Definición de funciones ---------- */

/* Lee de teclado las filas y columnas de los arrays con los que se va a operar */
void pedirDimensiones (int *filasMA, int *columnasMA, int *filasMB, int *columnasMB)
{
printf("\n\nNumero de Filas de la Matriz A(1-5): ");
scanf("%d", &*filasMA);
/* Cuando el usuario introduce un valor incorrecto el bucle comienza hasta que se introduce un valor válido */
while (*filasMA<1 || *filasMA>MAX_FILAS)
{
printf("Numero de Filas de la Matriz A(1-5): ");
scanf("%d", &*filasMA);
}

printf("Numero de Columnas de la Matriz A(1-5): ");
scanf("%d", &*columnasMA);
/* Cuando el usuario introduce un valor incorrecto el bucle comienza hasta que se introduce un valor válido */
while (*columnasMA<1 || *columnasMA>MAX_COLUMNAS)
{
printf("Numero de Columnas de la Matriz A(1-5): ");
scanf("%d", &*columnasMA);
}

printf("\nNumero de Filas de la Matriz B(1-5): ");
scanf("%d", &*filasMB);
/* Cuando el usuario introduce un valor incorrecto el bucle comienza hasta que se introduce un valor válido */
while (*filasMB<1 || *filasMB>MAX_FILAS)
{
printf("Numero de Filas de la Matriz B(1-5): ");
scanf("%d", &*filasMB);
}

printf("Numero de Columnas de la Matriz B(1-5): ");
scanf("%d", &*columnasMB);
/* Cuando el usuario introduce un valor incorrecto el bucle comienza hasta que se introduce un valor válido */
while (*columnasMB<1 || *columnasMB>MAX_COLUMNAS)
{
printf("Numero de Columnas de la Matriz B(1-5): ");
scanf("%d", &*columnasMB);
}
}

/* Muestra el menú por pantalla y lee de teclado la opción seleccionada */
int menu (void)
{
/* Variables locales de menu() */

int opcion; /* Opción seleccionada por el usuario */
int matrices_con_datos; /* Comprueba si se han introducido datos en las matrices */
int filasMA, columnasMA, filasMB, columnasMB;
int matrizA[MAX_FILAS][MAX_COLUMNAS], matrizB[MAX_FILAS][MAX_COLUMNAS];



/* Inicializa el valor a FALSE indicando que las matrices están vacías */
matrices_con_datos=FALSE;

do
{
printf("\n\n        1. - Introducir datos en las matrices");
printf("\n        2. - Sumar matrices (A+B)");
printf("\n        3. - Multiplicar matrices (A*B)");
printf("\n        4. - Salir");
printf("\n\nSeleccione opcion: ");
scanf("%d", &opcion);

switch (opcion)
{
   case 1: /* El usuario introduce los datos de las matrices */
printf("\nIntroducir datos en las matrices");

/* Llamada a la función pedirMatriz(); */
pedirMatriz(matrizA, matrizB, filasMA, columnasMA, filasMB, columnasMB);

/* Llamada a la función verMatriz(); */
/* verMatriz(); */

break;

   case 2: /* Suma las matrices */
printf("\nSumar matrices");

/* Comprueba si se han introducido datos en las matrices */
if (matrices_con_datos==FALSE)
{
printf("\n\nNo se han introducido datos en las matrices");
}

/* Si se han introducido datos en las matrices, se llama a la función sumarMatriz() */
else
{
/* Llamada a la función sumaMatrices() */
}

break;

   case 3: /* Multiplica las matrices */
printf("\nMultiplicar matrices");

           /* Comprueba si se han introducido datos en las matrices */
if (matrices_con_datos==FALSE)
{
printf("\n\nNo se han introducido datos en las matrices");
}

/* Si se han introducido datos en las matrices, se llama a la función multiplicarMatriz() */
else
{
/* Llamada a la función multiplicarMatriz() */
}

break;

   case 4: /* Finaliza el programa */
break;

/* Cuando se introduce un valor numérico diferente a los especificados en el menú, muestra un mensaje de error */
   default: printf("\nOpcion incorrecta");
}

} while(opcion!=4);

return opcion;
}


/* Rellena las filas y columnas del array matriz indicadas en los parámetros filas y columnas con valores enteros leídos del teclado */
void pedirMatriz(int matrizA[MAX_FILAS][MAX_COLUMNAS], int matrizB[MAX_FILAS][MAX_COLUMNAS], int filasMA, int columnasMA, int filasMB, int columnasMB)
{
int i, j; /* Recorren las filas y las columnas de las matrices A y B */

printf("\n\n** Matriz A **\n\n");

/* Pide los datos de la matriz A */
for(i=0; i<filasMA; i++)
{
for(j=0; j<columnasMA; j++)
{  
printf("Fila [%d] Columa [%d]: ", i+1,j+1);
scanf("%d",&matrizA[i][j]);
}                
}

printf("\n\n** Matriz B \n\n**");

/* Pide los datos de la matriz B */
for(i=0; i<filasMB; i++)
{
for(j=0; j<columnasMB; j++)
{  
printf("Fila [%d] Columa [%d]: ", i+1,j+1);
scanf("%d",&matrizB[i][j]);
}                
}
}


Título: Re: Ayuda con calculadora de matrices en C
Publicado por: furciorifa en 18 Noviembre 2015, 23:58 pm
Yo compile con GCC no me da ningún error tu código, bueno veo errores aquí
 scanf("%d", &opcion);
Se cicla en la introducción de matrices cuando presionas uno porque recibe

1 después \n salto de línea que es  diferente de uno y no entra jamás.

los scanf(); para los tamaños de arrays no es necesario *& , con el nombre del puntero es suficiente