Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con histograma en c++

Estas en el tema de Problema con histograma en c++ en el foro de C/C++ en Foros del Web. Hola que tal a todos pues la neta no crei llegar a estos extremos, siempre me tocaba ayudar aqui pero esta vez ya no pude, ...
  #1 (permalink)  
Antiguo 08/06/2011, 17:40
 
Fecha de Ingreso: abril-2011
Ubicación: Guadalajara, Jalisco, Mexico
Mensajes: 27
Antigüedad: 13 años
Puntos: 4
Pregunta Problema con histograma en c++

Hola que tal a todos pues la neta no crei llegar a estos extremos, siempre me tocaba ayudar aqui pero esta vez ya no pude, cada vez que le intento pues me ago mas bolas, creo que los arreglos no son mi fuerte.
bueno pues tengo un programa sobre un arreglo N en el cual el usuario ingresa el tamaño y lo llena, lo ue tengo que hacer es modificar el arreglo para que los caracteres queden de manera no decreciente e imprimirlos con asteriscos, hasta ahi no hay problema. el problema es a la hora de voltear el histograma y hacer otro arreglo!!!
para ser mas especifico:
Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.     int limite;
  6.     int x = 30;
  7.     int y = 2;
  8.     int menor = 0;
  9.     int mayor;
  10.    
  11.     std::cout<<"Cuantos numeros quieres: ";//pide al usuario hasta que numero llegar
  12.     std::cin>>limite;
  13.     int Asteriscos[limite];
  14.    
  15.     for(int i = 0;i < limite; i++){
  16.         std::cout<<"Ingresa el "<<i+1<<" caracter: ";//se pide y se guardan los valores de cada casilla
  17.         std::cin>>Asteriscos[i];  
  18.     }
  19.     system("cls");
  20.    
  21.     for(int i = 0;i < limite;i++){
  22.          for(int e = i; e < limite;e++){
  23.              if(Asteriscos[i] > Asteriscos[e]){//ago un metodo burbuja pra que los guarde
  24.                  menor = Asteriscos[i];        //de manera ascendente
  25.                  Asteriscos[i] = Asteriscos[e];
  26.                  Asteriscos[e] = menor;
  27.                  mayor = Asteriscos[e];
  28.              }
  29.          }
  30.     }
  31.     for(int i = mayor; i >= 0; i--){  
  32.         for(int k = 0; k < limite;k++){
  33.             if(Asteriscos[k] > i)
  34.                 std::cout<<"*";
  35.             else
  36.                 std::cout<<" ";
  37.         }
  38.         std::cout<<"\n";
  39.     }
  40.     ////////////////////////////
  41.     for(int i= 0;i < limite;i++)
  42.         std::cout<<"_";
  43.     std::cout<<"\n\n";
  44.     for(int i = 0;i < limite; i++){//esto es para que se vea  bonitos
  45.         std::cout<<Asteriscos[i];
  46.     }
  47.     ////////////////////////////
  48.     std::cout<<"\n\n";            
  49.    
  50.     std::cin.get();
  51.     std::cin.get();
  52.  
  53.     return 0;
  54. }

bueno pues hasta ahi todo va bien lo malo es por ejemplo:
el usuario ingresa el arreglo asi:
Código C++:
Ver original
  1. arregloEjemplo[8];

imaginemos que ya introdujo los valores y que da asi :
Código C++:
Ver original
  1. arregloEjemplo[1,1,2,4,7,7,8,11];  -------> arregloEjemplo2[1,1,1,2,4,4,4,5,5,6,8];
si se fijan el caracter del primer arreglo es 11 y el tamaño del segundo arreglo seria tambien de 11 pudiendo hacer esto posible con cada caracter al momento de imprimirlo se voltearia el histograma, eso es lo que aun no puedo, alguien me puede dar un empujoncito??!!
  #2 (permalink)  
Antiguo 09/06/2011, 09:57
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años
Puntos: 71
Respuesta: Problema con histograma en c++

Veo un error muy común en tu código; que es el de asignar el tamaño de un ventor con el contenido de una variable leida desde el teclado. Esto no es válido (en tu código) pués las formas de colocar dimensión al vector, son:

1) Definir una macro con su longitud, por ejemplo:
Código C++:
Ver original
  1. #define longitud 100
  2.  
  3. int main
  4. {
  5. int miVector[longitud];
  6. return 0;
  7. }

2) Con una constante, de esta forma

Código C++:
Ver original
  1. int main
  2. {
  3. const int longitud 100;
  4. int miVector[longitud];
  5. return 0;
  6. }

3) Finalmente el más complejo y que sería lo que buscas; lo malo requiere que sepas crear DINAMICAMENTE un vector, lo que pasa por saber usar punteros y la invocación a las funciones malloc o calloc que extraen la memoria que necesitas.

Te recomiendo usar también

Código C++:
Ver original
  1. using namespace std;

para poder simplificar tu código.
Espero te sirva, y si hay alguna duda me escribes.
__________________
%
El mejor guerrero no es el que triunfa siempre sino el que vuelve sin miedo a la batalla.
%

Última edición por CapacProg; 09/06/2011 a las 10:05
  #3 (permalink)  
Antiguo 09/06/2011, 10:39
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con histograma en c++

Por lo que dijo el compañero CapacProg te recomiendo usar new.
int * Asteriscos = new int [limite];
Con eso basta. Despues todo lo demas es normal.

Con respecto a tu duda no logro enteneder la funcionalidad de tu codigo. En alguno lugares hablas de invertir el orden pero lo estas ordenando. Hablas de crear otro arreglo pero nunca lo haces. Podrias detallar mas tus dudas.
  #4 (permalink)  
Antiguo 10/06/2011, 14:59
 
Fecha de Ingreso: abril-2011
Ubicación: Guadalajara, Jalisco, Mexico
Mensajes: 27
Antigüedad: 13 años
Puntos: 4
Respuesta: Problema con histograma en c++

pues gracias a los dos pero en si pues la respuesta que busco es mas compleja, ya que si es necesario que el arreglo sea el que el usuario ingrese, eso es lo que lo hace mas complejo de todo, para no hacerla larga en ese código que ven solo es la mitad de lo que necesito, no puse el código completo ya que pues es lo que llevo bien, tenia mas el caso es que quise hacer trampa volteando el histograma que aparece, pero pues cundo me lo revisaron me dijeron que estaba mal, lo que en verdad necesito es lo que ya vengo mencionando
Código C++:
Ver original
  1. arregloEjemplo[1,1,2,4,7,7,8,11];  -------> arregloEjemplo2[1,1,1,2,4,4,4,5,5,6,8];
si lo pudieran abstraer se darían cuenta que si imprimo el primero con el codigo, el histograma se ve de manera no decreciente, y si imprimo el segundo también, pero se darán cuenta de que el segundo es el mismo histograma que el primero, pero el histograma se imprimiría "volteado", eso es lo que en verdad tiene que hacer el programa, y gracias por las observaciones!!
  #5 (permalink)  
Antiguo 21/06/2011, 16:38
 
Fecha de Ingreso: abril-2011
Ubicación: Guadalajara, Jalisco, Mexico
Mensajes: 27
Antigüedad: 13 años
Puntos: 4
Respuesta: Problema con histograma en c++

por fin!!
despues de nose cuantos dias!!
lo bueno fue que no me rendi, pues aqu esta el codigo, ya que pues no recibi ayuda!!
jajaja!!
Código C++:
Ver original
  1. #include <iostream>
  2. //#include <windows.h>
  3.  
  4. int main()
  5. {
  6.     system("color 0e");
  7.     int limite;
  8.     int x = 0;
  9.     int y = 0;
  10.     int menor = 0;
  11.     int mayor = 0;
  12.    
  13.     std::cout<<"Cuantos numeros quieres: ";//pide al usuario hasta que numero llegar
  14.     std::cin>>limite;
  15.     int Asteriscos[limite];
  16.    
  17.     for(int i = 0;i < limite; i++)
  18.     {
  19.             std::cout<<"Ingresa el "<<i+1<<" caracter: ";//se pide y se guardan los valores de cada casilla
  20.             std::cin>>Asteriscos[i];
  21.             std::cout<<Asteriscos[i];  
  22.     }
  23.     system("cls");
  24.    
  25.     for(int i = 0;i < limite;i++){
  26.          for(int e = i; e < limite;e++){
  27.              if(Asteriscos[i] > Asteriscos[e]){//Hago un metodo burbuja pra que los guarde
  28.                  menor = Asteriscos[i];        //de manera ascendente
  29.                  Asteriscos[i] = Asteriscos[e];
  30.                  Asteriscos[e] = menor;
  31.                  mayor = Asteriscos[e];
  32.              }
  33.              else
  34.                  mayor = Asteriscos[i];
  35.          }
  36.     }
  37.    
  38.     int histograma[mayor];
  39.     for(int i = (mayor-1); i >= 0; i--){  
  40.         for(int k = 0; k < limite;k++){//esta parte me costo un webote hacerlo pero parece que ya funciona
  41.             if(Asteriscos[k] > i){
  42.                 std::cout<<"*";
  43.                 x++;
  44.             }
  45.             else{
  46.                 std::cout<<" ";  
  47.             }
  48.         }
  49.         histograma[y] = x;
  50.         y++;
  51.         x = 0;
  52.         std::cout<<"\n";
  53.     }
  54.     ////////////////////////////
  55.     for(int i= 0;i < limite;i++)
  56.        
  57.         std::cout<<"_";
  58.        
  59.     std::cout<<"\n\n";
  60.     for(int i = 0;i < limite; i++){//esto es para que se vea  bonitos
  61.         std::cout<<Asteriscos[i];
  62.     }
  63.     ////////////////////////////
  64.     std::cout<<"\n\n";
  65.      
  66.      for(int i = (limite-1); i >= 0; i--){  
  67.         for(int k = 0; k < mayor;k++){//esta parte me costo un webote hacerlo pero parece que ya funciona
  68.             if(histograma[k] > i){
  69.                 std::cout<<"*";
  70.             }
  71.             else{
  72.                 std::cout<<" ";  
  73.             }
  74.         }
  75.         std::cout<<"\n";
  76.     }
  77.     ////////////////////////////
  78.     for(int i= 0;i < mayor;i++)
  79.        
  80.         std::cout<<"_";
  81.        
  82.     std::cout<<"\n\n";
  83.     for(int i = 0;i < mayor; i++){//esto es para que se vea  bonitos
  84.         std::cout<<histograma[i];
  85.     }
  86.      
  87.     std::cin.get();
  88.     std::cin.get();
  89.  
  90.     return 0;
  91. }
  #6 (permalink)  
Antiguo 22/06/2011, 13:33
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con histograma en c++

Ayuda recibiste!! el problema fue qeu nunca explicaste que era lo que necesitabas. De la nada pusiste dos array de ejemplo pero no especificaste como se construian. Uno si, el otro no. ASi que fue imposible ayudar.
  #7 (permalink)  
Antiguo 25/06/2011, 08:50
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años
Puntos: 71
Respuesta: Problema con histograma en c++

Cita:
Iniciado por paracoccidio Ver Mensaje
por fin!!
despues de nose cuantos dias!!
lo bueno fue que no me rendi, pues aqu esta el codigo, ya que pues no recibi ayuda!!
jajaja!!
Código C++:
Ver original
  1. #include <iostream>
  2. //#include <windows.h>
  3.  
  4. int main()
  5. {
  6.     system("color 0e");
  7.     int limite;
  8.     int x = 0;
  9.     int y = 0;
  10.     int menor = 0;
  11.     int mayor = 0;
  12.    
  13.     std::cout<<"Cuantos numeros quieres: ";//pide al usuario hasta que numero llegar
  14.     std::cin>>limite;
  15.     int Asteriscos[limite];
  16.    
  17.     for(int i = 0;i < limite; i++)
  18.     {
  19.             std::cout<<"Ingresa el "<<i+1<<" caracter: ";//se pide y se guardan los valores de cada casilla
  20.             std::cin>>Asteriscos[i];
  21.             std::cout<<Asteriscos[i];  
  22.     }
  23.     system("cls");
  24.    
  25.     for(int i = 0;i < limite;i++){
  26.          for(int e = i; e < limite;e++){
  27.              if(Asteriscos[i] > Asteriscos[e]){//Hago un metodo burbuja pra que los guarde
  28.                  menor = Asteriscos[i];        //de manera ascendente
  29.                  Asteriscos[i] = Asteriscos[e];
  30.                  Asteriscos[e] = menor;
  31.                  mayor = Asteriscos[e];
  32.              }
  33.              else
  34.                  mayor = Asteriscos[i];
  35.          }
  36.     }
  37.    
  38.     int histograma[mayor];
  39.     for(int i = (mayor-1); i >= 0; i--){  
  40.         for(int k = 0; k < limite;k++){//esta parte me costo un webote hacerlo pero parece que ya funciona
  41.             if(Asteriscos[k] > i){
  42.                 std::cout<<"*";
  43.                 x++;
  44.             }
  45.             else{
  46.                 std::cout<<" ";  
  47.             }
  48.         }
  49.         histograma[y] = x;
  50.         y++;
  51.         x = 0;
  52.         std::cout<<"\n";
  53.     }
  54.     ////////////////////////////
  55.     for(int i= 0;i < limite;i++)
  56.        
  57.         std::cout<<"_";
  58.        
  59.     std::cout<<"\n\n";
  60.     for(int i = 0;i < limite; i++){//esto es para que se vea  bonitos
  61.         std::cout<<Asteriscos[i];
  62.     }
  63.     ////////////////////////////
  64.     std::cout<<"\n\n";
  65.      
  66.      for(int i = (limite-1); i >= 0; i--){  
  67.         for(int k = 0; k < mayor;k++){//esta parte me costo un webote hacerlo pero parece que ya funciona
  68.             if(histograma[k] > i){
  69.                 std::cout<<"*";
  70.             }
  71.             else{
  72.                 std::cout<<" ";  
  73.             }
  74.         }
  75.         std::cout<<"\n";
  76.     }
  77.     ////////////////////////////
  78.     for(int i= 0;i < mayor;i++)
  79.        
  80.         std::cout<<"_";
  81.        
  82.     std::cout<<"\n\n";
  83.     for(int i = 0;i < mayor; i++){//esto es para que se vea  bonitos
  84.         std::cout<<histograma[i];
  85.     }
  86.      
  87.     std::cin.get();
  88.     std::cin.get();
  89.  
  90.     return 0;
  91. }
Usa el espacio de nombres std, para que no hagas std::XXX
__________________
%
El mejor guerrero no es el que triunfa siempre sino el que vuelve sin miedo a la batalla.
%

Etiquetas: arreglos, c++, histograma
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:52.