Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
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: 2773
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: 2773
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: 2773
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: 2773
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: 2773
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: 12814
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


HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
X sotto accusa in Francia: 'Ci trattano ...
CMF Watch 3 Pro: lo smartwatch con AI ch...
ASUS: la potenza dei supercomputer NVIDI...
Aspirazione estrema per un low cost e ma...
'L'AI ha distrutto tutto': il caso Repli...
Le prossime serie TV che vedrete potrebb...
Meno auto cinesi in Europa? La flotta di...
Google Pixel 10: coloratissimi e con nov...
'Irrealistico e dannoso', l'UE vorrebbe ...
realme GT 7T scende di altri 50€: 7000mA...
Fastned apre una stazione di ricarica an...
Ted Lasso 4: le riprese sono ufficialmen...
Subaru porta la sua terza elettrica in E...
Milano blinda ZTL Quadrilatero della mod...
Super offerta smartwatch: Amazfit GTR 3 ...
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: 11:42.


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