Torna indietro   Hardware Upgrade Forum > Software > Programmazione

TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
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: 12843
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


TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Video di qualità superiore agli i...
NVIDIA punta 100 miliardi sull'AI di Ope...
La NASA ha presentato la classe di candi...
Zuckerberg risponde agli investitori: 'B...
Il telescopio spaziale James Webb ha oss...
Warren Buffett scarica BYD dopo 17 anni,...
VodafoneThree UK sceglie Ericsson per po...
Ha costruito un 'aim assist' che d&agrav...
Metallo liquido o pasta termica? Nessuno...
DEEBOT T30C OMNI: il robot che aspira, l...
Scarica un gioco su Steam e perde 32mila...
OPPO offre uno dei migliori servizi clie...
The Mandalorian and Grogu: il trailer ch...
Da Schneider Electric nuovi design di ri...
Il nuovo iPhone pieghevole sarà c...
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: 23:45.


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