Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Marathon: arriva il Fortnite hardcore
Marathon: arriva il Fortnite hardcore
Marathon è il titolo multiplayer competitivo del momento. Ecco quali sono le caratteristiche di gioco principali, insieme alle nostre prime considerazioni dopo qualche "run" nell'extraction shooter di Bungie
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: 592
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


Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
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...
Artemis II: completata la manovra di ins...
Panasonic LUMIX TZ300: la nuova compatta...
La società aerospaziale italiana ...
Il Politecnico di Milano guiderà ...
Amazon Leo punta ad aumentare la cadenza...
Pro Type Ergo: Razer si lancia a gamba t...
Artemis II: dal guasto risolto alla toil...
Le immagini e i video più spettac...
Previsioni drastiche di TrendForce: la D...
La PS6 portatile sarà più potente della ...
Toshiba annuncia i primi dischi FC-MAMR ...
Amazon Leo offrirà l'accesso a Internet ...
Alienware presenta i nuovi desktop Area-...
Fiat 600 benzina senza ibrido: 101 CV, c...
DJI Mini 4K Combo a 269€ o DJI Neo da 14...
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: 05:34.


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