DOMANDA Creare un istogramma verticale in C

Pubblicità

dalca

Nuovo Utente
Messaggi
9
Reazioni
1
Punteggio
1
Bungiorno a tutti,
un esercizio in C mi chiede di fare un programma che, immessi da tastiera 5 numeri interi, mi stampi un istogramma verticale con tanti asterischi quanti sono indicati dalle cifre immesse.

Il listato che ho fatto è il seguente;
C:
#include <stdio.h>

#define DIM 5

int main(void) {
    int numeri[10];
    int i, j, min, max;
    
    printf("\nInserici %d numeri interi:\n", DIM);
    for(i = 0; i < DIM; i++) {
        scanf("%d", &numeri[i]);
    }
    

    max = numeri[0];
    for(i = 0; i < DIM; i++) {
        if(max < numeri[i]) {
            max = numeri[i];
        }
    }
    printf("\nIl numero massimo è %d\n", max);
    
    min = numeri[0];
    for(i = 0; i < DIM; i++) {
        if(min > numeri[i]) {
            min = numeri[i];
        }
    }
    printf("Il numero minimo è %d\n", min);
    
    for(j = max; j > 0; j--) {
        for(i = 0; i < DIM; i++) {
            if(numeri[i] >= j) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}

Il punto è che se immetto interi positivi funziona mentre non funziona se immetto interi negativi.
Qualcuno mi può indicare come posso procedere per fare in modo che funzioni anche con numeri negativi?

Grazie
 
come posso procedere per fare in modo che funzioni anche con numeri negativi?
quando inserisci numeri negativi, nel ciclo che fa le stampe (l'ultimo), la condizione j>0 non è verificata (j parte da max e poi sottrae 1); se inserisci sia positivi che negativi ti stamperà solo colonne corrispondenti a numeri positivi
d'altra parte se, per esempio, inserisci il numero 2, il programma ti stampa 2 asterischi, ma se inserisci "-2" non puoi stampare "-2" asterischi...
insomma, per come lo intepreto è corretto che funzioni solo con numeri positivi
 
Grazie per la risposta Bat. Sto cercando un modo di stampare a video un grafico tipo quello dell'immagina qui sotto.
Non prendere in considerazione la doppia lineetta sul 6.
Schermata del 2024-12-10 17-27-00.webp
 
Ultima modifica da un moderatore:
C:
#include <stdio.h>

#define N 10

int main()
{
    int v[N] = {7, 13, -3, 5, -10, 1, -7, -2, 0, 6};

    //RICERCA MASSIMO E MINIMO
    int max = v[0];
    int min = v[0];
    for(unsigned int i = 1; i < N; ++i)
    {
        if(v[i] > max)
        {
            max = v[i];
        }
        else if(v[i] < min)
        {
            min = v[i];
        }
    }

    //STAMPA ISTOGRAMMA
    for(int i = max, i_min = min < 0 ? min : 0; i >= i_min; --i)
    {
        printf("\n%3d  ", i);
        for(unsigned int j = 0; j < N; ++j)
        {
            printf(i ? ((i > 0 ? v[j] >= i : v[j] <= i) ? "  *  " : "     ") : "-----");
        }
    }
    printf("\n\n    ");
    for(unsigned int i = 0; i < N; ++i)
    {
        printf(" %3d ", v[i]);
    }
    printf("\n");
}

Output:
Codice:
 13         *
 12         *
 11         *
 10         *
  9         *
  8         *
  7    *    *
  6    *    *                                       *
  5    *    *         *                             *
  4    *    *         *                             *
  3    *    *         *                             *
  2    *    *         *                             *
  1    *    *         *         *                   *
  0  --------------------------------------------------
 -1              *         *         *    *
 -2              *         *         *    *
 -3              *         *         *
 -4                        *         *
 -5                        *         *
 -6                        *         *
 -7                        *         *
 -8                        *
 -9                        *
-10                        *

       7   13   -3    5  -10    1   -7   -2    0    6

Process returned 0 (0x0)   execution time : 0.021 s

Se qualcosa non è chiaro, chiedi pure.
 
Ho studiato il tuo listato @M1n021 e la parte più ostica per me è l'operatore ternario all'interno della printf:
printf(i ? ((i > 0 ? v[j] >= i : v[j] <= i) ? " * " : " ") : "-----");
Riesci a spiegarmelo o a darmi delle dritte per capirlo?
Grazie.
 
Sostituendo gli operatori ternari con if/else, quella riga di codice diventa:

C:
if(i == 0)
{
    printf("-----");
}
else if((i > 0 && v[j] >= i) || (i < 0 && v[j] <= i))
{
    printf("  *  ");
}
else
{
    printf("     ");
}

Adesso risulta più chiaro?
 
Ora per me è più chiaro, gli operatori if/else mi sono più familiari.
Comunque ho cominciato a fare qualche esercizio con gli operatori ternari perché devo imparare ad usare anche quelli.

Grazie mille!
 
Riesci a spiegarmelo o a darmi delle dritte per capirlo?
Il concetto di base è semplice:
<condizione> ? <azione1> : <azione2>
Se la condizione è vera fa l'azione1, altrimenti la 2

Poi si possono fare lunghi e annidati ma il concetto è molto semplice.
 
Prendendo sempre come esempio: printf(i ? ((i > 0 ? v[j] >= i : v[j] <= i) ? " * " : " ") : "-----");
vedo che la prima condizione è (i ? ((i > 0 .......ecc.
In particolare vedo la variabile i come condizione. In questo caso è sempre vera?
 
Prendendo sempre come esempio: printf(i ? ((i > 0 ? v[j] >= i : v[j] <= i) ? " * " : " ") : "-----");
vedo che la prima condizione è (i ? ((i > 0 .......ecc.
In particolare vedo la variabile i come condizione. In questo caso è sempre vera?

In C quella "i" nella condizione viene valutata come booleana. Se vale 0 allora è falso, in caso contrario true.
Al contrario, se facessi !i, vorrebbe dire "se è falso, allora...". In sostanza qui è true se è diversa da 0.

Comunque imparalo perché torna utile, ma non va abusato. In un codice reale non usare mai uno statement come quello (la leggibilità del codice è importante), con più ternari "innestati".
 
Pubblicità
Pubblicità
Indietro
Top