Oppure

Loading
12/03/10 17:56
Poggi Marco
cassin.simone ha ragione, tra l' altro l' estensione non è richiesta nei fita di testo e in quelli binari.
L' ideale in questo caso è utilizzare i file tipicizzati come ho fatto nel precedente esempio.
aaa
16/03/10 17:01
Phi
Scusami se ti do un algoritmo sbagliato ma ho letto frettolosamente il papiro che avete già scritto.

Per ricavare da un file:
CLASSE ISCRITTI PROMOSSI BOCCIATI
1^E 20 10 10
3^B 25 22 3
4^F 16 14 2
5^C 12 12 0
2^G 15 10 5

si può assegnarlo ad un "text":
var
T: text;
S : string;
....
Assign(F, <nomefile>;);

saltare la prima stringa:
reset(F);
readln(F, S);

e usare questa procedure
type
classe = record
nome : string[3];
iscritti, promossi, bocciati : byte;
end;
classi = array of classe;

function leggi : classi;
var I : word;
begin
setlength(leggi, 1);
while not(eof(T) do begin
setlength(leggi, (high(leggi)+2)); //ingrandisce l'array
readln(F, S);
with leggi[high(leggi)] do begin //considera l'ultima posizione in leggi
for I := 1 to 3 do nome := concat(nome,S[i]);
repeat inc(i) until S[i]<>#32; //salta gli spazi
iscritti := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
inc(i); repeat inc(i) until S[i]<>#32; //salta gli spazi
promossi := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
inc(i); repeat inc(i) until S[i]<>#32; //salta gli spazi
bocciati := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
end;
end;
end;

Se non avesse la struttura di sopra non funzionerebbe
aaa
16/03/10 18:14
Poggi Marco
Postato originariamente da Phi:


Scusami se ti do un algoritmo sbagliato ma ho letto frettolosamente il papiro che avete già scritto.

Per ricavare da un file:
CLASSE ISCRITTI PROMOSSI BOCCIATI
1^E 20 10 10
3^B 25 22 3
4^F 16 14 2
5^C 12 12 0
2^G 15 10 5

si può assegnarlo ad un "text":

var
T: text;
S : string;
....
Assign(F, <nomefile>);

saltare la prima stringa:
reset(F);
readln(F, S);

e usare questa procedure
type
classe = record
nome : string[3];
iscritti, promossi, bocciati : byte;
end;
classi = array of classe;

function leggi : classi;
var I : word;
begin
setlength(leggi, 1);
while not(eof(T) do begin
 setlength(leggi, (high(leggi)+2)); //ingrandisce l'array
 readln(F, S);
 with leggi[high(leggi)] do begin  //considera l'ultima posizione in leggi
  for I := 1 to 3 do nome := concat(nome,S[i]);
  repeat inc(i) until S[i]<>#32; //salta gli spazi
  iscritti := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  inc(i); repeat inc(i) until S[i]<>#32; //salta gli spazi
  promossi := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  inc(i); repeat inc(i) until S[i]<>#32; //salta gli spazi
  bocciati := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
 end;
end;
end;

Se non avesse la struttura di sopra non funzionerebbe


Ho letto il tuo programma, davvero ben fatto!
Soprattutto l' allocazione dinamica della memoria.

Però ho alcuni dubbi: Come mai ad ogni ciclo di lettura su file, aumenti di 2 caselle
l' array?

Come gestisci le prime due righe del file?

In caso i dati non fossero tutti a 2 cifre, ci sarebbe un' errore di lettura.

Hai usato il free pascal?
aaa
19/03/10 17:56
Phi
Esatto ho usato FreePascal e con dati di 3 cifre(x esempio) ci sarebbe un errore.
Comunque aumenta di 2 perchè high(<array dinamico>;) da il valore più alto dell'array es a : array[0..15] high(a)=15; ma setlenght(<array>,numero) imposta la lunghezza(il numero totale), nell'esempio sarebbe stato 16(a[0] la prima, a[1] la seconda ... a[15] la sedicesima).
setlength(array,high(array)+1);
mantiene sempre le stesse dimensioni dell'array.
setlength(array,high(array));
diminuisce di uno le dimensioni.

Scusa ma faccio fatica a spiegarlo
aaa
19/03/10 20:54
Poggi Marco
Perfetto Phi, Grazie per la delucidazione!
aaa