Anuncios Google

Problema con arrays

Estoy haciendo un programa que calcula una media de cuatro personas de dos municipios y las compara con medias y blablabla para un tutorial. El caso es que cuando debería salir la media de la persona 2, sale la de la persona 3. He metido un par de printfs para asegurarme de que se guardan bien los datos, pero no encuentro el error, pues se guardan las de la persona 3 en la persona 2. Por supuesto, apareceréis en los agradecimientos.

/*Creado por: P22
Para: Scenebeta*/
 
#include <stdio.h>
 
int main(){
   //Definiciones
   float puntuacion[1][1][9];
 
   int i, n, j;
   int nnotas = 0;
 
   //Declaración de la función
   void computarmedia( float puntuacion[][][], int nnotas );
 
   printf("Hola! Vamos a calcular la media de notas de dos personas y calcular cual es mejor\n");
 
   //Petición de notas
   printf("En primer lugar: Cuantas notas va a tener cada persona? ");
   scanf("%d", &nnotas);
 
   for( j = 0; j < 2; j++ ){
      for(n = 0; n < 2; n++){
         printf("\n");
         for( i = 0; i < nnotas; i++ ){
            printf("\nIntroduce la nota numero %d de la persona numero %d del grupo numero %d: ", i + 1, n + 1, j + 1);
            scanf("%f", &puntuacion[j][n][i]);
            printf("%f", puntuacion[j][n][i]);
         }
      }
   }
 
   printf("%g", puntuacion[0][0][1]);
 
   computarmedia( puntuacion, nnotas );
 
   system("PAUSE");
   return 0;
}
 
void computarmedia( float a[1][1][9], int nnotas ){
   int i;
   float b[3] = {0, 0, 0, 0};
 
   for( i = 0; i < nnotas; i++ ) b[0] += a[0][0][i];
   for( i = 0; i < nnotas; i++ ) b[1] += a[0][1][i];
   for( i = 0; i < nnotas; i++ ) b[2] += a[1][0][i];
   for( i = 0; i < nnotas; i++ ) b[3] += a[1][1][i];
 
printf("\n%g", a[0][1][1]);
 
   for( i = 0; i < 4; i++ ) b[i] = b[i] / nnotas;
 
   printf("\nLa puntuacion media de la primera persona es: %.2f", b[0]);
   printf("\nLa puntuacion media de la segunda persona es: %.2f", b[1]);
   printf("\nLa puntuacion media de la tercera persona es: %.2f", b[2]);
   printf("\nLa puntuacion media de la cuarta persona es: %.2f", b[3]);
 
   if( b[0] > b[1] ) printf("\nEl primero ha sacado mejor puntuacion\n\n");
   else printf("\nEl segundo ha sacado mejor puntuacion\n\n");
 
   return;
}

Un saludo


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Loopin

No estoy muy seguro pero, eso

No estoy muy seguro pero, eso de declarar una funcion dentro del main, e implementarla fuera, ¿funciona? :S

En cuanto a los arrays, como ya te han comentado mas abajo, debes controlar los rangos. Una opción es crear un array dinamico, o, en su defecto antes de declarar el array estático de 9 posiciones, leer el valor por teclado, y hacer float puntuacion [nnotas]. No entiendo muy bien cual es el objetivo de crear una matriz tridimensional para tu programa, si al fin y al cabo lo que has creado ha sido una matriz de 1 fila, 1 columna, y 9 casillas de profundidad, que si lo dibujas en papel (para verlo mas claro), es un simple vector unidimensional. Y ten en cuenta lo que han comentado de la declaracion y la indexacion. Si te creas un array de 9 posiciones, éstas estaran numeradas de 0 a 8. Por tanto en tu primer bucle, al recorrer las filas (que solo tiene una posicion, la 0 (algo absurdo)), cuando va a dar la segunda vuelta, (j=1), no existe la posicion puntuaciones[1][x][x], por lo que tienes un error en tiempo de ejecucion.

Espero haberme explicado.

Un saludo ;)


Imagen de P22

Sí te has explicado

En primer lugar, gracias por la información, no sabía que tu programases :)

En segundo lugar, y como lo he explicado a joserc87, yo pensé que un array se definía como declaraba, es decir, que empezaban por 0, por eso tiene tan solo 1 dimensión, porque yo quería que tuviese 2x2x10, pero me ha resultado 1x1x9...

 


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de Loopin

Ok sin problema ;) PD; no te

Ok sin problema ;)

PD; no te diste cuenta de estos fallos al ejecutar?

Imagen de P22

Lo cierto es que tenía un problema con la asignación de datos

y era este concreto... Si preguntaba era porque no lo sabía :P

Bueno, muchas gracias, creo que ya puedo pasar el tutorial de arrays a portada gracias a vosotros :D

Un saludo


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de joserc87

Error de declaración.

Creo que la declaración de los vectores están mal. El vector puntuación, ¿quieres que sea de 2x2x10 o de 1x1x9? si es lo primero, pon

float puntuaciones [2][2][10];

En C++ ( y en C) en la declaración de vectores se indica el número de elementos: si quieres 2 elementos pones float array [2]; Luego si que accedes bien (serían los elementos 0 y 1 del vector)

Si es lo segundo, no entiendo por que j y n van de 0 a 1, y además no tendría sentido porque una matriz estática de 1x1x9 es equivalente a un vector de 9 elementos. Lo que no entiendo es como no te casca cuando intentas acceder por ejemplo a posiciones como [1][1][9], que equivaldría a la posición 40 (2*2*10) de un vector de 9 elementos!!

Ten en cuenta que como el usuario introduzca un número > 10 va a reventar de lo lindo también. Yo que tú haría un vector dinámico, reservando memoria en función de la entrada del usuario. O por lo menos comprobar que la entrada <= 10.

 

Saludos!

 


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de P22

Si te he entendido bien, las

Si te he entendido bien, las arrays empiezan por 0, por lo que el error no debería ser ese. Es decir, yo he creado un array de 36 elementos y no 9 como dices tú.

Un saludo y gracias por la ayuda


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de joserc87

Me refiero a la definición del array

Si, al indexar un array se empieza por 0, pero al definirlo tienes que indicar el número de elementos. Por ejemplo si quieres definir un array de 4 posiciones sería:

char cadena [4];

cadena [0] = 'H';

cadena [1] = 'o';

cadena [2] = 'l';

cadena [3] = 'a';

Es decir, una cosa es a la hora de acceder y otra a la hora de definir el array.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de P22

AAAAhhhhh

Jope pues eso no lo sabía :) Muchas gracias por el aviso, ahora lo probaré y te comento si me funcióno

Imagen de Almamu

Ten en cuenta que los arrays

Ten en cuenta que los arrays incluyen el 0 como celda posible, es decir, si haces un array de 9 en realidad tendrá del 0 al 9(10 en total)asi que lleva mucho cuidado con eso. Además, date cuenta de que en el for de pedir los datos lo empiezas del 0, por lo que si cuando vayas a leer el de la primera persona tendrás que usar el 0 y no el 1 como "celda" del array.

Aparte, me he fijado que en los dos primeros for usas j y n con valor maximo de 2, cuando debería ser de 1(recuerda, 0 y 1)(más que nada porque al definir la variable del array la defines con dos arrays de 1(los dos primeros) y uno de 9).


Imagen de P22

Ya

Pero fíjate, yo pongo si es menor a dos, y no si es menor o guall a dos, o lo que es lo mismo, que si empieza en 0, solo tendrá como valores posibles 0 y 1. Luego está el tema de lo de nnotas, que anda igual: si yo le digo al programa que quiero 5 notas, entonces la última celda que usará será la 4, o lo que es lo mismo, i < nnotas.

Un saludo y gracias por la ayuda... Ves algún otro error? :S


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.