Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: winnipu en 18 Diciembre 2012, 00:13 am



Título: problema en c
Publicado por: winnipu en 18 Diciembre 2012, 00:13 am
Vereis estoy intentando hacer este ejercicio:
dado un arreglo de 10 valores metidos en source, nos haga un diagrama de barras que represente esos numeros. Barras en vertical.

Hasta ahora lo unico que he conseguido es que las barras aparezcan horizontalmente pero no se como hacerlo de arriba a abajo. Os pego el codigo que llevo:

Código:
#include <stdio.h>


int main(void) {
int valor[10]={7,3,5,10,8,4,1,6,7,5};
int i,j,asteriscos;
printf("Los valores que se van a representar como barras de asteriscos son:\n");
printf("7,3,5,10,8,4,1,6,7,5\n");

for (i=0;i<10;i++){ //abrimos un for que recorre todos los elementos del array.
asteriscos=valor[i]; //le damos a asteriscos el valor numerico de cada elemento del array.

printf("\n");
for (j=0;j<asteriscos;j++) //abrimos otro for para que convierta el numero del array en asteriscos.
printf("*");//se imprime un asterisco por cada valor de j, desde 0 hasta el valor del array.
}
printf("\n");
printf("\n");
printf("Presione una tecla para continuar...");
getchar();
return 0;
}


Título: Re: problema en c
Publicado por: twins en 18 Diciembre 2012, 00:45 am
Disculpa a que te refieres con imprimir de arriba a abajo? algo asi o no.

*  *  *  *
*  *  *  *
*  *  *  *
*      *  *
*      *  *
*          *
*          *
            *
            *
            *


Título: Re: problema en c
Publicado por: winnipu en 18 Diciembre 2012, 01:48 am
correcto, a eso me refiero. Dado el array de numeros, si el primero es 7 deberian salir 7 asteriscos verticales, si el segundo numero es tres, al lado de esos 7 deberian salir 3 asteriscos verticales.



Título: Re: problema en c
Publicado por: naderST en 18 Diciembre 2012, 01:50 am
Vas imprimiendo asteriscos si el valor no es cero, de lo contrario imprimes un espacio en blanco hasta que todos los valores sean cero. Por valores me refiero a cada uno de los elementos del arreglo.


Título: Re: problema en c
Publicado por: winnipu en 18 Diciembre 2012, 02:03 am
Asi?

Código:
#include <stdio.h>


int main(void) {
int valor[10]={7,3,5,10,8,4,1,6,7,5};
int i,x;
printf("Valores a representar como barras de asteriscos son: 7,3,5,10,8,4,1,6,7,5 \n");
printf("\n");
printf("REPRESENTACION GRAFICA: \n");
printf("\n");
for(x=0;x<10;x++){
for(i=0;i<10;i++){
if((valor[i]-x)>0)
printf("*");
else
printf(" ");
}
printf("\n");
}
printf("\n");
printf("Presione una tecla para continuar...");
getchar();
return 0;
}


Título: Re: problema en c
Publicado por: rir3760 en 18 Diciembre 2012, 02:14 am
Solo un detalle, esta condición:
Código
  1. if((valor[i]-x)>0) ...
La puedes reducir a:
Código
  1. if(valor[i] > x) ...

Un saludo


Título: Re: problema en c
Publicado por: naderST en 18 Diciembre 2012, 02:26 am
Asi?

Código:
#include <stdio.h>


int main(void) {
int valor[10]={7,3,5,10,8,4,1,6,7,5};
int i,x;
printf("Valores a representar como barras de asteriscos son: 7,3,5,10,8,4,1,6,7,5 \n");
printf("\n");
printf("REPRESENTACION GRAFICA: \n");
printf("\n");
for(x=0;x<10;x++){
for(i=0;i<10;i++){
if((valor[i]-x)>0)
printf("*");
else
printf(" ");
}
printf("\n");
}
printf("\n");
printf("Presione una tecla para continuar...");
getchar();
return 0;
}

El problema es que lo estás limitando a que el máximo valor es 10, cosa que puede cambiar, por ejemplo si colocas 20 en el arreglo de valores no te lo va a graficar completo.


Título: Re: problema en c
Publicado por: winnipu en 18 Diciembre 2012, 11:20 am
Asi lo he dejado:
Veis algun error?

Código:
#include <stdio.h>


int main(void) {
int valor[10]={7,5,12,15,8,4,18,6,7,5};
int i,x,mayor=0;
for (i=1;i<10;i++){
if (valor[i]>=mayor)
     mayor=valor[i];}
printf("Valores a representar como barras de asteriscos son: 7,5,12,15,8,4,18,6,7,5 \n");
printf("\n");
printf("REPRESENTACION GRAFICA: \n");
printf("\n");
for(x=0;x<mayor;x++){
for(i=0;i<10;i++){
if((valor[i]-x)>0)
printf("*");
else
printf(" ");
}
printf("\n");
}
printf("\n");
printf("Presione una tecla para continuar...");
getchar();
return 0;
}


Título: Re: problema en c
Publicado por: rir3760 en 18 Diciembre 2012, 15:32 pm
Asi lo he dejado:
Veis algun error?
Se te olvido la asignación a la variable "mayor", debería ser (las llaves estaban de mas):
Código
  1. int i,x,mayor;
  2.  
  3. mayor = valor[0];
  4. for (i = 1; i < 10; i++)
  5.   if (valor[i] > mayor)
  6.      mayor = valor[i];

Dos recomendaciones: no coloques comentarios en cada linea indicando lo que hace el lenguaje y cambia esta expresión de la forma en que ya te indique:
Código
  1. if((valor[i]-x)>0) ...

Un saludo


Título: Re: problema en c
Publicado por: winnipu en 18 Diciembre 2012, 15:39 pm
Gracias rir3760 por un minuto me adelante a lo de los comentarios y a inicializar la variable mayor.
« Última modificación: Hoy a las 15:31 por winnipu »    
rir3760« Respuesta #8 en: Hoy a las 15:32

Jejeje. Tomo nota de la linea que mencionas, y la modifiare.Gracias por tus sabios comentarios y ayuda.


Título: Re: problema en c
Publicado por: winnipu en 19 Diciembre 2012, 09:25 am
Gracias tambien a ti naderST


Título: Re: problema en c
Publicado por: paulmil en 22 Diciembre 2012, 18:11 pm
Buenas, tambien estoy aprendiendo a programar en C y por ende cai al foro  ;D

Me pareció buena practica hacer el ejercicio aqui planteado, así que lo hice respetando la solucion propuesta pero con punteros. Ademas los valores del arreglo son cualquier entero e ingresados por teclado

Código
  1. #include <stdio.h>
  2. #define MAX 10
  3.  
  4. int arreglo[MAX], cont = 0;
  5.  
  6. void imprime_horizontal(int *p);
  7. void imprime_vertical(int *q);
  8.  
  9. int main(void) {
  10. /** Ingresa valores del arreglo */
  11. for (cont = 0; cont < MAX; cont++) {
  12. printf("arreglo[%d] = ", cont);
  13. scanf("%d", &arreglo[cont]);
  14. fflush(stdin);
  15. }
  16. printf("\n\n");
  17.  
  18. /** Imprime diagrama horizontal */
  19. imprime_horizontal(arreglo);
  20. printf("\n");
  21.  
  22. /** Imprime diagrama vertical */
  23. imprime_vertical(arreglo);
  24. printf("\n");
  25.  
  26. printf("Presione una tecla para continuar...");
  27. return 0;
  28. }
  29.  
  30. /**
  31.  * Imprime los valores del arreglo formando un diagrama de barras horizontal
  32.  * @param p Puntero del arreglo a imprimir
  33.  */
  34. void imprime_horizontal(int *p){
  35. int x = 0, y = 0;//Ejes del diagrama
  36.  
  37. for (y = 0; y < MAX; y++) {
  38.    for (x = 0; x < *(p + y); x++) {
  39.     printf("*");
  40.    }
  41.    printf("\n");
  42. }
  43.  
  44. }
  45.  
  46. /**
  47.  * Imprime los valores del arreglo formando un diagrama de barras vertical
  48.  * @param q Puntero del arreglo a imprimir
  49.  */
  50. void imprime_vertical(int *q){
  51. int referencia = 0;
  52. int x = 0, y = 0;//Ejes del diagrama
  53.  
  54. for (cont = 0; cont < MAX ; cont++) {
  55. if ( *(q + cont) > referencia) {
  56.    referencia = *(q + cont);
  57. }
  58. }
  59.  
  60. for (y = 0; y < referencia; y++) {
  61. for (x = 0; x < MAX; x++) {
  62. if ( *(q + x) > y) printf("*");
  63. else printf(" ");
  64. }
  65.    printf("\n");
  66. }
  67. }

Saludos