Vettore e stampa di istogrammi

di il
7 risposte

Vettore e stampa di istogrammi

Buongiorno a tutti!
sto svolgendo questo esercizio:

Scrivere un programma in linguaggio C che riceve in ingresso una sequenza di N numeri
interi. Il valore N è inserito dall’utente. I numeri sono memorizzati in un vettore. Terminato
l’inserimento della sequenza di numeri, il programma deve visualizzare una riga di
asterischi per ogni numero inserito. Il numero di asterischi nella riga è pari al valore del
numero inserito. Ad esempio, dato il vettore 9 4 6 il programma deve visualizzare:
Elemento 1: 9 *********
Elemento 2: 4 ****
Elemento 3: 6 ******

al momento dell'esecuzione, la stampa degli asterischi si ripete in un ciclo senza fine.
qual'è il mio errore? di seguito riporto il programma:

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

int main(void){
int i,j;
int maxsize=30;
int vett[maxsize];
int n;

do{
printf("di quanti numeri e' composto il vettore? ");
scanf("%d",&n);
if(n<=0||n>maxsize)
printf("errore: il numero deve essere compreso fra 0 e %d\n",maxsize);
}
while(n>maxsize||n<=0);

printf("inserisci gli elementi del vettore\n");

for(i=1;i<=n;i++){
printf("elemento %d: ",i++);
scanf("%d",&vett);}

printf("il vettore inserito è il seguente: elemento %d : %d",i,vett);

for(i=1;i<=n;i++){
for(j=1;j<=vett;j++)
printf("*");
printf("\n");}

return 0;}

7 Risposte

  • Re: Vettore e stampa di istogrammi

    Il codice va postato formattato e con i tag code, senza non leggo il codice!
  • Re: Vettore e stampa di istogrammi

    Intanto c'è il solito errore di chi inizia con il C.
    Gli indici dei vettori non vanno da 1 a n ma da 0 a n-1.

    Se non correggi questo errore ovunque lo fai nel sorgente, il comportamento del programma è imprevedibile.
  • Re: Vettore e stampa di istogrammi

    Scusate per la mancata formattazione, sono talmente agli inizi che non so neanche come si fa..ho letto nel regolamento del forum che si utilizza il pulsante code..
    provo a vedere come fanno gli altri, perchè non ne ho proprio idea

    per Oregon: gli indici che tu intendi si riferiscono a vett?
    se sì, dovrei scrivere quindi vett[i-1]?
    mi daresti una spiegazione ?
    perchè io ho considerato il numeratore da 1 ad i, non da 0 ad i-1.. questo è il mio grande dubbio.

    mi rendo conto che magari posto cose poco pertinenti, ma abbiate pazienza,sto studiando con costanza e prima o poi riuscirò nella mia impresa.
    saluti.
    SERENA
  • Re: Vettore e stampa di istogrammi

    
    #include<stdio.h>
    #include<stdlib.h>
    #define MAX_ELEMENTS(30)
    void clearKeyboardBuffer(void)
    {
        char ch;
        while((ch = getchar ()) != '\n' && ch != EOF);
    }
    void nprint(const char to_print,const unsigned int times)
    {
        unsigned int i;
       for(i = 0; i < times; i++)
       {
           putchar(to_print);
       }
    }
    int main(void)
    {
       unsigned int number_of_elements = 0;
      int is_input_valid = 0;
      do
      {
           printf("Quanti dati vuo inserire? ");
           is_input_valid = scanf(" %u",&number_of_elements);
           clearKeyboardBuffer();
       }
      while (is_input_valid != 1 || number_of_elements > MAX_ELEMENTS);
      unsigned int *data = (unsigned int *) malloc(number_of_elements * sizeof(unsigned int));
      if(data == NULL)
      {
         puts("Errore: impossibile allocare lo spazio richiesto");
         return 1;
      }
      unsigned int i ;
      for(i = 0; i <  number_of_elements; i++)
     {
         printf("Prossimo dato: ");
        scanf(" %u",data + i);
     }
       for(i = 0; i < number_of_elements;i++)
      {
        printf("%u: ",i);
        nprint('*',data[i]);
       puts("");
      }
       free(data);
       data == NULL;
       return 0;
    }
    
    La prima funzione ripulisce il buffer della tastiera,la seconda stampa un carattere times volte e la terza vabbe è il main.All'inizio chiede il numero di elementi finché non viene inserito un valore valido.Poi alloca un array per contenere i dati(i VLA sono una pessima trovata introdotta con il C99),controlla che non ci siano problemi con l'allocazione.Legge i dati(qui senza controllo perché non avevo voglia di riscrivere come fare) e poi stampa gli asterischi.Infine libera la memoria e termina.Se usi winzoz aggiungi getchar().Il motivo per cui nel ciclo si inizia a contare da zero è semplice: detto terra a terra i PC contando da zero perché sfruttano il sistema di numerazione binario e per altre scelte ingegneristiche. Dunque se hai un array di 3 elementi, il primo elemento si troverà in posizione 0 e l'ultimo in posizione 2.Questa vale per buona parte dei linguaggi,fa eccezione ad esempio Visual Basic che in ambienti seri non viene usato.
  • Re: Vettore e stampa di istogrammi

    Solo qualche precisazione, su punti dibattuti in tanti thread, ma che non mi stancherò di precisare ...

    loopunrolling ha scritto:


    Se usi winzoz
    Si chiama Windows, come Linux non si chiama Linzoz.
    Capisco che è "figo" usare queste definizioni in ambito "giovanile", ma sappi che non sono apprezzate in ambito professionale.
    perché sfruttano il sistema di numerazione binario e per altre scelte ingegneristiche.
    Non concordo. Il sistema binario non c'entra nulla. E' solo perché il calcolo zero-based semplifica l'aritmetica relativa agli array.
    fa eccezione ad esempio Visual Basic
    E dove l'hai letto?
    che in ambienti seri non viene usato.
    Anche questa, te la sei inventata.
  • Re: Vettore e stampa di istogrammi

    Io mi riferisco a VB6,non al.NET .Non vedo nessuna richiesta per VB6 tra gli annunci,al massimo richiedono competenze con .NET. Per quanto concerne il termine "winzoz", non lo uso più se qui non è gradito. Nota che il disprezzo per windows non è una questione giovanile da " bimbinkia".Semplicemente studiando i sistemi operativi si vede che è fatto male fatta eccezione di qualche sua parte.Linux non è neanche il migliore in giro, ma tra i mainstream è quello progettato meglio.
    Detto questo chiudo l'offtopic e mi scuso con Serena per aver generato un OT.
  • Re: Vettore e stampa di istogrammi

    loopunrolling ha scritto:


    Io mi riferisco a VB6
    Il VB6 ha base 0 per gli array (può avere anche 1 e anche un range)

    Ovviamente non vedrai annunci per il VB6 per progetti nuovi, questo mi sembra scontato, ma non c'entra nulla sull'adozione del "Visual Basic" in ambito professionale.
    non lo uso più se qui non è gradito.
    Secondo me non è "gradito" da nessuna parte, almeno in nessun forum "professionale". Poi ci sono i forum dei "nerd" che hanno iniziato ad usare i computer l'altro ieri dove, ripeto, fa figo dirlo senza avere la minima idea di cosa sia un OS. E' su questa "categoria" di individui che bisognerebbe fare "seria formazione" evitando che "ripetano a pappagallo" cose che non possono comprendere a sufficienza.
    studiando i sistemi operativi
    La diatriba tra Windows e Linux è vecchissima. Direi che l'ho studiato abbastanza anni (decenni) per dire che ci sono "esagerazioni" da tutte e due le parti. Diciamo che "rispettare" i due sistemi mi sembra l'approccio migliore.

    Chiudo anch'io l'OT ...
Devi accedere o registrarti per scrivere nel forum
7 risposte