Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Help me...non riesco a risolvere questo problema in linguaggio di programmazione PASCAL =(
Forum - Pascal - Help me...non riesco a risolvere questo problema in linguaggio di programmazione PASCAL =( - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 18:01
Martedì, 16/03/2010
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);
  repeat inc(i) until S<>#32; //salta gli spazi
  iscritti := (char(S)-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  inc(i); repeat inc(i) until S<>#32; //salta gli spazi
  promossi := (char(S)-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  inc(i); repeat inc(i) until S<>#32; //salta gli spazi
  bocciati := (char(S)-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

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:14
Martedì, 16/03/2010
Testo quotato

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":

Codice sorgente - presumibilmente Delphi

  1. var
  2. T: text;
  3. S : string;
  4. ....
  5. Assign(F, <nomefile>);
  6.  
  7. saltare la prima stringa:
  8. reset(F);
  9. readln(F, S);
  10.  
  11. e usare questa procedure
  12. type
  13. classe = record
  14. nome : string[3];
  15. iscritti, promossi, bocciati : byte;
  16. end;
  17. classi = array of classe;
  18.  
  19. function leggi : classi;
  20. var I : word;
  21. begin
  22. setlength(leggi, 1);
  23. while not(eof(T) do begin
  24.  setlength(leggi, (high(leggi)+2)); //ingrandisce l'array
  25.  readln(F, S);
  26.  with leggi[high(leggi)] do begin  //considera l'ultima posizione in leggi
  27.   for I := 1 to 3 do nome := concat(nome,S[i]);
  28.   repeat inc(i) until S[i]<>#32; //salta gli spazi
  29.   iscritti := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  30.   inc(i); repeat inc(i) until S[i]<>#32; //salta gli spazi
  31.   promossi := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  32.   inc(i); repeat inc(i) until S[i]<>#32; //salta gli spazi
  33.   bocciati := (char(S[i])-48)*10 + (char(S[i+1])-48); //converte i due caratteri in numero
  34.  end;
  35. end;
  36. 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?

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 18:56
Venerdì, 19/03/2010
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

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:54
Venerdì, 19/03/2010
Perfetto Phi, Grazie per la delucidazione!

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo