Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini è uno smartwatch compatto capace di offrire un'esperienza completa di monitoraggio della salute e fitness con una cassa da 43 mm che può adattarsi a qualsiasi tipo di polso, dal più grande al - soprattutto - più piccolo. Con l'architettura dual-chip e un'autonomia che può coprire due giorni con tranquillità, rappresenta la soluzione ideale per chi cerca prestazioni premium in un formato ridotto.
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Dopo il recente lancio della serie Xiaomi 15T di Monaco, vi parliamo oggi della versione più performante della nuova famiglia, ovvero Xiaomi 15 T Pro. Vi raccontiamo la nostra prova nel dettaglio, spiegando perché a questo prezzo e in questa fascia, questo smartphone ha davvero senso tenerlo in seria considerazione.
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer ha ampliato la sua offerta professionale con il TravelMate P6 14 AI, un notebook ultraleggero e robusto pensato per chi lavora in mobilità. Certificato Copilot+ PC, combina design premium, autonomia elevata e piattaforma Intel Core Ultra Serie 2 con funzionalità AI, garantendo sicurezza, affidabilità e produttività per l'utenza business moderna.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-02-2010, 18:01   #1
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
[C]Aiuto per un programma

Ciao a tutti, sono agli inzi del C... ho un esercizio da fare per casa ma non so dove partire... mi potreste dare una mano per favore e mi potreste spiegare il programma?

ecco:


Realizzare una funzione che permetta di introdurre da tastiera un dato
numerico (intero o reale a scelta), eseguendo il controllo che
l'introduzione sia corretta (cioe' che non ci siano stati errori di
battitura. La funzione deve restituire il valore EOF se e' stato battuto
<CTRL>+'Z'. Realizzare un programma main di collaudo.

Grazie a tutti...
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 18:23   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2775
Quali funzioni per l'input avete visto a scuola?
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 19:25   #3
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Allora, è una situazione un po' strana perchè in questo corso hanno unito 2 corsi e noi abbiamo fatto meno cose rispetto all'altro corso... Ad esempio me le hanno spiegate per la prima volta solo ieri...

Non capisco cosa intendo per che funzioni abbiamo visto...
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 19:38   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2775
Io lo farei in modo molto semplice usando insieme scanf() e getchar(), avete visto queste funzioni?
http://www.cplusplus.com/reference/c.../cstdio/scanf/
http://www.cplusplus.com/reference/c...stdio/getchar/

Procederei così:
Provi a leggere un intero (o un reale) con scanf, se la lettura non riesce (cioè se scanf torna 0) consumi l'intero input con getchar fermandoti quando incontri '\n' o EOF: nel primo caso riprovi a leggere con scanf, nel secondo caso torni EOF. Se la lettura con scanf riesce ritorni il valore letto.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 19:45   #5
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Allora, innanzitutto grazie!!

Getchar non l'ho mai visto... Scanf si...
DI quello che mi hai spiegato non riesco a capire cosa vuol dire che lo scanf torna a zero se la lettura non riesce? Non so cosa voglia dire consumare lintero imput con getchar... Non capisco a dir la verità nemmeno cosa chiede il problema...
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 20:28   #6
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2775
Quote:
Originariamente inviato da Alex 10 Guarda i messaggi
Allora, innanzitutto grazie!!

Getchar non l'ho mai visto... Scanf si...
DI quello che mi hai spiegato non riesco a capire cosa vuol dire che lo scanf torna a zero se la lettura non riesce? Non so cosa voglia dire consumare lintero imput con getchar... Non capisco a dir la verità nemmeno cosa chiede il problema...
La funzione scanf ritorna un valore int, che è il numero di oggetti letti (come da documentazione), quindi se ritorna il valore 0 significa che la lettura non è riuscita.
Quando digiti qualcosa e premi invio quello che hai digitato (invio compreso, che è il carattere '\n') viene messo in un buffer di input (un buffer è un contenitore) e quando vengono richiamate funzioni come la getchar e la scanf parte di esso viene "consumato" (in sostanza mano a mano che leggi il buffer si svuota).
Il problema chiede di scrivere una funzione che si occupi solo della lettura di un int o di un reale ma non come se ne occupa la scanf, che ritorna il valore zero se la lettura non riesce, ma che ritorni sempre un valore letto. Questo significa che quando l'utente digita un valore che non sia quello che ti aspetti (ad esempio int) la funzione in questione non deve ritornare un valore (come fa la scanf) ma deve attendere che l'utente inserisca un valore accettabile e solo a quel punto ritornarlo.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 22:40   #7
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Grazie mille per gli aiuti che mi stai dando...
Quindi da come ho capito devo far si che l'utente introduca un valore che ad esempio sia intero... Se l'utente invece introduce al posto che un numero intero un carattere lo scanf non acquisisce il valore ma rimane ad aspettare che l'utente acquisice un valore giusto?


Codice:
#include <stdio.h>
#include <stdlib.h>

int scanf(){
int dato;
printf("Introdurre un valore intero: ");
scanf("%d",&dato);
return;
}

int main(){
while (flag=0){
scanf();
if (scanf>0)
flag=1;
return 0;
}
E' sbagliato non è vero? Scusa l'ignoranza ma non ho mai visto come si utilizza la funzione scanf come fosse un intero... L'ho usata sempre e solo per acquisire i dati...
Ste funzioni mi stanno facendo impazzire, al primo corso non ce le hanno nemmeno accennate :S... Ora per ogni cosa, come portare un valore da una funzione ad un'altra è un problema!!
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2010, 23:06   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2775
Quote:
Originariamente inviato da Alex 10 Guarda i messaggi
Codice:
#include <stdio.h>
#include <stdlib.h>

int scanf(){
int dato;
printf("Introdurre un valore intero: ");
scanf("%d",&dato);
return;
}

int main(){
while (flag=0){
scanf();
if (scanf>0)
flag=1;
return 0;
}
Io inizierei dando un altro nome alla funzione che devi scrivere, anche per non fare confusione quando parliamo. Scegli tu un nome, ora io la chiamerò readInt.
Secondo le richieste del tuo professore readInt deve ritornare un intero letto da tastiera oppure EOF se viene premuto CTRL+Z.
Il main deve richiamare la funzione in modo da non essere implicato nella soluzione di questo particolare problema. In pratica il main sarà ad esempio:
Codice:
int main(){
  int val=readInt();
  if(val!=EOF)
    printf("Hai inserito: %d\n",val);
  else printf("Hai premuto CTRL+Z\n");
}
In pratica ti sto dicendo di spostare il ciclo while dentro la funzione stessa invece di eseguirlo nel main.
Poi c'è un problema: scanf se restituisce 0 non consuma dati nel buffer, quindi continuare a richiamare scanf non risolve il problema se viene inserito un "non intero" (vai in loop infinito). Era per risolvere questo problema che consigliavo di usare getchar: puoi leggere carattere per carattere finché non giungi alla fine del buffer (quindi '\n') e poi riprovare la lettura con scanf (o restituire EOF se invece di '\n' hai trovato EOF).

PS: un'altra cosa, hai incluso stdlib.h ma per risolvere questo problema non serve

Ultima modifica di wingman87 : 23-02-2010 alle 23:08.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2010, 14:30   #9
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Ah quindi il programma deve restituire che l'utente ha inserito Ctrl+Z se l'utente preme Ctrl+Z mandando lo scanf come valore a -1 e facendo scattare il EOF... Altrimenti se l'utente inserisce un numero intero giusto il programma restituisce solamente il numero inserito? QUindi bisogna trattare la funzione readint come un intero che deve essere analizzato dall 'if all'interno del main...

Grazie mille dell'aiuto...

SOlo non ho ancora capito il fatto del getchar...

P.S. Il professore ci fa usare come programma code blocks e il programma inserisce in automatico appena inzi sia stdio sia stdlib quindi lo metto sempre ma in realtà non so esattamente a cosa serve...

Cmq così dici che va bene:

Codice:
#include <stdio.h>
int dato;

int readint (valore) {
printf("Inserisci un numero intero: ");
scanf("%d", &valore);
return (scanf);
}

int main(){

dato=readint ();
if(dato!=EOF)
printf("Il valore inserito e': %d", dato);
else   printf("Hai inserito Ctrl+Z");
return 0;
}
P.S. Mi puoi spiegare come passare le variabili tra le funzioni perchè non ho ben capito perchè ad esempio nel main si scrive dato e nella funzione valore...
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2010, 19:02   #10
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2775
In effetti non avevo notato che quando raggiungi EOF scanf ritorna proprio EOF.
Ho provato a scrivere la mia soluzione in codice ma ho trovato dei problemi. EOF in windows ha il valore -1, quindi sia che tu digitassi CTRL+Z sia che digitassi -1 con il sistema che descrivevo otterresti di aver raggiunto EOF, erroneamente nel secondo caso. Avrei dovuto pensarci prima in effetti.

Allora, direi di dimenticare il getchar, anche perché è perfettamente sostituibile con
Codice:
char carattere;
scanf("%c",&carattere);
Per il passaggio di parametri e le funzioni in generale prova a vedere questo link:
http://digilander.libero.it/uzappi/C/C-funzioni.html
Mi sembra fatto abbastanza bene.

Dobbiamo ideare una nuova intestazione per la funzione che devi scrivere, in modo da poter distinguere il valore EOF dal valore -1.
Potremmo usare:
int readInt(int* var);
E decidere che readInt restituisca 1 se ha letto un valore intero e *val conterrà il valore letto, e restituisca -1 se ha letto EOF (e val resterà invariato).

La funzione verrà utilizzata in questo modo:
Codice:
int main() {
    int dato;
    if (readInt(&dato)!=-1)
        printf("Il valore inserito e': %d", dato);
    else   printf("Hai inserito Ctrl+Z\n");
    return 0;
}
Ti propongo quindi una nuova soluzione: provi a leggere un intero con scanf, se la lettura riesce (cioè scanf ritorna 1) ritorni 1, se invece scanf incontra EOF ritorni -1 e se ritorna 0 leggi un solo carattere e ricominci da capo.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2010, 21:56   #11
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Si penso di avercela fatta!!! Però lo scanf mi ha dato un sacco di problemi perchè se ad esempio inserivo al posto di un numero una lettera non mi leggeva più lo scanf perchè la lettera restava memorizzata nel buffer credo... Alla fine ho risolto distinguendo aggiungengo un carattere char in caso l'utente introducesse una lettera... Ecco:


Codice:
#include <stdio.h>
#include <stdlib.h>

int readint (int *val);

int main()
{

	int dato;
	if(readint(&dato)!=-1)
        printf("\nIl valore inserito e' %d\n",dato);
    else
        printf("Hai premuto Ctrl+Z\n");
	return 0;
}

int readint (int *val){
    int ret,flag=0,carattere=0;
    char car;
    printf("Introduci un numero intero: ");
    while (flag==0){
       ret=0;
        ret=scanf("%d",val);
        if(ret<=0){
            if (ret==EOF)
                flag=1;
            else{
                ret=scanf("%c",&car);
            }
        }
        else
        printf("Letto intero: %d\n", *val);


    }
    return ret;
}
Mi puoi spiegare solo la parte in grassetto sottolineata? Cioè, il compilatore mi segnava errore in quel punto e sono riuscito a risolvere togliendo l'asterisco prima di val... Ma non ho capito perchè... Non si dovrebbe mettere come puntatore all'interno della funzione readint val?
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2010, 22:07   #12
bobbytre
Senior Member
 
L'Avatar di bobbytre
 
Iscritto dal: Feb 2010
Messaggi: 466
Quote:
Originariamente inviato da Alex 10 Guarda i messaggi
Si penso di avercela fatta!!! Però lo scanf mi ha dato un sacco di problemi perchè se ad esempio inserivo al posto di un numero una lettera non mi leggeva più lo scanf perchè la lettera restava memorizzata nel buffer credo... Alla fine ho risolto distinguendo aggiungengo un carattere char in caso l'utente introducesse una lettera... Ecco:


Codice:
#include <stdio.h>
#include <stdlib.h>

int readint (int *val);

int main()
{

	int dato;
	if(readint(&dato)!=-1)
        printf("\nIl valore inserito e' %d\n",dato);
    else
        printf("Hai premuto Ctrl+Z\n");
	return 0;
}

int readint (int *val){
    int ret,flag=0,carattere=0;
    char car;
    printf("Introduci un numero intero: ");
    while (flag==0){
       ret=0;
        ret=scanf("%d",val);
        if(ret<=0){
            if (ret==EOF)
                flag=1;
            else{
                ret=scanf("%c",&car);
            }
        }
        else
        printf("Letto intero: %d\n", *val);


    }
    return ret;
}
Mi puoi spiegare solo la parte in grassetto sottolineata? Cioè, il compilatore mi segnava errore in quel punto e sono riuscito a risolvere togliendo l'asterisco prima di val... Ma non ho capito perchè... Non si dovrebbe mettere come puntatore all'interno della funzione readint val?
perche nella funzione readint gli passi come parametro un puntatore ( indirizzo ) quindi nella scanf lo devi utilizzare senza *
bobbytre è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2010, 20:52   #13
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Quindi se ho capito bene *val è solo l'indirizzo di dato... Quindi quando uso lo scanf devo dargli lo spazio all'interno del dato e quindi non metto * perchè così si prende lo spazio all'interno di dato visto che ho già detto alla funzione readint che val deve fare riferimento a dato?
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2010, 23:47   #14
bobbytre
Senior Member
 
L'Avatar di bobbytre
 
Iscritto dal: Feb 2010
Messaggi: 466
Quote:
Originariamente inviato da Alex 10 Guarda i messaggi
Quindi se ho capito bene *val è solo l'indirizzo di dato... Quindi quando uso lo scanf devo dargli lo spazio all'interno del dato e quindi non metto * perchè così si prende lo spazio all'interno di dato visto che ho già detto alla funzione readint che val deve fare riferimento a dato?
bobbytre è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2010, 12:26   #15
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
Quote:
Originariamente inviato da bobbytre Guarda i messaggi
non so mi potresti spiegare meglio cosa vuol dire dato all'interno del main, che vuol dire *val, che vuol dire &val e che vuol dire val da solo?
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2010, 12:39   #16
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12846
Quote:
Originariamente inviato da Alex 10 Guarda i messaggi
non so mi potresti spiegare meglio cosa vuol dire dato all'interno del main, che vuol dire *val, che vuol dire &val e che vuol dire val da solo?
Non ho visto il codice cmq:

Supponendo che val sia una variabile normale:

&val: è l'indirizzo di memoria di val

Supponendo che val sia un puntatore (ovvero un indirizzo di memoria):

*val: è l'operazione inversa di &, mi restituisce l'oggetto puntato da val.

Quindi per farti un esempio, se val è una variabile semplice:

*(&val) = val
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 28-02-2010, 13:59   #17
bobbytre
Senior Member
 
L'Avatar di bobbytre
 
Iscritto dal: Feb 2010
Messaggi: 466
Quote:
Originariamente inviato da Alex 10 Guarda i messaggi
non so mi potresti spiegare meglio cosa vuol dire dato all'interno del main, che vuol dire *val, che vuol dire &val e che vuol dire val da solo?
per farti capire di faccio un esempio:

int val = 100;

quando tu fai riferimento a val , fai riferimento al contenuto di val quindi a 100

printf("%d",val) ; // ti stampa 100

invece &val è indirizzo di memoria di val , all'interno del quale è poi contenuto il valore della variabile.

printf("0x%X",&val) ; // ti stampa qualcosa come 0xAABBCC ( che è l'indirizzo della memoria)


scanf come parametri vuole degli indirizzi di memoria dentro i quali poi salverà i dati , è per questo che in genere si usa cosi:
Codice PHP:
int val;
scanf("%d",&val); 
nella tua funzione readint tu hai come parametro un puntatore ( quindi un indirizzo di memoria), per questo all'interno della tua funzione quando fai riferimento a val stai facendo riferimento a un indirizzo ( 0xAABBCC) e non al suo contenuto.
scanf come detto vuole un indirizzo, quindi nella tua funzione lo devi usare cosi :
Codice PHP:
scanf("%d",val); // essendo val un indirizzo 
se dentro la tua funzione readint dopo che gli metti un valore vuoi visualizzarlo , puoi farlo cosi:
Codice PHP:
printf("%d", *val ); 
*val fa riferimento al contenuto e non all'indirizzo.
bobbytre è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2010, 21:02   #18
Alex 10
Senior Member
 
L'Avatar di Alex 10
 
Iscritto dal: Nov 2006
Città: Torino
Messaggi: 677
va bene... Grazie mille per l'aiuto a tutti!
Alex 10 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla OPPO Watch X2 Mini, lo smartwatch compatto a cui...
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione Xiaomi 15T Pro, è lui il nuovo best buy? ...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Dacia stupisce con Hypster. Nascono le K...
Dacia svela Spring 2026: nuova batteria ...
Lunedì sera tiratela lunga: a mez...
Il prossimo pieghevole di Huawei potrebb...
Euro digitale nel 2027 con app e infrast...
Galaxy S26 Ultra: tra le novità c...
OneDrive avrà presto una nuova app per W...
Il nuovo OnePlus 15 è pronto: il ...
Non serve essere Prime: 7 offerte bomba ...
Ci sono un sacco di prodotti con lo scon...
Xbox Game Pass, gli aumenti di prezzo pe...
I nuovi top di gamma di HONOR sono pront...
Il Garante della Privacy ha bloccato Clo...
C'è un nuovo operatore virtuale s...
Google Chrome non si ferma più: &...
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:43.


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