Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Calculadora de Matrices con funciones

Estas en el tema de Calculadora de Matrices con funciones en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 15/11/2015, 10:58
 
Fecha de Ingreso: noviembre-2015
Ubicación: Madrid
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Pregunta Calculadora de Matrices con funciones

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 columna 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 :( y me va a saltar el mismo error cuando le pase esos parámetros a las funciones que se encargarán de sumar y multiplicar las matrices :(


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]); 
  }                 
 }
}
  #2 (permalink)  
Antiguo 15/11/2015, 11:21
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Calculadora de Matrices con funciones

¿Cómo que las debe usar sin inicializar? Lo que ha detectado tu compilador es que cuando llamas a la función pedirMatriz, el valor de filasMA, columnasMA, filasMB y columnasMB es desconocido. Antes de llamarla deberás haber almacenado ahí, dichos valores. Ten en cuenta que el al crear las matrices esos valores los almacenas en las variables con dicho nombre en main, pero no en las variables locales de la función menu() que es con la que trabajas para llamar al resto de tus funciones.
  #3 (permalink)  
Antiguo 15/11/2015, 11:48
 
Fecha de Ingreso: noviembre-2015
Ubicación: Madrid
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Calculadora de Matrices con funciones

Cita:
Iniciado por xKuZz Ver Mensaje
¿Cómo que las debe usar sin inicializar? Lo que ha detectado tu compilador es que cuando llamas a la función pedirMatriz, el valor de filasMA, columnasMA, filasMB y columnasMB es desconocido. Antes de llamarla deberás haber almacenado ahí, dichos valores. Ten en cuenta que el al crear las matrices esos valores los almacenas en las variables con dicho nombre en main, pero no en las variables locales de la función menu() que es con la que trabajas para llamar al resto de tus funciones.
Muchísimas gracias, llevaba casi dos horas dándole vueltas y comiéndome la cabeza sin encontrar una solución. Era una tontería y no conseguía verlo x) He metido la llamada de la función pedirDimensiones al inicio del menú y he declarado las filas y columnas como variables locales en menú y me funciona perfectamente :D
Pero me parece raro que no vaya a tener ninguna variable global en el main, solo locales.
  #4 (permalink)  
Antiguo 15/11/2015, 11:55
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Calculadora de Matrices con funciones

Una variable global ha de estar fuera del main también y, por lo general, se considera una mala práctica de programación. Lo que tienes que tener claro es que en cada función las variables sólo existen dentro del ámbito de la función, es decir que si tienes dos variables que se llaman variable y una está en el ámbito de la función A y otra en el ámbito de la función B entonces A::variable es totalmente distinto de B::variable. El main no deja de ser otra función sólo que es aquella por la que el programa ha de empezar. En tu caso el main se te habrá quedado prácticamente vacío por que lo has metido casi todo en la función que has llamado menu, pero perfectamente podría no existir menu y ser main quien llevase el control de todas las variables.

Etiquetas: calculadora, funcion, funciones, int, matrices, numero, programa, suma
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:54.