Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-08-2007, 22: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, 09: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 09:27.
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 10: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, 10: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, 10: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 10:28.
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2007, 10: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, 11: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


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
L'eVTOL tedesco per missioni mediche e m...
Zscaler Threat Report 2026: l'adozione d...
Claude AI minaccia omicidi e ricatti qua...
Dentro la gara: a Milano Cortina 2026 i ...
Samsung Display presenta QD-OLED Penta T...
KONAMI torna con "Silent Hill: Town...
Rende il citofono smart a 44,99€: Ring I...
ThunderX3 XTC, la sedia da ufficio che s...
Mercy, Mission Impossible, Aronofsky: il...
Project Windless: il nuovo action in esc...
Saros: mostrato il gameplay del gioco de...
God of War: Sons of Sparta annunciato e ...
John Wick torna in un nuovo videogioco a...
MADE chiude il 2025 con 59 partner e 250...
007 First Light: allo State of Play un n...
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: 08:28.


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