Frecuencia en una serie numeria aleatoria

Iniciado por acega, 6 Marzo 2013, 03:17 AM

0 Miembros y 1 Visitante están viendo este tema.

acega

Hola pues me trabe con algo en este programa que consiste en imprimir 30 numeros aleatorios del 1 al 10 y dar la frecuencia de cada numero donde me trabe fue en lo ultimo ya que no supe donde ubicar el switch-case
El código es este:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main (void)
{
int arry[29],f[9];
randomize();

for (int i=0;i<=29;i++)
{

  arry[i]=random(9)+1;
  switch(arry[i])
   {
   case 1:
    f[0]+1;
   break;
   case 2:
    f[1]+1;
   break;
   case 3:
   f[2]+1;
   break;

   case 4:
   f[3]+1;
   break;

   case 5:
   f[4]+1;
   break;

   case 6:
   f[5]+1;
   break;
   case 7:
   f[6]+1;
   break;
   case 8:
   f[7]+1;
   break;
   case 9:
   f[8]+1;
   break;
   case 10:
   f[9]+1;
   break;
   }


}
for (int j=0;j<=29;j++)
  {

   cout<<arry[j]<<" ";
  }
for(int k=0;k<=9;k++)
  {
   cout<<"\n Frecuencia: "<<f[k];
  }

getch();
}

rir3760

Te pido por favor que leas las recomendaciones que te dimos en tu otro tema, eso para solucionar algunos problemas que también se presentan en este programa.

El error principal se encuentra en la sentencia switch:
Código (cpp) [Seleccionar]
switch (arry[i]){
case 1:
   f[0]+1;
   break;
case 2:
   f[1]+1;
   break;
case 3:
   f[2]+1;
   break;

// ...


Primero, para incrementar el contador correspondiente debes utilizar:
Código (cpp) [Seleccionar]
switch (arry[i]){
case 1:
   f[0]++; // Mismo efecto que f[0] = f[0] + 1;
   break;
case 2:
   f[1]++;
   break;
case 3:
   f[2]++;
   break;

// ...


Segundo, si revisas con cuidado te darás cuenta que esa sentencia (el switch) no es necesaria, puedes remplazarla con una asignación:
Código (cpp) [Seleccionar]
f[arry[i] - 1]++;

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

85

Por ahí el muchacho quiso poner:


f[0]+=1;


lo cual incrementa en 1.. Pero le faltaba el '='  :rolleyes:

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

leosansan

#3
Cita de: 85 en  6 Marzo 2013, 04:29 AM
Por ahí el muchacho quiso poner:


f[0]+=1;


lo cual incrementa en 1.. Pero le faltaba el '='  :rolleyes:



;-) ;-)Eso mismo me parece a mí en principio, aunque viendo el resto  de los mensajes del compilador:


|5|error: ':[b]:main' must return 'int'|[/b]
|In function 'int main()':|
|8|error: 'randomize' was not declared in this scope|
|13|error: 'random' was not declared in this scope|
|56|error: 'cout' was not declared in this scope|
|60|error: 'cout' was not declared in this scope|



* Los include está puestos tipo C, es decir ".h " , y no habría mayor problema  ... salvo el iostream, que no lo lleva y hace que el programa ni compile.


Código (cpp) [Seleccionar]
int arry[29],f[9];


* Cuando deberían ser. para contener 30 y 10:

Código (cpp) [Seleccionar]
int arry[30],f[10]={0};



* Además el compilador "se queja" con el tipo void asignado a main pide int.

* Falta al menos


Código (cpp) [Seleccionar]

using namespace std;


* "Canta" con la función randomize, que si es de conio.h deberías cambiarla por la versión estandar del C: srand, así como random por rand y random(9) generaría números hasta 9 no incluido con lo que +1 daría nueve y no se llegaría nunca la case 10. Aunque supongo que el error está en que los quieres desde cero a nueve, ya que así están las condenaciones de los for.

* rand, en C al menos o se especificaría como "rand(9)"


Código (cpp) [Seleccionar]
srand()%9;

Aunque como los quieres incluyendo el diez y a partir de 1 sería:

Código (cpp) [Seleccionar]
1+srand()%10

* getch() pertenece a la librería no estandar conio, que podría sustittuirse por otra estandar, como getchar () o cin.get().

* Los resultados de frecuencia serían" basura", ya que no están inicializados.

* Como comento rir el switch se puede sustituir y sequedaríaría :


Código (cpp) [Seleccionar]
f[arry[i]-1]++;

Con todo esto el resultado sería algo como esto:

Código (cpp) [Seleccionar]
5 7 1 5 9 4 6 10 4 6 7 8 6 10 8 4 9 3 7 8 6 3 8 3 2 3 3 8 6 3
Frecuencia del  1 es  1
Frecuencia del  2 es  1
Frecuencia del  3 es  6
Frecuencia del  4 es  3
Frecuencia del  5 es  2
Frecuencia del  6 es  5
Frecuencia del  7 es  3
Frecuencia del  8 es  5
Frecuencia del  9 es  2
Frecuencia del  10 es  2




Y casi me olvido, el código:

Código (cpp) [Seleccionar]
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main (void){
int arry[30],f[10]={0};
srand((unsigned) time(NULL));
for (int i=0;i<30;i++) {
       arry[i]=1+rand()%10;
       f[arry[i]-1]++;
}
for (int j=0;j<30;j++)
   cout<<arry[j]<<" ";
for(int k=0;k<10;k++)
    cout<<"\n Frecuencia del  "<< k+1 << " es  " <<f[k];
cin.get();
return 0;
}



Saluditos!. ...

acega

oigan! muchas gracias a todos!! si me ayudo a resolver el problema y ademas a estructurar el siguiente programa que me dejaron :D