|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
[C] Errore da niubbo su scanf, come lo risolvo?
Ciao, per curiosità sto leggendo il libro Kernighan e Ritchie che avevo comprato alle superiori (e mai aperto) e sto provando a scrivere un pò di codice a caso, programmini stupidi giusto per imparare ad utilizzare le varie istruzioni. Ho imparato un pò ad usare printf e scanf e a fare qualche calcolo ma sono arrivato all'ovvio errore che si ottiene quando alla richiesta di inserire un numero si inserisce invece un carattere o comunque qualcosa che non sia un numero. Capisco l'errore ma non so come gestire la cosa.
Vi metto il mio codice cosi giusto per farvi capire la demenzialità del mio livello Codice:
#include <stdio.h>
int main (int argc, const char * argv[])
{
float base, altezza, area;
printf("Inserisci la base del rettangolo:\n");
scanf(" %f", &base);
while (base > 99)
{
printf("Mi dispiace ma accetto solo numeri inferiori a 100... \n");
printf("Reinserire un valore da 0 a 99:\n");
scanf(" %f", &base);
}
printf("Inserisci ora l'altezza del rettangolo:\n");
scanf(" %f", &altezza);
area = base * altezza;
printf("Ho effettuato il calcolo e l'area del rettangolo risulta essere: %.2f\n", area);
return 0;
}
Non è che magari esiste un controllo magari all'interno di un ciclo while che mi dica tipo: while (base != numero) { printf("Carattere non accettato, riprovare: \n") scanf(" %f", base); } No eh? Grazie per l'aiuto! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Potresti usare isdigit() o atof().
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
sto leggendo che con isdigit qualora non sia un valore numerico da valore diverso da 0...
quindi dovrei fare una cosa del tipo if isdigit diverso da zero bla bla bla else bla bla bla però non capisco come scrivere il codice giusto... potresti mica farmi un esempio pratico sul mio codice? |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: May 2011
Messaggi: 47
|
La risoluzione del problema è abbastanza semplice. Devi pensare che ogni funzione è caratterizzata dalla seguente sintassi: tipo_restituito nome_funzione(tipo_parametro nome_parametro, ...);. Ciò prende il nome di "prototipo di funzione", che studierai più avanti, quando saprai creare tu stesso alcune funzioni.
In questo caso tu hai la funzione scanf() che ha il prototipo: Codice:
int scanf(const char *format, ...); Quindi, facendo un esempio: Codice:
#include <stdio.h>
int main()
{
int flag;
float number;
printf("Digitare un numero: ");
flag = scanf("%f", &number);
printf("Valore restituito dalla funzione scanf(): %d\n", flag);
return 0;
}
Ultima modifica di Lazy Bit : 26-06-2011 alle 10:41. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Eccomi, grazie mille dei consigli... ho capito più o meno come funziona e ho provato a mettere in pratica ma non riesco a risolvere una questione...
Codice:
#include <stdio.h>
int main()
{
float base;
int controllo;
printf("Digitare la base del rettangolo:\n ");
controllo = scanf(" %f", &base);
while (controllo != 1)
{
printf("Mi dispiace ma accetto solo numeri! Inserisci un numero:\n ");
scanf(" %f", &base);
}
printf("Il numero che hai inserito è: %.2f", base);
return 0;
}
Eppure nel primo codice che ho postato mi funzionava... |
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: May 2011
Messaggi: 39
|
Quote:
ecco, fai così Codice:
if (controllo != 1)
{
printf("Mi dispiace ma accetto solo numeri! Inserisci un numero:\n ");
getchar();
scanf(" %f", &base);
Ultima modifica di BlackShark92 : 27-05-2011 alle 19:31. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Ho provato anche con if ma...
Codice:
#include <stdio.h>
int main()
{
float base;
int controllo;
printf("Digitare la base del rettangolo:\n ");
controllo = scanf(" %f", &base);
if (controllo != 1)
{
printf("Mi dispiace ma accetto solo numeri! Inserisci un numero:\n ");
getchar();
scanf(" %f", &base);
}
else
printf("Il numero che hai inserito è: %.2f", base);
return 0;
}
Digitare la base del rettangolo: e Mi dispiace ma accetto solo numeri! Inserisci un numero: Program ended with exit code: 0 |
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: May 2011
Messaggi: 39
|
Quote:
Codice:
#include <stdio.h>
int main()
{
float base;
int controllo;
printf("Digitare la base del rettangolo:\n ");
controllo = scanf(" %f", &base);
while (controllo != 1)
{
printf("Mi dispiace ma accetto solo numeri! Inserisci un numero:\n ");
getchar();
controllo=scanf(" %f", &base);
}
printf("Il numero che hai inserito è: %.2f", base);
return 0;
}
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Ahhhh ecco perchè allora
Grazie mille... ora sperimento meglio e vi faccio sapere! |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
ihihihi che bello, inizio a trovare utilità nel programmare... proprio oggi avevo bisogno di questi calcoli e mi son fatto il programmino stupido ma pur sempre utile!
Codice:
#include <stdio.h>
int main()
{
float peso, volume, diametro, raggio, altezza, area;
int controllo, controllo1;
printf("------------------------------------------------------\n");
printf("Calcolo del Volume d'acqua necessario per riempire una\n");
printf("piscina di forma tonda e del relativo peso complessivo\n");
printf("a riempimento completato.\n");
printf("------------------------------------------------------\n");
printf("Inserire il diametro interno della piscina in cm:\n");
controllo = scanf(" %f", &diametro);
while (controllo != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo=scanf(" %f", &diametro);
}
printf("Inserire ora l'altezza dell'acqua in cm rispetto alla base della piscina:\n");
controllo1 = scanf(" %f", &altezza);
while (controllo1 != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo1=scanf(" %f", &altezza);
}
raggio = diametro / 2;
area = (raggio * raggio) * 3.14;
volume = (area * altezza) / 1000000;
peso = volume * 1000;
printf("Il volume di acqua necessario per riempire la piscina è di: %.2f Metri cubi\n", volume);
printf("Il peso della piscina risulterà quindi essere: %.2f Kg\n", peso);
return 0;
}
So che potrei farlo direttamente con dei cicli, ma preferirei farlo con le funzioni almeno le imparo Ultima modifica di c1rcu1tburn3r : 28-05-2011 alle 18:49. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Mmm, ho provato a fare cosi per ora ma non va, dove sbaglio?
Edit: Ok risolto... ci voleva un %d al posto di un %f sullo scanf dell'int scelta!!! Codice:
#include <stdio.h>
int main()
{
float peso, volume, diametro, raggio, altezza, area;
float latolungo, latocorto;
int controllo, controllo1, scelta;
printf("------------------------------------------------------\n");
printf("Calcolo del Volume d'acqua necessario per riempire una\n");
printf("piscina di forma tonda e del relativo peso complessivo\n");
printf("a riempimento completato.\n");
printf("------------------------------------------------------\n");
printf("Scegli la forma della piscina su cui fare i calcoli tra le seguenti opzioni:\n");
ricomincia:
printf("Inserire 1 se la piscina è tonda oppure \n");
printf("inserire 2 se la piscina è rettangolare: \n");
scanf(" %d", &scelta);
if (scelta == 1) //Calcolo per la piscina tonda
{
printf("Hai scelto la piscina di forma tonda\n");
printf("------------------------------------\n");
printf("Inserire il diametro interno della tua piscina in cm:\n");
controllo = scanf(" %f", &diametro);
while (controllo != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo=scanf(" %f", &diametro);
}
printf("Inserire ora l'altezza dell'acqua in cm rispetto alla base della piscina:\n");
controllo1 = scanf(" %f", &altezza);
while (controllo1 != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo1=scanf(" %f", &altezza);
}
raggio = diametro / 2;
area = (raggio * raggio) * 3.14;
volume = (area * altezza) / 1000000;
peso = volume * 1000;
printf("\n\n");
printf("Il volume di acqua necessario per riempire la piscina è di: %.2f Metri cubi\n", volume);
printf("Il peso della piscina risulterà quindi essere: %.2f Kg\n", peso);
}
else if (scelta == 2) //Calcolo per la piscina rettaqngolare
{
printf("Hai scelto la piscina di forma rettangolare\n");
printf("-------------------------------------------\n");
printf("Inserire il lato più lungo della piscina in cm:\n");
controllo = scanf(" %f", &latolungo);
while (controllo != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo=scanf(" %f", &latolungo);
}
printf("Inserire ora il lato corto della piscina:\n");
controllo1 = scanf(" %f", &latocorto);
while (controllo1 != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo1=scanf(" %f", &latocorto);
}
printf("Inserire ora l'altezza dell'acqua in cm rispetto alla base della piscina:\n");
controllo1 = scanf(" %f", &altezza);
while (controllo1 != 1)
{
printf("Mi dispiace ma quello che hai inserito non è un numero! Inserisci un numero:\n ");
getchar();
controllo1=scanf(" %f", &altezza);
}
area = latocorto * latolungo;
volume = (area * altezza) / 1000000;
peso = volume * 1000;
printf("\n\n");
printf("Il volume di acqua necessario per riempire la piscina è di: %.2f Metri cubi\n", volume);
printf("Il peso della piscina risulterà quindi essere: %.2f Kg\n", peso);
}
else
{
printf("La scelta effettuata non rientra tra quelle possibili, riprovare:\n");
goto ricomincia;
}
return 0;
}
Ultima modifica di c1rcu1tburn3r : 28-05-2011 alle 19:53. |
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: May 2011
Messaggi: 39
|
Quote:
|
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: May 2011
Messaggi: 47
|
Quote:
Codice:
float volumePiscina(int t, float d, float h); Ultima modifica di Lazy Bit : 26-06-2011 alle 10:42. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Che dire... Ti vorrei come vicino di casa...
Il problema è che per quanto un libro sia valido non tratterà mai le cose in questo modo... I testi, anche quelli per newbie, danno per scontate cose che non lo sono e spesso e volentieri demoralizzano! E soprattutto a un libro non puoi fare domande. Secondo voi, visto il punto in cui sono, quale sarebbe il passo successivo? E delle nozioni che ho, su quali dovrei approfondire prima di passare al prossimo argomento? |
|
|
|
|
|
#15 |
|
Member
Iscritto dal: May 2011
Messaggi: 47
|
Il C è un linguaggio molto potente ma è stato ideato soprattutto per fornire un efficiente e libero controllo sulla memoria. Al contrario di altri linguaggi di programmazione come il Pascal, che tendono a far concentrare il programmatore sulla risoluzione di problemi (e sono quei linguaggi utilizzati per scopi didattici), il C è orientato verso l'implementazione a diretto contatto con l'architettura del calcolatore. Se preferisci imparare prima a scrivere algoritmi, allora potresti orientarti verso un altro linguaggio, se invece vuoi imparare a programmare tenendo conto dell'architettura di un processore e della memoria, allora il C fa al caso tuo. Per quest'ultimo caso, io darei prima di tutto importanza al sistema numerico binario ed esadecimale, alla conversione tra un numero decimale e uno binario e tra un numero esadecimale e uno binario (infatti il sistema esadecimale ha la particolarità di essere un modo molto comodo di rapprentare i numeri binari). Infine studierei la rappresentazione dei numeri in un calcolatore. Poi passi alle operazioni di I/O da tastiera e ai vettori.
Ultima modifica di Lazy Bit : 26-06-2011 alle 10:43. |
|
|
|
|
|
#16 |
|
Member
Iscritto dal: May 2011
Messaggi: 39
|
Non posso che quotare. Insisti soprattutto con gli operatori bitwise (bit a bit, ovvero & | ecc..) così comprendi meglio le cose che ti ha detto di imparare lui. Studia bene i meccanismi di chiamata per valore e per indirizzo che è fontamentale (per quanto riguarda le funzioni), e soprattutto lavora molto con i puntatori
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Fortunatamente mi ricordo abbastanza bene il sistema di numerazione binario e esadecimale e mi ricordo anche come si fanno le operazioni e le conversioni...
ricordo anche il discorso del complemento a uno e complemento a due per rappresentare i numeri negativi(anche se al momento non mi è più ben chiara la cosa, devo riguardarmela ). La tabella ascii non me la ricordo a memoria chiaramente ma so che i comandi, caratteri e simboli sono riconducibili a un determinato valore binario, decimale, ottale o esadecimale. Quindi so per esempio che quando premo il tasto A in realtà sto usando 01000001 in binario, giusto?
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: May 2011
Messaggi: 47
|
Esattamente!
Comunque per ogni argomento che tocchi, fai esercizi. Ad esempio, sai come sono rappresentati i caratteri, il sistema di numerazione binario, conosci le istruzioni di selezione if-else e quelle di ripetizione for e while. Prova a creare una funzione uppercase() che trasformi i caratteri minuscoli in maiuscoli e una funzione lowercase() che trasformi i caratteri in minuscoli, infine una funzione decimaltobinary() che trasformi un numero decimale in binario. Quando imparerai ti potrai sbizzarrire con programmi di tua invenzione, addirittura creando una bella interfaccia grafica (GUI). Ultima modifica di Lazy Bit : 29-05-2011 alle 21:42. |
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: May 2011
Messaggi: 39
|
Quote:
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jun 2007
Città: ITALY
Messaggi: 449
|
Quote:
Meglio che comincio con dell'altro mi sa eheheh P.S. Non so se cambia qualcosa in generale ma mi sono scordato di dirvi che cmq lavoro su mac con xcode... ma credo che si dovrebbe tenerne conto solo qualora volessi sviluppare gui, giusto? Ultima modifica di c1rcu1tburn3r : 29-05-2011 alle 22:06. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:20.












). La tabella ascii non me la ricordo a memoria chiaramente
ma so che i comandi, caratteri e simboli sono riconducibili a un determinato valore binario, decimale, ottale o esadecimale. Quindi so per esempio che quando premo il tasto A in realtà sto usando 01000001 in binario, giusto?








