Oppure

Loading
15/02/10 13:28
Mariano90
fa niente grazie lo stesso :k: ...Spero che qualcun'altro del forum mi sappia aiutare....
aaa
15/02/10 21:32
Poggi Marco
Ciao!

Per risolvere l' esercizio, io userei dei record, da scrivere e leggere su file, in questo modo:

program RisultatiFineAnno;
uses crt;
 type tclasse=record  // record riguardante ogni classe.
   classe:byte;
   Iscritti, promossi, bocciati:word;
   PercPromossi,PercBocciati:real;
  end;

  var f: file of tclasse; // Nome logico del file
      v:tclasse; // record che userò per leggettura e scrittura su file
      percorso:string;
      i:integer;

procedure GeneraCasuale(var c:tclasse; n:integer);
begin
 with c do // accedo ai campi di c
 begin
  classe:=n;
  iscritti:=random(200);
  promossi:=1+random(iscritti);
  bocciati:=iscritti-promossi;
  PercPromossi:=100*(promossi/iscritti);
  PercBocciati:=100*(bocciati/iscritti);
 end;
end;

begin
 clrscr;
 GetDir(0, percorso); // ricerca della cartella in cui si trova il file.
 assign(f, percorso+'\classi.dat');  // apertura del file

 rewrite(f); { attenzione! Non faccio alcun controllo su
               un eventuale file "classi.dat" preesistente! }

 { inserzione dati }

 randomize;
 for i:=1 to 5 do
 begin
  GeneraCasuale(v, i); // per brevita genero casualmente i dati da inserire
  write(f, v); // scrittura su file del record
 end;

 { non faccio il confronto con i dati dell' anno precedente siccome non conosco
   la struttura esatta del file testuele}

  close(f); // chiusura del file, necessaria per salvare i dati

 { Eseguo una rilettura del file}

 reset(f); { riapertura del file. Attenzione!
            Per brevità do per scontato che il file "classi.dat" esista.}

 for i:=0 to 4 do { i file tipicizzati si possono considerare vettori
                    di record. Essi partono sempre da 0 e hanno una lunghezza
                    indefinita, perciò per leggere i record delle 5 classi,
                    partirò con un' indice a zero per arrivare fino a 4}
 begin
  seek(f, i); // pisizionamento sull' i_esimo record del file
  read(f, v); {lettura del record.
                comunque, l' istruzione read su file fa avanzare l' indice
                di lettura di un record sul file}
  with v do // accedo ai campi di v
  begin
   writeln('Classe ',classe,' iscritti: ',iscritti:4);
   writeln('Promossi: ',promossi:4,' bocciati: ',bocciati:4);
   writeln('Percentuali: promossi ',PercPromossi:6:2,'% bocciati ',PercBocciati:6:2,'%');
   writeln('----------------------------');
  end;
 end;
 writeln('####################');
  { infine "conto" quanti record sono presenti nel file.
    Istruzione utile per aggiungere eventuali record alla fine del file}
   writeln('Nel file sono presenti:',FileSize(f),' record.');
 readln;
 close(f);
end.
aaa
05/03/10 10:43
Mariano90
Scusatemi x la lunga assenza dal sito ma ho avuto problemi con la linea. Kmq il confronto bisogna farlo tra i dati dell'anno precedente(strutturato in un file di testo) e con i dati dell'anno in corso. Poi un'altra cosa che non mi è stata molto chiara la procedura che genera casualmente i dati. A scuola facciamo l'inserimento da tastiera solo che in realtà questo è uno dei primi programmi svolti seriamente quindi se x cortesia potreste postarmi anke questo. A prescindere dalle richieste di aiuto che vi sto proponendo, ringrazio tutti di cuore x la collaborazione ;-)
aaa
05/03/10 17:53
Poggi Marco
Ciao!
Nel programma non ho fatto il confronto perchè non conosco esattamente con' è strutturato il file di testo. Supponendo di avere un file testuale contenente solo numeri, per la lettura, si userà la funzione " read(file, Variabile ); " dove file è il nome logico del file, mentre in Variabile, verra salvato il valore letto sul file.

Ho cselto di generare casualmente i dati in modo da poter testare velocemente il programma. Per fare ciò ho utilizzato la funzione " random( limite ) ". Essa genera un numero casuale intero compreso tra 0 e limite-1. Prima di utilizzare questa funzione, però bisogna "inizializzarala" tramite la funzione "randomize", altrimenti verrà generata sempre una sequenza fissa di numeri.


aaa
11/03/10 18:50
Mariano90
Allora scusami, forse sono stato io poco chiaro. Ragionando...I file sono entrambi di tipo Txt e sono strutturati in questo modo x farti capire:

ANNO CLASSE ISCRITTI PROMOSSI BOCCIATI
2009-2010 1^E 20 10 10
2009-2010 3^B 25 22 3
2009-2010 4^F 16 14 2
2009-2010 5^C 12 12 0
2009-2010 2^G 15 10 5


Stessa cosa per l'altro file solo che cambia l'anno perchè è quello precedente(2008-2009). Una volta creati questi due file bisogna calcolare le percentuali dei bocciati e promossi e memorizzare i risultati in un file. Poi bisogna fare il confronto tra i due archivi(2008-2009 e 2009-2010) e stampare a video le differenze degli iscritti,dei promossi e dei bocciati rispetto all'anno in corso (2009-2010). Questo spiega anche che la procedura genera casuale non va bene,l'inserimento deve essere fatto dall'utente. La mia difficoltà ora sta nel tradurre quello che ho realizzato logicamente al linguaggio di programmazione Pascal. Spero di essere stato più chiaro rispetto a prima e comunque ti ringrazio per la tua collaborazione ;-)
Ultima modifica effettuata da Mariano90 11/03/10 18:52
aaa
11/03/10 20:06
Poggi Marco
Davvero un bel problema!
Essendo due file di testo,e pergiunta, con all' interno dei caratteri, l' estrazione dei dati è davvero complicata.

Non è possibile estrarre direttamente i valori, ma bisogna lavorere con le stringhe, sperando che la struttura dei file sia davvero regolare.
aaa
12/03/10 10:10
Mariano90
E se entrambi i file vengono creati con l'estensione .dat?? Non cambia nulla?
aaa
12/03/10 10:34
cassin.simone
L'estensione non c'entra nulla. Quel che interessa è il file all'interno. Io consiglierei per questo programma i file xml ma non ho mai provato ad implementarli in pascal quindi non ti so' dire nulla...
aaa