Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-05-2006, 15:08   #1
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
[C++] espressioni logiche

[Modificato]

Buongiorno a tutti! Questo e' il mio primo post! Mi chiamo Francesco ed ho quattordici anni.

Da qualche giorno ho iniziato a studiare il linguaggio di programmazione C++ e sto scoprendo lentamente un mondo nuovo per me affascinante.

Durante lo svolgimento di alcuni esercizi di riepilogo a fine capitolo, contenuti nel libro che ho acquistato, ho incontrato le prime difficolta'.

Il programma che segue, da me scritto, effettua una semplice conversione tra scale di temperatura.
Codice:
// temp.cc - temperature converter, integer value

#include <iostream>
using namespace std;

void convert(int temp, char c)
{
	int x;
	
	switch(c) {
		case 'f':
			x = static_cast<int>(5.0  / 9.0 * (temp - 32.0));
			cout << "Tc = " << x << endl;
			break;
		case 'c':
			x = static_cast<int>(9.0 / 5.0 * temp + 32.0); 
			cout << "Tf = " << x << endl;
			break;
		default:
			cout << "an error occured!";
	}
}

int main()
{
	int t;
	char ch;
	
	cout << "Temperature converter - °F ~ °C\n";
	do {
		cout << "Scale? (c/f): ";
		cin >> ch;
	} while(ch != 'f' && ch != 'c');
	cout << "Valore: ";
	cin >> t;
	convert(t,ch);
}
Per quale motivo l'espressione di controllo dell'istruzione do while funziona esclusivamente con un AND?

Ragionando sulla condizione questa non dovrebbe essere del tipo "finquando il carattere digitato non e' uguale a f o c riproponi l'input?".
Se cosi fosse perche' non puo' essere codificata con un OR? (loop!)
Codice:
do {
   cout << "Scala? (c/f): ";
   cin >> ch;
} while(ch != 'f' || ch != 'c');
Chi puo' darmi delucidazioni a riguardo?

Ultima modifica di riemann_01 : 29-05-2006 alle 13:54.
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2006, 15:43   #2
scorpion89
Senior Member
 
L'Avatar di scorpion89
 
Iscritto dal: Mar 2006
Città: Bottegone (PT)
Messaggi: 978
Molto semplicemente xkè le condizioni sono invertite.
Cioè il do... while si può tradurre in un esci dal ciclo quando ch=='f' or ch=='c'
ma visto ke la condizione da scrivere è quella opposta viene fuori la condizione negata e
quindi
ch!='f' && ch!='c'

Scusa se mi sono spiegato male!!

Ciao
__________________
[ Gentoo && Debian && OpenBSD ] Rulez
[irc.rizon.net #linux-world ] [ irc.pocoserio.net #poco-serio ]
TC FUCKKKKKKKKKKKKKKKKKKKKKK | Pronto per il prossimo raduno, Oh YEAHHHH
scorpion89 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2006, 16:50   #3
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
La tua spiegazione e' leggermente oscura! LOL

Credo comunque di aver capito l'errore.
Ho analizzato in modo piu' approfondito la questione.

La condizione deve essere interpretata come: "esegui queste istruzioni finquando il carattere digitato e' diverso da c ed f".

In ogni caso, grazie per la risposta!
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2006, 17:13   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da riemann_01
La condizione deve essere interpretata come: "esegui queste istruzioni finquando il carattere digitato e' diverso da c ed f".
Esatto, la condizione nel while deve essere vera affinché il ciclo do-while si ripeta.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2006, 17:46   #5
scorpion89
Senior Member
 
L'Avatar di scorpion89
 
Iscritto dal: Mar 2006
Città: Bottegone (PT)
Messaggi: 978
scusa ma l'italiano nn è il mio forte


Ciao
__________________
[ Gentoo && Debian && OpenBSD ] Rulez
[irc.rizon.net #linux-world ] [ irc.pocoserio.net #poco-serio ]
TC FUCKKKKKKKKKKKKKKKKKKKKKK | Pronto per il prossimo raduno, Oh YEAHHHH
scorpion89 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2006, 22:56   #6
mr_hyde
Senior Member
 
Iscritto dal: Oct 2005
Città: Genova
Messaggi: 937
Riemann: visto che sei agli inizi mi permetto di darti un piccolo consiglio.
Nella tua funzione "convert" hai usato il passaggio di parametri con il reference (& dopo il tipo del parametro).
Pero' la tua funzione NON modifica i due parametri. In questo caso NON devi quindi usare & per il passaggio di parametri.

"&" va usato solo quando i parametri devono essere modifcati e restituiti modificati al chiamante.

Ad esempio:

void funzione_che_cambia(int& i)
{
i = 3;
}

void funzione_che_non_cambia(int i)
{
i = 3;
}

int main()
{
int a = 1;
std::cout << "Inizio con il valore " << a << std::endl;

// ora chiamo la funzione che NON cambia il valore
funzione_che_non_cambia(a);

std::cout << "Dopo la chiamata ho il valore " << a << std::endl;

// ora chiamo la funzione che CAMBIA il valore
funzione_che_cambia(a);

std::cout << "Dopo la chiamata ho il valore " << a << std::endl;

return 0;
}

La differenza e' molto importante e lo diventera' ancora di piu' quando inizierai a scrivere classi e metodi e le cose si complicheranno un pochino...

Se queste cose le sai gia'... allora chiedo scusa!

Ciao,
Mr Hyde
__________________
MacMini Late 2009/MacMini 2018
mr_hyde è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 21:06   #7
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
Grazie per il consiglio mr_hyde!

Conosco la differenza fra call-by-value e call-by-reference.

Scrivendo la procedura convert ho pensato che si potesse operare una forma "banale" di ottimizzazione evitando l'uso di due variabili locali.

Utilizzare questo metodo viola, in qualche modo, i concetti di programmazione modulare (procedurale)? Oppure e' un semplice "errore" semantico?
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 22:16   #8
mr_hyde
Senior Member
 
Iscritto dal: Oct 2005
Città: Genova
Messaggi: 937
Quote:
Originariamente inviato da riemann_01
Grazie per il consiglio mr_hyde!

Conosco la differenza fra call-by-value e call-by-reference.

Scrivendo la procedura convert ho pensato che si potesse operare una forma "banale" di ottimizzazione evitando l'uso di due variabili locali.

Utilizzare questo metodo viola, in qualche modo, i concetti di programmazione modulare (procedurale)? Oppure e' un semplice "errore" semantico?
Be', l'esempio e' un po' scarno per parlare di violazione di programmazione modulare...

Ad ogni modo e' vero, qualche volta capita di passare reference per motivi di ottimizzazione, ma generalmente si fa con oggetti "grossi".
E comunque, un tempo, qualcuno diceva che invece che passare un reference, per motivi prestazionali, era meglio passare un puntatore all'oggetto, ma si parla di anni fa e nel frattempo i compilatori sono migliorati.

Se proprio vuoi usare i reference allora usa la forma con il const quando vuoi comunque impedire la modifica, ovvero:

int the_function(const int& nonLoCambio, float& loCambio)

Ciao,
Mr Hyde
__________________
MacMini Late 2009/MacMini 2018
mr_hyde è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 13:52   #9
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
Ti ringrazio per la disponibilita'.
A presto!
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 14:43   #10
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Scusa la domanda: mi aspetterei che il tuo programma, nel caso 'f', ti stampi sempre zero. E' cosi?

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2006, 14:01   #11
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
Codice:
riemann@home:~$ ./convert
Temperature converter - °F ~ °C
Scala? (c/f): c
Valore: 26
Tf = 78
riemann@home:~$ ./convert
Temperature converter - °F ~ °C
Scala? (c/f): f
Valore: 100
Tc = 37
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2006, 01:45   #12
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da riemann_01
Codice:
riemann@home:~$ ./convert
Temperature converter - °F ~ °C
Scala? (c/f): c
Valore: 26
Tf = 78
riemann@home:~$ ./convert
Temperature converter - °F ~ °C
Scala? (c/f): f
Valore: 100
Tc = 37
Beh, la versione 2.0 sembra funzionare decisamente meglio. Evidentemente la 1.0 stampava sempre zero...

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2006, 11:11   #13
riemann_01
Member
 
Iscritto dal: May 2006
Messaggi: 38
Stampava zero poiche' in convert si utilizzava l'aritmetica di tipo intero.
5 / 9 * (temp - 32) = 0 * (temp - 32)
riemann_01 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
La gamma Mac riceverà tante novit...
DDR5 supera i 13.000 MT/s, stavolta uffi...
Il nuovo iPhone con display pieghevole p...
ASUS ProArt PA32KCX: ecco a voi il primo...
DAZN ci riprova: piano Full a meno di 20...
Nuovi prezzi, più bassi: scendono...
PC Desktop HP Victus con RTX 4060 e Ryze...
Giù di altri 10€: solo 939€ per M...
Offerte Amazon da non credere: sconti fo...
Windows 11 scivola sugli aggiornamenti d...
Razer Kiyo V2: la nuova webcam 4K con AI...
ASUS ROG NUC 9: i mini PC (ex) Intel, ad...
Streaming illegale, il ministro dello Sp...
Microsoft avrebbe affidato a Intel la pr...
'Un momento storico': Jensen Huang annun...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v