RISOLTO Programmazione in c su Codeblocks

Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Nuovo Utente
120
9
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??
 

Andretti60

Utente Èlite
5,626
4,239
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);
 

Vito-

Nuovo Utente
120
9
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
 

Andretti60

Utente Èlite
5,626
4,239
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.
 
  • Mi piace
Reazioni: DispatchCode

Vito-

Nuovo Utente
120
9
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
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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.
 
  • Mi piace
Reazioni: Andretti60

Vito-

Nuovo Utente
120
9
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?
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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.
 

Vito-

Nuovo Utente
120
9
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);
}
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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.
 

Vito-

Nuovo Utente
120
9
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?
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
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.
 

Vito-

Nuovo Utente
120
9
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);
}
 

Andretti60

Utente Èlite
5,626
4,239
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.
 

DispatchCode

Moderatore
Staff Forum
1,492
1,153
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Apri un nuovo topic per favore, riportando il testo e tutto quello che hai scritto qui.
Chiudo e segno come risolto.
 
  • Mi piace
Reazioni: Mursey e Vito-
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando

Discussioni Simili