Visualizzazione Stampabile
-
Allora, intanto grazie per il chiarimento sui float. In particolare, non sapevo dei problemi che si possono creare andando ad uguagliare dei float.
Darkito, il programma che hai modificato contiene un paio di righe in più. In pratica se inizializzo a zero i parametri e poi faccio assumere loro il valore inserito dall'utente non rischio errori?
Un'ultima cosa per quanto riguarda gli \n all'interno di una scanf.
La maggior parte di voi ritiene siano inutili e per il 90% dei casi potrei essere d'accordo.
Se notate, la scanf sui caratteri in cui volevo inserire uno \n è la seconda che si incontra nel codice scritto da me. Prima di quella c'è una scanf su un numero intero inserito dall'utente. Durante questa prima scanf, l'utente inserisce il numero ma preme anche Invio. Nella standard input del computer entrano sia il valore intero inserito, sia il carattere invio. Proprio questo carattere Invio potrebbe causare un problema in una seconda scanf dedicata ai caratteri (come accade nel mio caso), poiche questa seconda scanf andrebbe a leggere non "q" per terminare, ma ciò che nella standard input lo precede, ovvero l'Invio inserito dall'utente nella prima scanf. Inserendo una \n nella seconda scanf risolveremmo il problema. Ma perchè qui invece non serve?
Ora per semplificare vi mostro un codice che senza una \n in una seconda scanf per caratteri genererebbe un piccolo problema (provate a togliere \n):
Citazione:
#include <stdio.h>
#include <iostream>
int main () {
float a, b;
char operation;
int ok=1;
printf("Inserire i valori a e b:\n");
scanf("%f%f", &a, &b);
do {printf("Indacare l'operazione da eseguire (+,-,*,/):\n");
scanf("\n%c", &operation);
if (operation=='+') ok=0;
if (operation=='-') ok=0;
if (operation=='*') ok=0;
if (operation=='/') ok=0;
} while(ok);
switch(operation){
case '+': printf("%f+%f=%f\n", a, b, a+b);
break;
case '-': printf("%f-%f=%f\n", a, b, a-b);
break;
case '*': printf("%f*%f=%f\n", a, b, a*b);
break;
case '/': printf("%f/%f=%f\n", a, b, a/b);
break;
default: printf("Operazione non riconosciuta.\n");
}
system("pause");
return 0;
}
@Vaan: no, non ancora. :D
-
Riguardo alla tua prima domanda no, non rischi errori perchè è vero che inizializzi a zero entrambe però con il primo scanf fai assumere sia a max che a min lo stesso valore. Dopo però entri nel ciclo do while e sicuramente qualsiasi valore che inserirai sarà o maggiore del primo inserito e quindi verrà modificata la variabile max, oppure minore del primo e in questo caso verrà modificata la variabile min.
Riguardo a \n si utilizza nella scanf per escludere il carattere invio quando acquisisci un carattere subito dopo aver acquisito un qualsiasi altro dato da tastiera. Mentre nel primo caso a te va bene che il carattere invio battuto durante l'acquisizione di val venga letto da scanf("%c",&fine) in modo da "saltare" l'acquisizione della variabile fine, nel secondo esempio non puoi farne a meno perchè devi necessariamente leggere un carattere e non vuoi saltare quell'acquisizione. Lo so di non essere abbastanza chiaro ma per comprenderlo al meglio devi aver ben presente come funziona la funzione scanf e come vengono memorizzati nel buffer della tastiera i caratteri da te digitati.
-
Citazione:
Originariamente Scritto da
Darkito
Riguardo alla tua prima domanda no, non rischi errori perchè è vero che inizializzi a zero entrambe però con il primo scanf fai assumere sia a max che a min lo stesso valore. Dopo però entri nel ciclo do while e sicuramente qualsiasi valore che inserirai sarà o maggiore del primo inserito e quindi verrà modificata la variabile max, oppure minore del primo e in questo caso verrà modificata la variabile min.
Riguardo a \n si utilizza nella scanf per escludere il carattere invio quando acquisisci un carattere subito dopo aver acquisito un qualsiasi altro dato da tastiera. Mentre nel primo caso a te va bene che il carattere invio battuto durante l'acquisizione di val venga letto da scanf("%c",&fine) in modo da "saltare" l'acquisizione della variabile fine, nel secondo esempio non puoi farne a meno perchè devi necessariamente leggere un carattere e non vuoi saltare quell'acquisizione. Lo so di non essere abbastanza chiaro ma per comprenderlo al meglio devi aver ben presente come funziona la funzione scanf e come vengono memorizzati nel buffer della tastiera i caratteri da te digitati.
Mmm, credo di aver capito in linea di massima. Nel primo caso, lo \n non è necessario, poichè non sappiamo se l'utente vuole inserire un ulteriore val o terminare il programma inserendo il carattere q.
Nel secondo caso invece l'utente deve per forza inserire uno dei 4 caratteri (+,-,*,/) e quindi \n diventa necessario.
Bè grazie mille credo di aver risolto la maggior parte dei miei dubbi. :D
Se qualcuno notasse qualcosa di strano nei codici o nei ragionamenti lo faccia notare senza problemi.
-
Citazione:
Originariamente Scritto da
The Prince
Mmm, credo di aver capito in linea di massima. Nel primo caso, lo \n non è necessario, poichè non sappiamo se l'utente vuole inserire un ulteriore val o terminare il programma inserendo il carattere q.
Nel secondo caso invece l'utente deve per forza inserire uno dei 4 caratteri (+,-,*,/) e quindi \n diventa necessario.
Bè grazie mille credo di aver risolto la maggior parte dei miei dubbi. :D
Se qualcuno notasse qualcosa di strano nei codici o nei ragionamenti lo faccia notare senza problemi.
Secondo me nel caso in cui l'utente sceglie /(la divisione), devi mettere la condizione che b deve essere diverso da 0.:sisi:
E poi non capisco perchè inizialiazzi ok=1; perchè scrivi "while(ok)"? forse volevi scrivere while(ok==0)?
-
Citazione:
Originariamente Scritto da
Smallman_647
Secondo me nel caso in cui l'utente sceglie /(la divisione), devi mettere la condizione che b deve essere diverso da 0.:sisi:
E poi non capisco perchè inizialiazzi ok=1; perchè scrivi "while(ok)"? forse volevi scrivere while(ok==0)?
Certo, quando ci sono le divisioni si deve sempre evitare che si faccia una divisione per zero, il controllo è d'obbligo.
Riguardo a come utilizza la variabile ok, lui ha deciso di fare in quel modo, si poteva fare anche continuando il loop fino a che ok==0, ovviamente cambiando inizializzazione di ok e tutto quello che ci sta dentro il ciclo. L'algoritmo non è uno solo, bensì ci sono infiniti modi per realizzare un programma.
-
Citazione:
Originariamente Scritto da
Darkito
Certo, quando ci sono le divisioni si deve sempre evitare che si faccia una divisione per zero, il controllo è d'obbligo.
Riguardo a come utilizza la variabile ok, lui ha deciso di fare in quel modo, si poteva fare anche continuando il loop fino a che ok==0, ovviamente cambiando inizializzazione di ok e tutto quello che ci sta dentro il ciclo. L'algoritmo non è uno solo, bensì ci sono infiniti modi per realizzare un programma.
No, intendevo che while(ok) a quale condizione corrisponde?
-
Citazione:
Originariamente Scritto da
Smallman_647
No, intendevo che while(ok) a quale condizione corrisponde?
ah....corrisponde a while(ok!=0)
-
Approfitto del topic.
C'è un modo per sapere (sempre in C) il numero di righe di un file di testo?
-
Citazione:
Originariamente Scritto da
Albyx
Approfitto del topic.
C'è un modo per sapere (sempre in C) il numero di righe di un file di testo?
File di testo o testo del programma?
-
Citazione:
Originariamente Scritto da
Black Ghost
File di testo o testo del programma?
File di testo .txt esterno.