Torna indietro   Hardware Upgrade Forum > Software > Programmazione

L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-08-2007, 21:19   #1
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
[c] mini calcolatrice con scanf

non riesco a capire perche questo programma che dovrebbe essere una calcolatrice in notazione polacca inversa funziona , tranne che con la somma e la sottrazione
in pratica se scrivo
4 5 * =
mi da come risultato 20
10 2 / =
5
4 5 + (o meno )
comando
non conosciuto
se poi sostituisco nel prog al + un carattere qualsiasi e uso quest'ultimo per fare la somma funziona tranquillamente.
presumo che sia un problema con al console

il prog è
Codice:
/*mini calcolatrice in notazione polacca post fissa con scanf*/
#include <stdio.h>

#define MAXSTACK 100

int stack[MAXSTACK];
int *sp = stack;

void push(int);
int pop(void);

main()
{
	int c,val;
	int op;
	while((c=scanf("%d",&val))!= EOF)
		if(c)
			push(val);
	else if(scanf("%c",&val))		
		switch(val)
		{
			case '*':
				push(pop()*pop());
				break;
			case '+':
				push(pop()+pop());
				break;
			
			case '-':
				op = pop();
				push(pop()-op);
				break;
			case '/':
				op = pop();
				push(pop()/op);
				break;
			case '=':// stampa il risultato
				printf("%d",pop());
				break;
			default:
				printf("comando '%c' non conosciuto ",val);
				break;
		}
			
}

void push(int val)
{
	*sp++ = val;
}

int pop(void)
{
	if(sp-1 >= stack)
		return *--sp;
	else
		printf("stack vuoto\n");
	return 0;
}
ah sotto linux
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 08:18   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
non ho una macchina linux a disposizione. Ho provato con win e VS, ottenendo il tuo stesso risultato.

Ovviamente, se semplicemente ti interessa risolvere il problema, puoi sostituire la scanf(%c) con una getchar().

Ad ogni modo, mi sembra che succeda questo:
- fintanto che il numero e' corretto, scanf(%d) lo legge correttamente;
- quando inserisci un carattere, scanf(%d) FALLISCE. Il carattere e' quindi ancora nel buffer di tastiera, e la successiva scanf(%c) lo leggera' correttamente;
- quando inserisci un + od un -, scanf (%d) pensa che tu stia inserendo un NUMERO. Pertanto si aspetta che, dopo il +/-, seguano delle cifre.
Siccome non seguono, ti riporta una condizione di errore, la stessa che utilizzi per terminare il ciclo di lettura dei numeri e passare a leggere il carattere dell'operazione.
- scanf(%c) va a leggere il carattere successivo al +/-, cioe' il carattere di ritorno a capo.

E' quindi evidente che scanf() "parserizza" il suo input prima di restituirtelo.
Non e' come la getchar() la quale prende il primo carattere a disposizione e te lo restituisce: la scanf() e' piu' sofisticata.
Sembra la scanf(%d) faccia cosi:
- legge i caratteri, i quali devono essere cifre, eventualmente precedute dal segno;
- se cosi' non e', "rimetti tutto" nel buffer di input;
- se invece e' un numero mal formato (quindi un errore come quello che ti trovi), allora "rimette tutto nel buffer" ma avanza con il suo "puntatore" ai caratteri successivi, in modo da non dover piu' parsare la parte errata.

Questo spiegherebbe perche' la getchar() successiva funziona!
__________________
In God we trust; all others bring data

Ultima modifica di sottovento : 14-08-2007 alle 08:27.
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 09:07   #3
vegeta83ssj
Senior Member
 
L'Avatar di vegeta83ssj
 
Iscritto dal: Feb 2002
Città: Modena
Messaggi: 594
Leggendo qua:
http://www.cplusplus.com/reference/c...dio/scanf.html

il motivo per cui non ti funziona è che metti il simbolo di operazione in una variabile intera, che è:

Quote:
Number optionally preceeded with a + or - sign.
quindi la scanf ti interpreta + e - come segni di un numero che però non c'è.

Ciauz
vegeta83ssj è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 09:10   #4
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da vegeta83ssj Guarda i messaggi
Leggendo qua:
http://www.cplusplus.com/reference/c...dio/scanf.html

il motivo per cui non ti funziona è che metti il simbolo di operazione in una variabile intera, che è:



quindi la scanf ti interpreta + e - come segni di un numero che però non c'è.

Ciauz
Esatto. Proprio quello che ho riportato
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 09:21   #5
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
grazie
ho capito il problema.
non avevo pensato che un numero puo essere preceduto da segno + e

EDIT:
ma quando la scanf(%d) fallisce il carattere + o - gia lo ha letto
quindi dopo la getchar() o la scanf(%c) leggera comunque il carattere a capo
no so come risolverlo

Ultima modifica di mastoo : 14-08-2007 alle 09:28.
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 09:31   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da mastoo Guarda i messaggi
grazie
ho capito il problema.
non avevo pensato che un numero puo essere preceduto da segno + e

EDIT:
ma quando la scanf(%d) fallisce il carattere + o - gia lo ha letto
quindi dopo la getchar() o la scanf(%c) leggera comunque il carattere a capo
no so come risolverlo
La prova che ho fatto, (semplicemente car = getchar() invece di scanf ("%c", &car) funzionava. Pero' l'ho fatta su un sistema diverso. Hai gia' provato?
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 10:45   #7
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
si ho provato cosi
Codice:
.....
main()
{
	int c,val;
	int op;
	while((c=scanf("%d",&val))!= EOF)
		if(c)
			push(val);
	else if(val = getchar())		
		switch(val)
		{
			case '*':
				push(pop()*pop());
				break;
			case '+':
				push(pop()+pop());
				break;
			
			case '-':
				op = pop();
				push(pop()-op);
				break;
			case '/':
				op = pop();
				push(pop()/op);
				break;
			case '=':// stampa il risultato
				printf("%d",pop());
				break;
			default:
				printf("comando '%c' non conosciuto ",val);
				break;
		}
			
}
...
ma è uguale a prima
mastoo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
DXC e Anthropic insieme per portare l'IA...
Lenovo presenta nuove soluzioni per l'IA...
OVHcloud potenzia la Quantum Platform: i...
Octopus Energy lancia Nook, la sua gamma...
IBM presenta il primo chip al mondo sott...
Qualcomm Dragonfly debutta nel settore d...
Scopa elettrica Proscenic P11 Ultra+ a 8...
Napoli capitale italiana del calcolo qua...
Emma avrebbe dovuto contribuire alla sov...
Tesco abbandonerà VMware e migrer...
Driver AMD rotti su Windows 10? Rilascia...
Il salto quantistico del 2025 di Microso...
Licenziato da Google per aver reso Works...
Prime Day Action Cam, DJI e Insta360 si ...
La rete delle PMI non può pi&ugra...
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: 16:03.


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