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
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 ;)
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
Ok sin problema ;) PD; no te
Ok sin problema ;)
PD; no te diste cuenta de estos fallos al ejecutar?
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
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!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
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
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.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
AAAAhhhhh
Jope pues eso no lo sabía :) Muchas gracias por el aviso, ahora lo probaré y te comento si me funcióno
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).
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