RISOLTO Programmazione in c su Codeblocks

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
Messaggi
193
Reazioni
15
Punteggio
43
Ciao ragazzi, saro scemo io ma non riesco a trovare l'errore in quanto questo codice che ho scritto é identico ad un altro che funziona, ma questo no...
Mi stampa oltre ai caratteri che inserisco io tutti altri rimanenti spazi dell'array...
Dove sbaglio?

C:
#include <stdio.h>
#define N 100

int main()
{
    int numeriInseriti[N],num=0,i=0;

    printf("Inserisci un numero binario una cifra alla volta, '#' per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!='#' && i<N)
    {
        numeriInseriti[i]=num;
        i++;
        scanf("%d", &num);
    }

    for(int j=0; j<i; j++)
    {
        printf("%d", numeriInseriti[j]);
    }

    return(0);
}

Mi sono accorto che il problema é il cancelletto messo tra apici. Perché se metto un altro numero funziona??
 
Perché leggi un carattere da tastiera in formato decimale.
Aggiungi questa istruzione dopo che leggi num, digita il cancelletto # e vedi che risultato ti dà
C:
printf("%d %c\n", num);
 
Perché leggi un carattere da tastiera in formato decimale.
Aggiungi questa istruzione dopo che leggi num, digita il cancelletto # e vedi che risultato ti dà
C:
printf("%d %c\n", num);
Mi da cose strane, anche delle u accentate dopo i numeri mentre li inserisco. E quando stampo mi da tutti i caratteri dell'array
 
Vedo che cominci a capire, ma chiedo nuovamente: che risultato ti dà quando digiti il cancelletto. Perché il problema qui appunto sta nel formato %d che usi per la lettura.
 
Vedo che cominci a capire, ma chiedo nuovamente: che risultato ti dà quando digiti il cancelletto. Perché il problema qui appunto sta nel formato %d che usi per la lettura.
Quando inserisco il primo numero mi da di nuovo il numero seguito dal cancelletto. Quando metto il cancelletto e premo invio mi da i numeri che ho messo io piu tutti gli spazi dell'array occupati dall'ultimo numero che ho inserito
 
Penso che Andretti si sia perso un pezzo quando ti ha detto di inserire la printf; ha usato 2 specificatori (gli argomenti, %d e %c) ma ne ha passato solo uno. Credo volesse farti vedere il valore di num sia stampato da intero che da "carattere".

Ad ogni modo l'errore è che dovresti leggere come carattere e non come intero (o usare un altro valore numerico per la terminazione del while). Poi andrai a salvare nell'array il valore convertito in intero: se viene inserito il valore '0' dovrai farlo diventare 0.
 
Penso che Andretti si sia perso un pezzo quando ti ha detto di inserire la printf; ha usato 2 specificatori (gli argomenti, %d e %c) ma ne ha passato solo uno. Credo volesse farti vedere il valore di num sia stampato da intero che da "carattere".

Ad ogni modo l'errore è che dovresti leggere come carattere e non come intero (o usare un altro valore numerico per la terminazione del while). Poi andrai a salvare nell'array il valore convertito in intero: se viene inserito il valore '0' dovrai farlo diventare 0.
Infatti ho cambiato il valore per la terminazione, solo che volevo capire come usare il cancelletto. Se non ho capito male devo usare char?
 
Si, invece di dichiarare int num; dovresti fare char num; e ovviamente dalla scanf leggere scanf(" %c"); (nota lo spazio iniziale per skippare il \n). A questo punto potrai utilizzare il cancelletto.

Ovviamente quando inserirai i numeri '0' e '1' dovrai convertirli in intero, non potrai memorizzarli direttamente nell'array; hai presente la tabella ASCII? Se la risposta è affermativa, non dovresti avere dubbi su come fare, in caso contrario chiedi pure delucidazioni.
 
Si, invece di dichiarare int num; dovresti fare char num; e ovviamente dalla scanf leggere scanf(" %c"); (nota lo spazio iniziale per skippare il \n). A questo punto potrai utilizzare il cancelletto.

Ovviamente quando inserirai i numeri '0' e '1' dovrai convertirli in intero, non potrai memorizzarli direttamente nell'array; hai presente la tabella ASCII? Se la risposta è affermativa, non dovresti avere dubbi su come fare, in caso contrario chiedi pure delucidazioni.
Allora, intanto questo é il programma finito.
Devo dichiarare solo num come char, giusto?
So cos'é la tabella ASCII, pero non so come convertite i numeri. Pero non li dovrebbe convertire lui in automatico se l'array é dichiarato int?


C:
#include <stdio.h>
#define N 100
#include <math.h>

int main()
{
    int numeriInseriti[N],numeriInseriti_Invertiti[N],num,i=0,h=0;
    int result[N],n=0,esp=0;
    int somma=0;

    printf("Inserisci un numero binario una cifra alla volta, 2 per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!=2 && i<N)
    {
        numeriInseriti[i]=num;
        i++;
        scanf("%d", &num);
    }

    while (i>0)
    {
        i--;
        numeriInseriti_Invertiti[h]=numeriInseriti[i];
        h++;
    }

    for(int g=0;g<h;g++)
    {
        result[n] = numeriInseriti_Invertiti[g] * (pow(2,esp));
        n++;
        esp++;
    }

    for(int j=0;j<n;j++)
    {
        somma=somma+result[j];
    }

    printf("Il numero, in formato decimale, e uguale a: %d", somma);

    return(0);
}
 
Allora, intanto questo é il programma finito.
Devo dichiarare solo num come char, giusto?
So cos'é la tabella ASCII, pero non so come convertite i numeri. Pero non li dovrebbe convertire lui in automatico se l'array é dichiarato int?
Non mi sembra ti sia chiara però, anche se la conosci. Dalla tabella ASCII puoi vedere che ad esempio, il carattere 'A' è rappresentato dal numero 65. Così come il carattere '1' è rappresentato dal numero 49.
I numeri sono i valori dei simboli che vedi a video (o che non vuoi vedere perchè non sono caratteri rappresentabili, come l'Invio ad esempio).

Sulla base di questo ti chiedo: quando leggi il carattere '1', che valore ha in decimale (int)?
La "conversione" non c'è; o meglio, c'è il cast, che penso abbiate visto. Da char a int significa che se hai il carattere '1' ottieni il suo valore in decimale, quindi 49.
asciifull.gif


Guarda la tabella. se immetti '1', come ottieni il numero 1?
Hint: devi sottrarre a quel carattere un numero... quale?

Detto ciò, riprendo il tuo codice:
C:
#include <stdio.h>
#define N 100
#include <math.h>

int main()
{
    int numeriInseriti[N],numeriInseriti_Invertiti[N],num,i=0,h=0;
    int result[N],n=0,esp=0;
    int somma=0;

    printf("Inserisci un numero binario una cifra alla volta, 2 per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!=2 && i<N)
    {
        numeriInseriti[i]=num;
        i++;
        scanf("%d", &num);
    }

    while (i>0)
    {
        i--;
        numeriInseriti_Invertiti[h]=numeriInseriti[i];
        h++;
    }

    for(int g=0;g<h;g++)
    {
        result[n] = numeriInseriti_Invertiti[g] * (pow(2,esp));
        n++;
        esp++;
    }

    for(int j=0;j<n;j++)
    {
        somma=somma+result[j];
    }

    printf("Il numero, in formato decimale, e uguale a: %d", somma);

    return(0);
}

Potresti semplificarlo notevolmente. Il ciclo che "inverte" il numero puoi anche non farlo, non ti serve. Puoi sfruttare tutto quello che hai già, facendo ad esempio così:

C:
#include <stdio.h>
#include <math.h>

#define N 100

int main()
{
    int numeriInseriti[N],numeriInseriti_Invertiti[N],num,i=0;
    int result[N],n=0;
    int somma=0;

    printf("Inserisci un numero binario una cifra alla volta, 2 per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!=2 && i<N)
    {
        numeriInseriti[i]=num;
        i++;
        scanf("%d", &num);
    }

    i--;
    while(i >= 0)
    {
        result[n] = numeriInseriti[i] * (pow(2,n));
        n++;
        i--;
    }

    for(int j=0;j<n;j++)
    {
        somma=somma+result[j];
    }

    printf("Il numero, in formato decimale, e uguale a: %d", somma);

    return(0);
}

Ricordati di dichiarare le #define dopo gli include file.

Ti mostro anche un'altra versione, solo per farti vedere un altro modo per scrivere questo codice (e farti diciamo vedere le cose da prospettive differenti). Mantengo la tua logica, quindi leggendo sempre numeri.

C:
#include <stdio.h>
#include <math.h>

#define N 100

int main()
{
    int numeriInseriti[N],num,i=0,n=0, somma=0;

    printf("Inserisci un numero binario una cifra alla volta, 2 per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!=2 && i<N)
    {
        numeriInseriti[i++]=num;
        scanf("%d", &num);
    }

    
    while(--i >= 0)
    {
        somma += numeriInseriti[i] * (pow(2,n++));
    }

    printf("Il numero, in formato decimale, e uguale a: %d", somma);

    return(0);
}

Inoltre, ancora una cosa: cosa succede se viene inserito in input un valore diverso da 2? Dovresti fare un controllo più restrittivo e permettere solo i valori effettivamente consentiti.
 
Non mi sembra ti sia chiara però, anche se la conosci. Dalla tabella ASCII puoi vedere che ad esempio, il carattere 'A' è rappresentato dal numero 65. Così come il carattere '1' è rappresentato dal numero 49.
I numeri sono i valori dei simboli che vedi a video (o che non vuoi vedere perchè non sono caratteri rappresentabili, come l'Invio ad esempio).

Sulla base di questo ti chiedo: quando leggi il carattere '1', che valore ha in decimale (int)?
La "conversione" non c'è; o meglio, c'è il cast, che penso abbiate visto. Da char a int significa che se hai il carattere '1' ottieni il suo valore in decimale, quindi 49.
asciifull.gif


Guarda la tabella. se immetti '1', come ottieni il numero 1?
Hint: devi sottrarre a quel carattere un numero... quale?

Detto ciò, riprendo il tuo codice:


Potresti semplificarlo notevolmente. Il ciclo che "inverte" il numero puoi anche non farlo, non ti serve. Puoi sfruttare tutto quello che hai già, facendo ad esempio così:

C:
#include <stdio.h>
#include <math.h>

#define N 100

int main()
{
    int numeriInseriti[N],numeriInseriti_Invertiti[N],num,i=0;
    int result[N],n=0;
    int somma=0;

    printf("Inserisci un numero binario una cifra alla volta, 2 per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!=2 && i<N)
    {
        numeriInseriti[i]=num;
        i++;
        scanf("%d", &num);
    }

    i--;
    while(i >= 0)
    {
        result[n] = numeriInseriti[i] * (pow(2,n));
        n++;
        i--;
    }

    for(int j=0;j<n;j++)
    {
        somma=somma+result[j];
    }

    printf("Il numero, in formato decimale, e uguale a: %d", somma);

    return(0);
}

Ricordati di dichiarare le #define dopo gli include file.

Ti mostro anche un'altra versione, solo per farti vedere un altro modo per scrivere questo codice (e farti diciamo vedere le cose da prospettive differenti). Mantengo la tua logica, quindi leggendo sempre numeri.

C:
#include <stdio.h>
#include <math.h>

#define N 100

int main()
{
    int numeriInseriti[N],num,i=0,n=0, somma=0;

    printf("Inserisci un numero binario una cifra alla volta, 2 per interrompere e vedere il risultato\n");
    scanf("%d", &num);

    while(num!=2 && i<N)
    {
        numeriInseriti[i++]=num;
        scanf("%d", &num);
    }

   
    while(--i >= 0)
    {
        somma += numeriInseriti[i] * (pow(2,n++));
    }

    printf("Il numero, in formato decimale, e uguale a: %d", somma);

    return(0);
}

Inoltre, ancora una cosa: cosa succede se viene inserito in input un valore diverso da 2? Dovresti fare un controllo più restrittivo e permettere solo i valori effettivamente consentiti.
Intanto grazie, ho letto la tua versione pero ancora ho delle conoscenze troppo acerbe per capirlo per bene.
Per quanto riguarda la tabella ASCII ho un po di difficolta a capire le varie differenze tra int e char, comunque per ottenere 1 devo sotrrarre 48 percaso?
 
Intanto grazie, ho letto la tua versione pero ancora ho delle conoscenze troppo acerbe per capirlo per bene.
Per quanto riguarda la tabella ASCII ho un po di difficolta a capire le varie differenze tra int e char, comunque per ottenere 1 devo sotrrarre 48 percaso?
Se hai domande specifiche posso spiegarti i passaggi.

Si, esatto, 48.
 
Se hai domande specifiche posso spiegarti i passaggi.

Si, esatto, 48.
Perfetto!
Posso disturbarti ancora su un altro esercizio?
"Scrivere un programma che legge da tastiera una sequenza di voti (A, B, C, D, E, F) che finisce quando si premia il carattere EOF (Ctrl+Z). Per ogni sequenza di voti inserita, il programma conta il numero di occorrenze di ogni voto. Quando l’utente immette il carattere EOF (Ctrl+Z), il programma stampa il numero di occorrenze di ogni voto. Quando l'utente scrive un voto diverso di quelle nella lista ammessa, si stampa un messaggio di errore, e.s. 'IL voto inserito non è corretto') e il programma si interrompe."
Io ho fatto questo ma non mi stampa il la ricorrenza dei voti. Mi spunta "Il numero di volte... e: 0".
E poi non riesco a usare EOF, come si imposta e come funziona??

C:
#include <stdio.h>
#define N 100

int main()
{
    char voto,Voti[N],i=0;

    printf("Inserire i voti\n");
    scanf(" %c", &voto);

    while(voto!='#')
    {
        if(voto!='A' && voto!='B' && voto!='C' && voto!='D' && voto!='E' && voto!='F' && i<N)
        {
            printf("Il voto inserito non e corretto.\n");
        }
        else
        {
            Voti[i]=voto;
            i++;
        }
        scanf(" %c", &voto);
    }

    for(i='A';i<='F';i++)
    {
        printf("Il numero di volte in cui il voto %c compare nella sequenza e: %d\n", i,Voti[i]);
    }


return(0);
}
 
Parafrasando la frase famosa di Dave Bowman nella novella 2001 odissea nello spazio: “mio dio, è pieno di errori” :) non me ne volere.
È un esercizio interessante che mostra un utilizzo dei vettori tipico, ossia come usarli per misurare una distribuzione di dati (nota come istogramma), vale la pena aprire una discussione separata.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top