Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-05-2007, 22:24   #1
zergling
Senior Member
 
L'Avatar di zergling
 
Iscritto dal: Oct 2003
Città: Chicago, IL
Messaggi: 504
Calcolatrice

Ciao a tutti,
Inanzitutto vorrei precisare che sono un nubbio e che sono ancora alle prime armi .
Detto cio, passiamo al codice sorgente:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
int num1, num2, add, sub, div, mol;
cout << "Please give me two integers numbers\n";
cout << "for example 2+5 or 78-4 etc.\n\n";
cin >> num1 >> num2;

if ( '+' )
{
add = num1 + num2;
cout << "= " << add << endl;
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

if ( '-' )
{
sub = num1 - num2;
cout << "= " << sub << endl;
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

if ( '/' )
{
div = num1 / num2;
cout << "= " << div << endl;
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

if ( '*' )
{
mol = num1 * num2;
cout << "= " << mol << endl;
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}



system("PAUSE");
return EXIT_SUCCESS;
}

Funziona tutto correttamente a parte la divisione e la moltiplicazione

Dove ho sbagliato?
Ciao e grazie

Ultima modifica di zergling : 11-05-2007 alle 22:27.
zergling è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2007, 22:42   #2
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Sicuro che funzionare tutto correttamente? Io ne dubito guardando il codice.

Non può funzionare, sbagli già quando fai if('+'), che sarà sicurmemte sempre vera essendo '+' un valore diverso da zero e non nullo.
In più come fai ad essere sicuro che num1 e num2 sono numeri? hai controllato che non prenda anche gli operatori?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2007, 23:02   #3
zergling
Senior Member
 
L'Avatar di zergling
 
Iscritto dal: Oct 2003
Città: Chicago, IL
Messaggi: 504
Si, se provi a compilare il file, vedrai che "+ e - " funzionano correttamente.
zergling è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 00:18   #4
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
... funzionano per puro caso.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 09:24   #5
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Rivediti bene come funziona la condizione "if".
Inoltre ci devi spiegare dove leggi l'operatore.

@memon

c++ converte automaticamente il tipo di dato con l'operatore di estrazione >> in base al tipo a destra (non è come il C, essendo più type strict di C ti lascia meno libertà - e fa lui...), ovviamente quando ci riesce.
Infatti, con un minimo di eleganza, io farei così:

Codice:
int operands[2];

...

for (unsigned char i = 0; i < 2; i++)
{
   if ((cin >> operands[i] >> dec).fail())
   {
      cerr << "Operando " << (i + 1) << " non valido." << endl;
      exit(1);
   }
}
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 11:52   #6
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
mmm, ho provato a compilarlo... un esempio 5-7 , stampando num2 infatti non è un numero ma è una stringa formata da "-7", quindi con quel codice non era sicuro che num1 e num2 siano numero. CVD
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 12:28   #7
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da MEMon Guarda i messaggi
mmm, ho provato a compilarlo... un esempio 5-7 , stampando num2 infatti non è un numero ma è una stringa formata da "-7", quindi con quel codice non era sicuro che num1 e num2 siano numero. CVD
non proprio

Prova questo codice:

Codice:
#include <iostream>

using namespace std;

int main()
{
   int operands[2];

   cout << "Inserisci 2 numeri interi: ";
   for (unsigned char i = 0; i < 2; i++)
   {
      if ((cin >> operands[i] >> dec).fail())
      {
         cerr << "Operando " << (i + 1) << " non valido." << endl;
         exit(1);
      }
   }
   cout << "Numeri: " << operands[0] << " " << operands[1] << endl;
   return 0;
}
e prova ad inserire ad esempio "5-7".
come vedi, >> converte bene. Ecco perche a lui funziona la sottrazione e la somma.
>> converte in due interi, uno positivo ed uno negativo. Nel suo programma, entra nel primo if (per forza, visto che la condizione che ha specificato è sempre vera) e fa una somma tra un numero positivo ed uno negativo (quindi una sottrazione) e va. Idem se i due numeri sono entrambi positivi, o entrambi negativi. Tra l'altro, gli altri 3 'if' neanche li vede, entra sempre nel primo e fa la somma tra i due numeri convertiti dall'operatore di estrazione >>.
Ovviamente la divisione e il prodotto non vanno, perchè le condizioni che ha specificato sono errate alla radice (il primo if lo prende sempre, quindi è sono "un caso" se funziona).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 12-05-2007 alle 12:37.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 12:30   #8
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Si hai ragione lo converte in un numero negativo
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 18:43   #9
zergling
Senior Member
 
L'Avatar di zergling
 
Iscritto dal: Oct 2003
Città: Chicago, IL
Messaggi: 504
Hmmm, quindi come dovrebbe essere il codice?
Io per adesso ho soltanto visto IF...
zergling è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 19:03   #10
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da zergling Guarda i messaggi
Hmmm, quindi come dovrebbe essere il codice?
Io per adesso ho soltanto visto IF...
Se non ti offendi, cambio il nome delle variabili e rendo il tutto più compatto
Seguo comunque la sintassi di input da te definita prima, ma aggiungo un minimo controllo dell'input.

Codice:
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
	int op1, op2;
	char operation;

	cout << "Inserisci due numeri interi" << endl;
	cout << "ad esempio 2+5 o 78-4 etc." << endl << endl;
	if ((cin >> op1 >> dec).fail())
	{
		cerr << "Primo operando non valido." << endl;
		system("PAUSE"); // Ok stai usando Windows... ;)
		exit(1);
	}
	cin >> operation;
	if ((cin >> op2 >> dec).fail())
	{
		cerr << "Secondo operando non valido." << endl;
		system("PAUSE");
		exit(1);
	}
 
	switch(operation)
	{
		case '+':
			cout << "= " << (op1 + op2) << endl;
			break;
		case '-':
			cout << "= " << (op1 - op2) << endl;
			break;
		case '*':
			cout << "= " << (op1 * op2) << endl;
			break;
		case '/':
			cout << "= " << (op1 / op2) << endl;
			break;
		default:
			cout << "Operazione non valida." << endl;
	}
 	system("PAUSE");
	return EXIT_SUCCESS; // anche return 0 va bene.
}
EDIT: in fase di test, prova anche a dargli input "particolari", tipo -5--8, oppure a separare con degli spazi, tipo 20 / 4
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 12-05-2007 alle 19:11.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2007, 19:14   #11
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Scusami non avevo visto che finora hai studiato solo 'if'. Ok, riposto il programma usando if:

Codice:
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
	int op1, op2;
	char operation;

	cout << "Inserisci due numeri interi" << endl;
	cout << "ad esempio 2+5 o 78-4 etc." << endl << endl;
	if ((cin >> op1 >> dec).fail())
	{
		cerr << "Primo operando non valido." << endl;
		system("PAUSE"); // Ok stai usando Windows... ;)
		exit(1);
	}
	cin >> operation;
	if ((cin >> op2 >> dec).fail())
	{
		cerr << "Secondo operando non valido." << endl;
		system("PAUSE");
		exit(1);
	}
 
	if (operation == '+')
		cout << "= " << (op1 + op2) << endl;
	else if (operation == '-')
		cout << "= " << (op1 - op2) << endl;
	else if (operation == '*')
		cout << "= " << (op1 * op2) << endl;
	else if (operation == '/')
		cout << "= " << (op1 / op2) << endl;
	else
		cout << "Operazione non valida." << endl;

 	system("PAUSE");
	return EXIT_SUCCESS; // anche return 0 va bene.
}
Nota che quando un blocco 'if' contiene una sola riga di codice, puoi omettere le parentesi graffe.
Certo, nessuno ti vieta di fare:

Codice:
	if (operation == '+')
	{
		cout << "= " << (op1 + op2) << endl;
	}
	else if (operation == '-')
	{
		cout << "= " << (op1 - op2) << endl;
	}
	else if ...
ma secondo me è meno leggibile, perchè rende il sorgente inutilmente più lungo (poi personalmente cose del tipo:
if (condizione) {
una sola riga di codice; }
non le sopporto
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 12-05-2007 alle 19:18.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2007, 20:10   #12
zergling
Senior Member
 
L'Avatar di zergling
 
Iscritto dal: Oct 2003
Città: Chicago, IL
Messaggi: 504
Ciao -Fidel-
Finalemnte grazie al vostro aiuto e consigli ho finalmente capito dove sbagliavo.
Ho fatto un mischione tra IF e Case perche ho visto nel penultimo esempio di -Fidel- che il mio codice sorgente e' veramente simile al "Case".

Avrei bisogno di un ultima delucidazione da parte tua -Fidel-.
Che cosa fa questa cosa ? dec).fail()

Ciao e grazie a tutti per il vostro aiuto
zergling è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2007, 20:37   #13
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da zergling Guarda i messaggi
Ciao -Fidel-
Finalemnte grazie al vostro aiuto e consigli ho finalmente capito dove sbagliavo.
Ho fatto un mischione tra IF e Case perche ho visto nel penultimo esempio di -Fidel- che il mio codice sorgente e' veramente simile al "Case".

Avrei bisogno di un ultima delucidazione da parte tua -Fidel-.
Che cosa fa questa cosa ? dec).fail()

Ciao e grazie a tutti per il vostro aiuto
Semplice: con "dec" dico a c++ di trattare la variabile come un valore numerico (qualunque esso sia: intero, non intero (float), negatico, ecc). Quindi con:

cin >> op1 >> dec

dico a c++ di prendere da tastiera il primo valore che incontra, metterlo in op1 e trattarlo (forzarlo) come un numero decimale (in base 10), del tipo definito dalla variabile che conterrà il valore (int, float, double, ecc.) . Come puoi immaginare, non è assolutamente detto che questa operazione vada a buon fine (magari ho inserito delle lettere invece che dei numeri, oppure ho inserito un numero tipo 10,4 ma op1 è di tipo "int" e non "float", ecc.). Nel caso l'operazione non vada a buon fine, l'operatore >> setta un bit di errore interno, chiamato failbit: controllando quindi il valore di questo bit, si può sapere se l'operazione è andata a buon fine oppure no: è come un valore di ritorno dell'operatore >>. Per controllare se il failbit è stato settato (quindi c'è stato un errore) uso il metodo "fail()" dello stream: se esso ritorna "true" significa che il failbit è stato settato (è a 1) e quindi c'è stato un errore, di conseguenza entro nell'if, dove segnalo l'errore ed esco.

In pratica, con una riga di codice, ho fatto un controllo dei dati presi da tastiera

Se vuoi saperne di più su "dec" dai un'occhiata qui (vedrai che non esiste solo dec ):

http://www.cplusplus.com/reference/i...ators/dec.html
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
iOS 27 porterà tante novità...
Tutte le migliori offerte sui robot aspi...
Attenti ai Samsung 990 Pro contraffatti,...
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: 01:27.


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