Oh bene.. eccoci giunti finalmente alla decima lezione, direi che a questo punto è proprio il momento di fermarci un attimo e consolidare tutto quello che abbiamo visto fino ad ora facendo qualche esercizio.
Prima di passare agli esercizi, però, vediamo una piccola funzione che ci permetterà di assegnare ad una variabile il valore digitato dall’utente: scanf().
Funzione scanf()
La funzione scanf() fa parte della libreria stdio.h come la sua sorella printf, quindi per utilizzarla è necessario inserire in testa al file sorgente dove vogliamo usarla la direttiva:
#include
Il suo utilizzo è molto semplice ed in questo momento, poiché abbiamo parlato solo di variabili numeriche, vedremo soltanto come acquisire un numero intero digitato dall’utente.
Scriviamo quindi un programma che acquisisca un numero in input e successivamente lo stampi a schermo.
#include
int main(int argc, char **argv) {
int i;
printf("Inserisci un valore:");
scanf("%d",&i);
printf("Hai inserito il valore: %d\n",i);
}
Come si può notare la funzione scanf ha una sintassi molto simile alla funzione printf infatti i placeholder sono gli stessi, l’unica differenza sta nel simbolo “&” anteposto al nome della variabile, capiremo il suo significato quando parleremo dei puntatori.
La funzione scanf permette di acquisire anche più valori contemporaneamente, se volessimo acquisire ad esempio due numeri potremmo scrivere:
#include
int main(int argc, char **argv) {
int i,j;
printf("Inserisci il primo valore:");
scanf("%d",&i);
printf("Inserisci il second valore:");
scanf("%d",&j);
printf("Hai inserito i: %d j:%d \n",i,j);
}
Una precisazione: l’utilizzo della funzione scanf così come l’ho presentata qui presenta parecchi problemi ai quali al momento non siamo interessati, ma se stessimo scrivendo un programma da milioni di euro dovremmo considerare; ad esempio: “Cosa succede se l’utente digita un numero più grande del massimo numero intero accettabile?” oppure “Cosa succede se l’utente digita del testo invece che dei caratteri?” In questo momento possiamo supporre di avere un utente diligente che non commetta errori, quando saremo più bravi vedremo come irrobustire e rendere immuni agli errori più comuni il nostro codice.
Adesso sotto con gli esercizi!!
Esercizi:
ATTENZIONE: A fondo articolo troverete le soluzioni degli esercizi proposti, fate conto però che non ci siano e sforzatevi di ragionare quanto più potete da soli. Se proprio non riuscite, prima di andare a sbirciare, discutiamone insieme nel forum e vediamo di approfondire per bene cosa non capite. Solo alla fine, quando avrete capito il problema, confrontate la vostra soluzione con quella da noi proposta. Se seguite questa piccola nota, allora si che imparerete a dovere, in tutti gli altri casi, non garantiamo nulla, quindi.. fatelo per VOI!! 🙂 E ora Forza!!!
- Scrivere un programma che presi in input due numeri interi dall’utente presenti a video i risultati delle quattro operazioni aritmetiche di base (+,-,*,/)
- Scrivere un programma che preso in input un numero intero presenti a video la somma di tutti i numeri da 1 fino a tale numero. (es: numero digitato:5; 1+2+3+4+5 = 15)
- Scrivere un programma che presi in input 3 numeri stabilisca se tali numeri possono costituire le lunghezze dei lati di un triangolo.
- Scrivere un programma che preso in input un numero stabilisca, senza fare divisioni, se tale numero è pari o dispari.
- Scrivere un programma che preso in input un numero x, acquisisca poi in input x numeri e ne restituisca la somma.
- Scrivere un programma che fin tanto che l’untente non inserisce 0 (zero) acquisisca un intero e lo stampi a video.
- Scrivere un programma che acquisiti due numeri stampi a video in che relazione sono (minore, uguale etc)
- Scrivere un programma che calcoli la somma di tutti i numeri minori di 101, poi di 100, di 99 etc.
- Scrivere un programma il cui output sia il seguente:
0->*1234*6789
1->*1234*6789
2->*1234*6789
3->*1234*6789
4->*1234*6789
5->*1234*6789
6->*1234*6789
7->*1234*6789
8->*1234*6789
9->*1234*6789 - Scrivere un programma che presi in input i coefficienti di una equazione di secondo grado ne ricavi le radici
Soluzioni:
Esercizio n. 1
#include
int main (int argc, const char * argv[]) {
int a, b;
printf("Inserisci due numeri: ");
scanf("%d %d", &a, &b);
printf("%d + %d = %d \n",a,b,a + b);
printf("%d - %d = %d \n",a,b,a - b);
printf("%d * %d = %d \n",a,b,a * b);
printf("%d / %d = %d \n",a,b,a / b);
return 0;
}
Direi che su questo primo esercizio è molto semplice e non c’è molto da spiegare, dichiariamo due variabili, spieghiamo all’utente cosa deve fare e ne leggiamo il valore tramite la funzione scanf();
Un unica osservazione, il valore delle operazioni non viene assegnato a nessuna variabile, poichè in realtà non ci serve, ma viene soltato stampato a video.
Esercizio n. 2
#include
int main (int argc, const char * argv[]) {
int limite;
int somma = 0;
printf("Inserisci limite massimo: ");
scanf("%d",&limite);
while (limite > 0) {
somma = somma + limite;
limite = limite - 1;
}
printf("La somma è: %d",somma);
return 0;
}
In questo esercizio ho utilizzato il costrutto while ed invece che sommare i numeri partendo da 1, li ho sommati partendo dal maggiore fino a 1. un piccolo stratagemma per evitare di utilizzare un’altra variabile.
Esercizio n. 3
#include
int main (int argc, const char * argv[]) {
int latoa, latob, latoc;
printf("Inserire le misure dei tre lati: ");
scanf("%d %d %d",&latoa,&latob,&latoc);
if ( (latoa > (latob + latoc)) || (latob > (latoa + latoc)) || (latoc > (latoa + latob)) ) {
printf("Le misure non possono costituire un rettangolo");
}
else {
printf("Le misure inserite possono costituire un rettangolo");
}
return 0;
}
In un triangolo ciascun lato non può essere più lungo della somma degli altri due, quindi se questo avviene per uno dei tre lati scrivo a schermo “Le misure non possono costituire un rettangolo”, viceversa scrivo “Le misure inserite possono costituire un rettangolo”
Esercizio n. 4
#include
int main (int argc, const char * argv[]) {
int numero;
printf("Inserisci un numero: ");
scanf("%d",&numero);
if (( numero % 2 ) == 0) {
printf("Numero pari");
}
else {
printf("Numero dispari");
}
return 0;
}
Se un numero è pari, il resto della divisione per due (operatore modulo) è zero, quindi basta verificare questa proprietà.
Si sarebbe potuto scrivere anche
if ( !(numero % 2) )
riuscite a capire perché?
Esercizio n. 5
#include
int main (int argc, const char * argv[]) {
int qt_numeri;
int numero;
int somma = 0;
printf("Inserisci la quantià di numeri: ");
scanf("%d",&qt_numeri);
printf("Dovrai inserire %d numeri:",qt_numeri);
for ( ; qt_numeri > 0; qt_numeri = qt_numeri - 1) {
scanf("%d",&numero);
somma = somma + numero;
}
printf("La somma è: %d",somma);
return 0;
}
In questo esercizio acquisiamo la quantità di numeri che vogliamo acquisire, questo valore è utilizzato in un for, la parte di inizializzazoine del ciclo for non è necessaria e quindi è stata omessa.
Esercizio n. 6
#include
int main (int argc, const char * argv[]) {
int i;
printf("Inserisci dei numeri, 0 per uscire:\n");
do {
scanf("%d",&i);
printf("Hai inserito: %d \n",i);
} while (i != 0) ;
printf("Ciao ciao");
return 0;
}
Per risolvere questo esercizio ho pensato di utilizzare un do…while all’interno del quale acquisiamo un numero e nella condizione verifichaimo che sia diverso da zero, se è diverso da zero ricomincia il ciclo, viceversa esce.
Esercizio n. 7
#include
int main (int argc, const char * argv[]) {
int a,b;
printf("Inserisci due numeri: ");
scanf("%d %d",&a, &b);
if (a b) {
printf("A è maggiore di B");
}
else {
printf("A e B sono uguali");
}
return 0;
}
Qualche if per verificare in che relazione stanno i numeri acquisiti, questo esercizio non era difficile, vero?
Esercizio n. 8
#include
int main (int argc, const char * argv[]) {
int counter = 100;
int i;
int somma = 0;
for (; counter > 0; counter = counter - 1) {
for ( i = 0; i <= counter; i = i + 1) {
somma = somma + i;
}
printf("somma: %d\n",somma);
somma = 0;
}
return 0;
}
In questo esercizio ho utilizzato due cicli for annidati, il primo come nell’esercizio 4 parte dal 100 e decresce fino a 0, per ciascun valore viene eseguito un secondo ciclo for che parte da zero e arriva fino al valore del ciclo for esterno.
Esercizio n. 9
#include
int main(int argc, char **argv) {
int i,j;
for (i = 0; i ",i);
for ( j = 0; j < 10; j++) {
if ((j % 5) == 0) {
printf("*");
}
else {
printf("%d",j);
}
}
printf("\n");
}
}
Una piccola variante del precedente, due cicli for annidati e un test sul valore del modulo per sostituire tutti gli zeri e i 4 con il carattere “*”.
Esercizio n. 10
#include
#include
int main(int argc , char **argv) {
float a,b,c,r,r2,delta;
printf("Inserisci il coefficente di secondo grado:");
scanf("%f",&a);
printf("Inserisci il coefficente di primo grado: ");
scanf("%f",&b);
printf("Inserisci il termine noto: ");
scanf("%f",&c);
if ( a == 0 ){
printf("Il termine di secondo grado non può essere nullo");
return 1;
}
if ((b == 0) && (c == 0)) {
printf("Equazione monomia: La soluzione è 0");
return 0;
}
if ( c == 0 ) {
printf("Equazione spuria: Le soluzioni sono: 0 e %f",-(b/a));
return 0;
}
if ( b == 0 ) {
if ( (a * c) > 0 ) {
printf("Non ci sono radici reali");
}
else {
r = sqrt(-( c / a));
printf("Le radici sono: %f e %f",r,-r);
}
return 0;
}
printf("Equazione completa:\n");
delta = b * b - 4 * a * c;
printf("DELTA: %f",delta);
r = (float)(-b + sqrt(delta) ) / (2 * a);
r2 =(float)(-b - sqrt(delta) ) / (2 * a);
printf("%f",sqrt(delta));
printf("Le soluzioni sono: %f e %f",r, r2);
return 0;
}
Ho dovuto ripassare un pò di matematica per scrivere questo programma 🙂 non dovrebbe essere difficile seguire il filo del programma…se avete difficoltà chiedete pure attraverso il nostro forum!
Letture consigliate:
Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica)
Brian W. Kernighan – Dennis M. Ritchie
Editore: Pearson | Lingua: Italiano | Brossura: 313 pagine
Prezzo Listino: EUR 27,00
Prezzo Promozione: EUR 22,95 con Spedizione gratuita
C. Corso completo di programmazione
Paul J. Deitel – Harvey M. Deitel
Editore: Apogeo | Lingua: Italiano | Brossura: 640 pagine
Prezzo Listino: EUR 39,00
Prezzo Promozione: EUR 33,15 con Spedizione gratuita










33 Responses to “10. Scanf ed Esercizi”
22 Aprile 2011
Andrea96grazie a questa lezione posso perfezionare (praticamente) finire la mia app …..anche se è abbastanza stupida…
22 Aprile 2011
10. Scanf ed esercizi – devAPP | iSpazio DevResources | Giochi per Iphone[…] Trovate la nuova lezione qui: 10. Scanf ed esercizi […]
22 Aprile 2011
tommasociao!!io non ho capito l’uso di scanf!!me lo puoi spiegare in un’altra maniera?
22 Aprile 2011
Spartanscanf prende ciò che digiti e lo memorizza dove glielo dici!
22 Aprile 2011
Paradiseper ora ho compilato solo i primi due… il seconod è stato più impegnativo, ho dovuto trovare la funzione f(x) che soddisfasse la sequenza.. è un po’ tortuoso, ma questo è il codice del secondo: (compila 😛 )
#include
int main (int argc, const char * argv[]) {
int a,i;
printf(“Inserisci un numero: “);
scanf(“%d”, &a);
for (i = 1;
i < a;
printf("%d + ",i), i = i + 1) {}
if (i==a) {printf("%d = ", a);}
int j=((a*a)+a)/2;
printf("%d\n",j);
return 0;
}
PS. sempre ottimo!
22 Aprile 2011
Ignaziocragazzi postate sul forum, qui il codice è illegibile!
22 Aprile 2011
Ignaziocil tuo codice è parecchio fantasioso 🙂
la mia idea era quella di far calcolare progressivamente la somma, ma visto che hai usato la famosa formula di Gauss non posso certo rimproverarti 🙂
però per quanto riguarda la stampa…diciamo che non è molto lineare come codice..che te ne sembra di
[code]
for (i = 1; i <=a; i++ ) {
printf("%d + ", i);
}
printf(" = %d", (a * (a + 1) )/ 2);
[/code]
22 Aprile 2011
Paradiseil tuo codice è parecchio fantasioso
la mia idea era quella di far calcolare progressivamente la somma, ma visto che hai usato la famosa formula di Gauss non posso certo rimproverarti
però per quanto riguarda la stampa…diciamo che non è molto lineare come codice..che te ne sembra di
[code]
for (i = 1; i <=a; i++ ) {
printf(“%d + “, i);
}
printf(” = %d”, (a * (a + 1) )/ 2);
[/code]
ci ho messo 1 ora a trovare la funzione che soddisfasse la sequenza… e Gauss non mi è proprio passato di mente!! grrr
il codice dato da te da come risultato 1 + 2 + 3 + 4 + 5 + = 15
ho messo “if” proprio per non far uscire il + e = vicini 😀
23 Aprile 2011
Ignaziocvero, non l’ho provato 🙂
Il fatto è che quando esci dal for il valore del contatore è sempre uguale ad a quindi l’if non è necessario.
per esempio:
[/code]
#include
int main(int argc, char **argv){
int riga,colonna;
int a = 10;
int i;
for (i = 1; i <=a – 1; i++ ) {
printf("%d + ", i);
}
printf("%d = %d",a, (a * (a + 1) )/ 2);
return 0;
}
[/code]
poi in realtà volevo che calcolassi la somma via via 🙂 ci vuoi provare?
bye
23 Aprile 2011
fabioho un problema in xcode3.
quando faccio
es.
int main()
{
int a,b,c;
}
non indenta da solo, ma devo schiacciare tab ogni volta, sapete come fare, ho provato in tutti i modi ma nelle impostazioni non ci sono riuscito
23 Aprile 2011
Paradisesul
non riesco a calcolare la somma via via… non so proprio da dove partire… queste sono le uniche lezioni di C che abbi mai seguito! 🙂 indizio?
mentre per gli altri non ho avuto nessun problema, tranne per l’ultimo, che ho qualche dubbio.. più che altro perchè mi da sempre risultati interi:
#include
int main(int argc, char **argv){
int a, b, c;
printf(“inserisci i 3 coefficienti ax^2 + bx + c = 0: “);
scanf(“%d %d %d”, &a, &b, &c); printf(“%dx^2 + %dx + %d = 0\n”, a, b, c);
int delta = (b*b)-4*a*c;
int xu = (-b + sqrt(delta))/2*a;
int xd = (-b – sqrt(delta))/2*a;
int x = -b/(2*a);
if(delta0){
printf(“∆ = %d\nX1 = %d\nX2 = %d\n”, delta, xu, xd);
}
}
23 Aprile 2011
Paradisenel posto di prima il post ha deformato il codice:
#include
int main(int argc, char **argv){
int a, b, c;
printf(“inserisci i 3 coefficienti ax^2 + bx + c = 0: “);
scanf(“%d %d %d”, &a, &b, &c); printf(“%dx^2 + %dx + %d = 0\n”, a, b, c);
int delta = (b*b)-4*a*c;
int xu = (-b + sqrt(delta))/2*a;
int xd = (-b – sqrt(delta))/2*a;
int x = -b/(2*a);
if(delta0){
printf(“∆ = %d\nX1 = %d\nX2 = %d\n”, delta, xu, xd);
}
}
23 Aprile 2011
AlessioC’è qualche amministratre del Forum che può attivarmi l’account WEBSELF? Così posto le mie soluzioni nella gista sezione.
Grazie 🙂
23 Aprile 2011
andrea90rmguarda nella soluzione del secondo esercizio [non l’ho compilato ma si vede a occhio] c’è un errore dopo il while…assegni 0 sempre a somma e il risultato non può che essere quello alla fine
23 Aprile 2011
Rino PicardiCiao account attivato 🙂
23 Aprile 2011
Ignaziocnon so se il codice è corretto, ma se utlizzi variabili intere non puoi avere valori che non siano interi, no? 🙂
23 Aprile 2011
Ignaziocgrazie! correggo subbbbbito.
26 Aprile 2011
Paradisemica mi puoi attivare l’account “Paradise”?! così cercherò di postare sul forum 😛
27 Aprile 2011
alefscusa ma questo errore cosa vuol dire “expected identifier or ‘(’ before ‘}’ token” ?? me lo da nel programma x l’equazione di secondo grado. grazie!
3 Maggio 2011
MacMomoCapisco l’intento dell’esercizio, ma il 9 non si può risolvere semplicemente così?
#include
int main() {
int i;
for(i=0; i*1234*6789\n", i);
}
return 0;
}
3 Maggio 2011
MacMomoDirei che il commento sopra è venuto fuori un po’ sballato.
Provo a riscriverlo.
#include <stdio.h>
int main() {
int i;
for(i=0; i%lt;10; i++) {
printf(“%d->*1234*6789\n”, i);
}
return 0;
}
9 Maggio 2011
LorenzoDevo dire che un buon rispolvero del C fa sempre bene.
Per quanto riguarda l’es. 9 io l’ho risolto così:
int main(int argc, char **argv){
int numero,dato;
for(numero=0;numero*1234*6789\n”);
}
system(“PAUSE”);
return 0;
}
9 Maggio 2011
LorenzoERRATA CORRIGE (Vedi sotto):
int main(int argc, char **argv){
int numero;
for(numero=0;numero*1234*6789\n”);
}
system(“PAUSE”);
return 0;
}
10 Maggio 2011
ignazioceh eh…così non vale 😛 quell’esercizio era pensato per far usare l’operatore modulo! 😀
7 Novembre 2011
ioil primo esercizio l’ ho risolto. per il secondo sono due giorni che ci provo…è normale o sono un caso umano?? by demoralizzato 🙁
7 Novembre 2011
IgnaziocLa soluzione non ti aiuta?
8 Novembre 2011
LucertolasBuonasera, ho cominciato a seguire il corso di programmazioni in C in vista di futura programmazione di App, e devo dire che è proprio ben fatto, complimenti!
Utilizzo xCode 4 come compilatore (sono Mac User) e ho provato qualche riga di codice con la funzione scanf () , ma, copiando il codice dall’esempio e da altre fonti e mettendo un valore, la visualizzazione nella console si ferma a “inserisci un valore: 5”. Forse che il valore deve essere inserito in maniera specifica?
Grazie per l’aiuto!
9 Novembre 2011
ioInnanzitutto grazie per la risposta. Pensa un po che ho passato ben 4 giorni (e dico quattro) cercando di far visualizzare dal programma “LA SOMMA E’: 1+2+3+4+5=15” invece che semplicemente “LA SOMMA E’: 15”!!! Detto cio, ho compilato il programma e mi è un po piu chiaro però per comprendere al meglio mi piacerebbe conoscere tutte le tappe per arrivare alla risoluzione del problema…magari dallo pseudocodice…GRAZIE MILLE
9 Novembre 2011
ioMI RISPONDO DA SOLO…
#include
int main (int argc, const char * argv[])
{
int numero =0;
int contatore = 0;
int somma = 0;
printf(“inserisci un numero: \n”);
scanf(“%d”, &numero);
for (contatore=0; contatore<=numero; contatore++) {
somma = somma + contatore;
}
printf("il risultato è: %d\n", somma);
return 0;
}
10 Novembre 2011
ignaziocposta il codice che utilizzi, magari non qui ma sul forum perché qui viene persa la formattazione
10 Agosto 2012
AlessioMTXGrazie per queste guide! Sto facendo gli esercizi e ho notato che all’ esercizio 3 potresti aggiungere un else if se due lati sono uguali all’ altro rimanente.
Io avevo fatto 5 else if , non avevo pensato di usare || (sarebbe OR, giusto?)
13 Agosto 2012
ignaziocperché dovresti aggiungere un “else if” ? se due lati sono uguali all’altro rimanente (quindi sono 3 lati uguali) allora ciascun lato sarà minore della somma degli altri due. due pipe (||) è l’operatore logico OR
27 Settembre 2012
PaoloSalve a tutti, sto seguendo questo corso e lo trovo davvero ben fatto. Sono ancora agli inizi e nel cercare di svolgere uno di questi esercizi mi sono imbattuto in questo codice che mi ha fatto sorgere un dubbio:
#include
main()
{
char carattere;
char num;
printf(“Inserire un carattere a scelta e premere INVIO: “);
scanf(“%c”, &carattere);
printf(“Inserire un intero compreso tra 0 e 127: “);
scanf(“%d”, &num);
printf(“Il carattere inserito e: %c \n”, carattere);
printf(“Il numero inserito e: %d \n”, num);
return(0);
}
All’inizio la variabile “num” viene dichiarata erroneamente come char e il programma non esegue bene (la riga printf(“Il carattere inserito e: %c \n”, carattere); non restituisce nessun valore), ma se si cambia e si mette int num; allora funziona alla perfezione.
Quindi la mia domanda è: come mai la riga che da problemi è quella con la variabile “carattere” e non quella con la variabile “num”?
Grazie a chi vorrà rispondermi.