Affichage histogramme en c

frez -  
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
je bloque sur un programme qui construit un histogramme.Je l'ai fait mais j'ai l'affichage inverse de ce qui est demandée,voici l'énoncé complet:
On se propose de construire un histogramme décrivant la répartition des valeurs des
éléments d’un vecteur tel que celui-ci :
{ 2, 3, 7, 6, 9,11,12,15,18,17, 14,13,12, 7, 8, 7, 5, 3, 2, 1, 1, 0, 2, 8,11,13,12,11, 6, 3};
Le programme affichera l’histogramme dans la fenêtre du terminal, en utilisant des blancs et des étoiles.
1. Écrire une fonction dont le prototype est : void histog(int v[], int nb)
2. Modifier le programme afin de pouvoir choisir la hauteur de l’histogramme. Le
prototype devient : void histog(int v[], int nb, int H).



voici mon code source:


#include <stdio.h>
#include <stdlib.h>

void histog(int v[], int nb)
{
int i,j,k;
for(i=0;i<nb;i++)
{
k=v[i];
for(j=0;j<k+1;j++)
{

printf("*");

}
printf("\n");

}

}
int main()
{
int v[]={2,3,7,6,9,11,12,15,18,17,14,13,12,7,8,7,5,3,2,1,1,0,2,8,11,13,12,11,6,3};
histog(v,30);


return 0;
}


4 réponses

Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
Bonjour,

Qu'est-ce que tu appelles l'affichage inverse?
Le programme trace bien l'histogramme (avec 2*, puis 3*, ...)

Mais l'énoncé semble indiquer qu'il faudrait plutôt (1 espace+étoile, 2espaces + étoile, ...)
0
frez
 
En fait, il faut afficher 3 étoiles de maniere verticale,ensuite 4 étoiles,toujours de maniere verticale et ainsi de suite.Or moi j'ai l'affichage de maniere horizontale.
c'est a dire comme ça:
°°°
°°°°
°°°°°°°°
l'affichage doit se faire verticalement.
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
void histog(const int v[], int nb)
{
    int i;

    // rechercher le max de la table
    int mx = 0;

    for ( i = 0 ; i < nb ; i++ )
    {
        if ( v[i] > mx )
            mx = v[i];
    }

    // tracer les points visibles de l'histogramme en commeçant par le plus haut
    for ( ; mx >= 0 ; mx-- )
    {
        for ( i = 0 ; i < nb ; i++ )
        {
            if ( v[i] >= mx )
                fputc( '*' , stdout );
            else
                fputc( ' ' , stdout );
        }
        printf( "\n" );
    }
}
0
frez
 
Merci, mais il y'a des choses que j'ai pas compris:
a quoi sert cette boucle:for ( ; mx >= 0 ; mx-- ), la syntaxe aussi je ne l'ai pas bien compris.
0
frez
 
c'est bon j'ai compris!mais j'ai des problemes pour tracer l'histogramme avec une hauteur choisie
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
Bonjour,

La première partie de la fonction détermine la hauteur.
La seconde trace l'histogramme de la hauteur calculée.

Pour une fonction recevant la hauteur, j’ôterais la première partie.
0