[C con Clase] Array 2D: Frecuencia relativa con respecto a cada fila

Steven Davidson steven en conclase.net
Lun Feb 19 00:29:03 CET 2007


Hola Bárbara,

El pasado 2007-02-18 23:01:25, Bárbara escribió:

B> Hola!

Antes de todo, bienvenida a la lista y a este "mundillo" de la programación en C++.

[CORTE]

B> f(11)= 5/10; 
B> f(12)= 4/10
B> f(13)=1/10
B> He usado el siguiente bucle:
B>  for (i=1; i<=filas; i++)
B>    for (j=1; j<=columnas; j++)
B>    {   
B>     f[i][j]=n[i][j]/total[i];
B> }
B> n=número de cada celdilla de la tabla
B> total[i]= suma de los valores asignados a cada una de las celdillas de la fila i
B> (Ejemplo: n(11)=5, n(12)=4, n(13)=1; total(1)=10)
B> El caso es que, una vez ejecutado, el valor de la frecuecnai relativa en todas las celdillas es 0.000, aún habiendo introducido ya el valor de n[i][j] (número correspondiente a cada celdilla) y habiendo comprobado que el compilador los ha almacenado.
B> Espero qeu podáis ayudarme, llevo peleándome con el programa ya un siglo y no consigo que funcione. Muchas gracias adelantadamente

Tienes dos errores lógicos:

1. Los índices para los arrays en C y C++ SIEMPRE empiezan por 0 (cero). Por lo tanto, el índice para el último elemento equivale al tamaño del array menos 1. Por ejemplo,

int lista[10];


for( int i=0; i<10; i++ )
  lista[i] = 2*i;

En el código que nos diste, no sigues estas reglas. Deberías escribir:

for( i=0; i<filas; i++ )
 for( j=0; j<columnas; j++ )
    f[i][j] = n[i][j]/total[i];

2. En cuanto a tu problema de obtener resultados de 0 (cero), esto viene a consecuencia de usar valores de tipo 'int'. Brevemente, la regla semántica con los operadores aritméticos es la siguiente:

El resultado de una operación aritmética es un valor del mismo tipo que los dos operandos. Esquemáticamente, es lo siguiente:

<tipo> / <tipo> => <tipo>

Por ejemplo,

<int> / <int> => <int>
<float> * <float> => <float>
<unsigned long> - <unsigned long> => <unsigned long>
etcétera

En tu caso, seguramente los arrays 'n' y 'total' son de tipo 'int'. Por lo tanto, el resultado de la división es un entero. Si quieres un valor de otro tipo, entonces tendremos que hacer un cambio de tipo (cásting) a uno de los operandos. Esto sería,

for( i=0; i<filas; i++ )
 for( j=0; j<columnas; j++ )
    f[i][j] = (float)n[i][j] / total[i];

Para que esto funcione correctamente, el array 'f' debe ser declarado para contener elementos de tipo 'float' o incluso 'double', si te interesa.


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase