PDA

View Full Version : [C] Dubbio su soluzione


D4rkAng3l
13-06-2005, 20:21
Ecco l'ennesimo esercizio del proff risolto prima dell'esame.


Esercizio 2 (max 10 punti)

Scrivere una funzione, con prototipo int Inv(char *nameF, char *invF), che legge il file di tipo testo il cui nome è nella
stringa nameF, contenente una sequenza di stringhe separate da spazi, e crea un nuovo file di testo, con nome dato dalla stringa invF,
scrivendoci la sequenza inversa e ritorna la massima lunghezza delle stringhe. Le stringhe hanno una lunghezza non superiore a 100.
Ad esempio se il file nameF contiene la sequenza giallo verde blu allora il nuovo file deve contenere
blu verde giallo e la funzione deve ritornare 6.
Soluzione Esercizio 2
/* Funzione ausiliaria che ritorna la k-esima stringa del file f. Se tale stringa
non esiste ritorna NULL */
const char *KthStr(FILE *f, int k)
{
static char str[101];
rewind(f);
while (k > 0 && fscanf(f, "%s", str) == 1) k--;
return (k == 0 ? str : NULL);
}
int Inv(char *nameF, char *invF)
{
FILE *f = fopen(nameF, "r"); //Apri il file in lettura
FILE *newF = fopen(invF, "w+"); //Crea ed apri il nuovo file
int nStr = 0, max = 0;
char str[101]; //Calcola il numero di stringhe
while (fscanf(f, "%s", str) == 1) nStr++;
while (nStr > 0) { //A partire dall'ultima stringa,
const char *s = KthStr(f, nStr); //leggi le stringhe in ordine inverso
int len = strlen(s); //e scrivile nel nuovo file,
if (len > max) max = len; //aggiornando il calcolo della
fprintf(newF, "%s ", s); //lunghezza massima.
nStr--;
}
fclose(f);
fclose(newF);
return max;
}


La funzione ausiliaria riceve il numero del k-esima stringa el la ritorna:
ma che vuol dire: while (k > 0 && fscanf(f, "%s", str) == 1) k--; perchè nel corpo del while viene anche inserito che fscanf deve essere == 1 ? Se io gli passo il numro della stringa da restituire e gli dico di ciclare finchè non ci arriva non è uguale?!?!

Altra cosa....

che significa questa riga (mi ci impiccio ancora con le scritture compresse):
return (k == 0 ? str : NULL);

Grazie e scusate la mia estrema ignoranza

NA01
13-06-2005, 20:36
la scanf restituisce il numero di argomenti letti. nonostante esista la costante EOF spesso è preferibile utilizzare un controllo come quello del tuo professore.

fino a che la fscanf restituisce 1 puoi stare certo che l'argomento è stato letto correttamente.


la return invece è un if fatto con i ? e i : . la sintassi è
condizione ? vero : falso;
al posto di vero va messa l'istruzione da eseguire se la condizione è vera, su falso l'istruzione per il falso.
è molto brutta da scrivere e è molto meno leggibile, ma in alcuni casi è più comodo.

a mio parere cmq perdi così tanto in leggibilità che non vale la pena di utilizzarlo.


ciao

D4rkAng3l
13-06-2005, 20:44
cioès e ho capito bene significa
se k == 0 è vero allora ritorna la stringa...se k == 0 è falso ritorna NULL?

ghiotto86
13-06-2005, 20:54
cioès e ho capito bene significa
se k == 0 è vero allora ritorna la stringa...se k == 0 è falso ritorna NULL?

già.

per le if semplici è molto bello secondo me come stile.

D4rkAng3l
13-06-2005, 21:04
ah omk grazie mille...mi hai chiarito un dubbio...cmq mi fà un po' schifo come notazione..credo che userò sempre le mie amate if

ghiotto86
13-06-2005, 21:05
ah omk grazie mille...mi hai chiarito un dubbio...cmq mi fà un po' schifo come notazione..credo che userò sempre le mie amate if

dice il mio prof che è lo stile americano; sono maniaci della compattezza :D

D4rkAng3l
13-06-2005, 21:07
dice il mio prof che è lo stile americano; sono maniaci della compattezza :D
oddio oggi mi vergogno un po' di essere italiano...ma mille volte meglio che essere americano...un motivo in più per non usarle :D

ghiotto86
13-06-2005, 21:09
oddio oggi mi vergogno un po' di essere italiano...ma mille volte meglio che essere americano...un motivo in più per non usarle :D
è già W L'ITALIA :sofico:

mjordan
14-06-2005, 04:12
Non e' proprio una questione di compattezza ma anche di stile.
Quella notazione non va usata solo dagli americani, ma ogni volta che si deve usare un'istruzione return() dentro a degli if()

Scrivere:

return (k == 0 ? str : NULL);


e 100 volte meglio che scrivere:

if (k == 0)
return str;
else
return NULL;


Non e' una sintassi americanoide, e' una sintassi che ben si addice dentro ai return() quando la return() appare in entrambi i rami di una if().

Fenomeno85
14-06-2005, 19:04
Non e' proprio una questione di compattezza ma anche di stile.
Quella notazione non va usata solo dagli americani, ma ogni volta che si deve usare un'istruzione return() dentro a degli if()

Scrivere:

return (k == 0 ? str : NULL);


e 100 volte meglio che scrivere:

if (k == 0)
return str;
else
return NULL;


Non e' una sintassi americanoide, e' una sintassi che ben si addice dentro ai return() quando la return() appare in entrambi i rami di una if().

daccordo per metà c'è gente che non conosce quel tipo di sintassi e cmq alla fine non cambia nulla anzi forse è più leggibile la seconda come soluzione :)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-06-2005, 19:07
dice il mio prof che è lo stile americano; sono maniaci della compattezza :D

si perchè non hai mai visto quando si cerca di fare il tutto compresso :asd: è la sfida tra te e il numero di caratteri che scrivi.
Il codice non è che migliora alla fine ti basi su ottimizzazione di codice dei vari compilatori :)
Il miglior programma è quello che anche se lo riprendi 10 mesi dopo ha una sintassi leggibile il + velocemente possibile e chiara ;)

~§~ Sempre E Solo Lei ~§~

mjordan
14-06-2005, 19:50
daccordo per metà c'è gente che non conosce quel tipo di sintassi e cmq alla fine non cambia nulla anzi forse è più leggibile la seconda come soluzione :)

~§~ Sempre E Solo Lei ~§~

Non e' colpa mia se quella gente vuole programmare in C senza studiare il C :sofico: Comunque in ogni caso quando nei due rami if() ci sono chiamate di funzioni che ritornano, quella notazione tecnicamente "dovrebbe" essere piu' efficiente. Poi una volta fattaci l'abitudine, IMHO, e' molto chiara.

Fenomeno85
14-06-2005, 21:42
Non e' colpa mia se quella gente vuole programmare in C senza studiare il C :sofico: Comunque in ogni caso quando nei due rami if() ci sono chiamate di funzioni che ritornano, quella notazione tecnicamente "dovrebbe" essere piu' efficiente. Poi una volta fattaci l'abitudine, IMHO, e' molto chiara.

si non la discuto ma non tutti sanno "decifrare a primo colpo" è come l'utilizzo dello switch dove sembra un qualcosa di mistico da non usare :D

~§~ Sempre E Solo Lei ~§~

ghiotto86
14-06-2005, 22:01
si perchè non hai mai visto quando si cerca di fare il tutto compresso :asd: è la sfida tra te e il numero di caratteri che scrivi.
Il codice non è che migliora alla fine ti basi su ottimizzazione di codice dei vari compilatori :)
Il miglior programma è quello che anche se lo riprendi 10 mesi dopo ha una sintassi leggibile il + velocemente possibile e chiara ;)

~§~ Sempre E Solo Lei ~§~

e già è un grande vantaggio; sennò va a finire che ti ritrovi a leggere na pagina criptata :D