TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: WarriorofAVR3600 en 17 de Octubre de 2016, 20:17:06

Título: AVR, C++, areglos de datos
Publicado por: WarriorofAVR3600 en 17 de Octubre de 2016, 20:17:06
Que tal buenas tardes, mi maestro me ha pedido un arreglo de datos en donde el me dara 30 numeros de un solo digito, de 0 a 9, al cabo de ingresar esos 30 datos, el programa debe imprimir el numero que se repite mas veces y las veces que se repitio ese numero en dos display de 7 segmentos, lo de el display ya lo tengo resuelto puesto que se la programacion y todo eso, pero en lo referente al analisis de datos no se como puedo desarrollar el arreglo, me gustaria que me puedan dar una idea de como realizarlo puesto que soy nuevo con esto de los arreglos y desconozco la manera en la que lo pueda desarrollar espero me puedan ayudar...muchas gracias
Título: Re:AVR, C++, areglos de datos
Publicado por: KILLERJC en 17 de Octubre de 2016, 22:58:26
Estoy suponiendo que los datos son ingresados por un teclado o por una comunicacion serial y usando C!

Crea un array con 10 variables de 8 bits.

Código: C
  1. uint8_t Cantidad[10];

Cuando detectes el numero incrementas la cantidad segun el indice. Ejemplo.

Código: C
  1. uint8_t Cantidad[10];
  2. uint8_t total_numeros = 0;
  3.  
  4. while(1)
  5. {
  6.      Numero = numero_recibido();  //Supone que esta funcion te da el numero de 0 a 9
  7.      Cantidad[Numero]++;
  8.      total_numeros++;
  9.      if(total_numeros >= 30 )
  10.      {
  11.            //Mostrar aca.
  12.            //Poner a 0 el array Cantidad, asi comienza de vuelta
  13.            //Poner a 0 la variable total_numeros
  14.       }
  15. }

De esa forma en Cantidad[0] tendrias las veces que se presiono el 0, en Cantidad[1] las veces que se presiono 1. Y asi sucesivamente.
Lo unico que tendrias que hacer luego de que pasen los 30 numeros es verificar cual es que se presiono mas veces. el indice te va a dar el numero y el contenido la cantidad.

Código: C
  1. indice_maximo = 0;
  2. for( i = 0; i<10; i++)
  3. {
  4.         if ( Cantidad[i] > Cantidad[indice_maximo] )
  5.         {
  6.                 indice_maximo = i
  7.         }
  8. }
  9.  
  10.         // Numero mas veces presionado:
  11.         Mostrar(indice_maximo);
  12.  
  13.         // Cantidad de veces presionadas:
  14.         Mostrar(Cantidad[indice_maximo];

Lo unico que si te fijas en la comparacion pido que sea mayor, es decir que si se presiono la misma cantidad de veces el 4 y el 5, el que sea menor va a "ganar", si la condicion hubiera sido mayor o igual, entonces era el 5.

En caso de que el te de un array con 30 valores, y usando C

Reemplazar:

Código: C
  1. Numero = numero_recibido();  //Supone que esta funcion te da el numero de 0 a 9

por

Código: C
  1. for( i = 0; i<30; i++)
  2. {
  3.         Cantidad[Valores_profe[i]];
  4. }


En caso de que te de un vector, y lo quieras hacer en C++, tal ves quieras ver esto, que fue realizado para un string pero que podrias usarlo para numeros tambien:

Código: C
  1. int main() {
  2.     int max = 0;
  3.     int result = 0;
  4.     unsigned int rep_count = 1;
  5.     string words;
  6.     vector<string> vec;
  7.  
  8.     cout << "Please enter your words " << endl;
  9.     while(cin>>words && words != "qu"){
  10.         vec.push_back(words);
  11.     }
  12.  
  13.     if (!vec.size())
  14.         return 0;
  15.  
  16.     for(unsigned int i = 1; i < vec.size(); i++){
  17.         if (vec[i] == vec[i-1]) {
  18.             rep_count++;
  19.         } else {
  20.             rep_count = 1;
  21.         }
  22.         if (rep_count > max) {
  23.             result = i;
  24.             max = rep_count;
  25.         }
  26.     }
  27.     cout<<"Word = "<<vec[result]<<", Repitition = "<<max<<endl;
  28.     return 0;
  29. }

o usar count si es que busca mas que nada que aprendan C++ y no programacion y un poco de ingenio

http://www.cplusplus.com/reference/algorithm/count/
Título: Re:AVR, C++, areglos de datos
Publicado por: IIIC en 18 de Octubre de 2016, 01:38:06
Yo propongo una optimización para que cuando termines de ingresar los numeros ya no tengas que hacer de nuevo un For,
ademas hizo falta la declaración de la variable "Numero"

Código: C
  1. uint8_t Cantidad[10];
  2.     uint8_t total_numeros = 0;
  3.     uint8_t Numero = 0;
  4.    
  5.     uint8_t numero_mas_repetido = 0;
  6.     uint8_t veces = 0;
  7.    
  8.      
  9.     while(1)
  10.     {
  11.          Numero = numero_recibido();  //Supone que esta funcion te da el numero de 0 a 9
  12.          Cantidad[Numero]++;
  13.        
  14.          if(veces < Cantidad[Numero])
  15.          {
  16.                 veces = Cantidad[Numero];
  17.                 numero_mas_repetido = Numero;  
  18.          }
  19.          
  20.          total_numeros++;
  21.          
  22.          if(total_numeros >= 30 )
  23.          {
  24.                //Mostrar aca.
  25.                //Poner a 0 el array Cantidad, asi comienza de vuelta
  26.                //Poner a 0 la variable total_numeros
  27.                //terminar el while
  28.          }
  29.     }


Y en caso de que te de el array de valores, quedaria asi:


Código: C
  1. uint8_t Numero[30] = {1,4,6,7,8,3,4,6,2,5,4,7,6,8,5,6,4,3,2,3,4,5,4,6,7,8,7,6,5,4};
  2.     uint8_t Cantidad[10];
  3.        
  4.     uint8_t numero_mas_repetido = 0;
  5.     uint8_t veces = 0;
  6.          
  7.     for(uint8_t i=0; i < 30; i++)
  8.     {        
  9.          Cantidad[Numero[i]]++;
  10.        
  11.          if(veces < Cantidad[Numero[i]])
  12.          {
  13.                 veces = Cantidad[Numero[i]];
  14.                 numero_mas_repetido = Numero[i];       
  15.          }                               
  16.     }
  17.  
  18.     //A partir de aqui continuamos con el despliege de mensajes


Saludos
Título: Re:AVR, C++, areglos de datos
Publicado por: WarriorofAVR3600 en 18 de Octubre de 2016, 22:33:59
Yo propongo una optimización para que cuando termines de ingresar los numeros ya no tengas que hacer de nuevo un For,
ademas hizo falta la declaración de la variable "Numero"

Código: C
  1. uint8_t Cantidad[10];
  2.     uint8_t total_numeros = 0;
  3.     uint8_t Numero = 0;
  4.    
  5.     uint8_t numero_mas_repetido = 0;
  6.     uint8_t veces = 0;
  7.    
  8.      
  9.     while(1)
  10.     {
  11.          Numero = numero_recibido();  //Supone que esta funcion te da el numero de 0 a 9
  12.          Cantidad[Numero]++;
  13.        
  14.          if(veces < Cantidad[Numero])
  15.          {
  16.                 veces = Cantidad[Numero];
  17.                 numero_mas_repetido = Numero;  
  18.          }
  19.          
  20.          total_numeros++;
  21.          
  22.          if(total_numeros >= 30 )
  23.          {
  24.                //Mostrar aca.
  25.                //Poner a 0 el array Cantidad, asi comienza de vuelta
  26.                //Poner a 0 la variable total_numeros
  27.                //terminar el while
  28.          }
  29.     }


Y en caso de que te de el array de valores, quedaria asi:


Código: C
  1. uint8_t Numero[30] = {1,4,6,7,8,3,4,6,2,5,4,7,6,8,5,6,4,3,2,3,4,5,4,6,7,8,7,6,5,4};
  2.     uint8_t Cantidad[10];
  3.        
  4.     uint8_t numero_mas_repetido = 0;
  5.     uint8_t veces = 0;
  6.          
  7.     for(uint8_t i=0; i < 30; i++)
  8.     {        
  9.          Cantidad[Numero[i]]++;
  10.        
  11.          if(veces < Cantidad[Numero[i]])
  12.          {
  13.                 veces = Cantidad[Numero[i]];
  14.                 numero_mas_repetido = Numero[i];       
  15.          }                               
  16.     }
  17.  
  18.     //A partir de aqui continuamos con el despliege de mensajes


Saludos
Que tal y si es en C++, estoy programando un atmega, como quedaria en C++, no se si se manejen igual, y si el me dara los 30 numeros si me sirvio para darme una idea