Autor Tema: AVR, C++, areglos de datos  (Leído 3814 veces)

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

Desconectado WarriorofAVR3600

  • PIC10
  • *
  • Mensajes: 2
AVR, C++, areglos de datos
« 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:AVR, C++, areglos de datos
« Respuesta #1 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/
« Última modificación: 17 de Octubre de 2016, 23:07:31 por KILLERJC »

Desconectado IIIC

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
Re:AVR, C++, areglos de datos
« Respuesta #2 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
« Última modificación: 18 de Octubre de 2016, 01:40:12 por IIIC »
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."

Albert Einstein

Desconectado WarriorofAVR3600

  • PIC10
  • *
  • Mensajes: 2
Re:AVR, C++, areglos de datos
« Respuesta #3 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