Newsgroup: it.comp.lang.pascal
Titolo: Creazione file

Slave a tutti,
personalmente studio da poco il Pascal, e vorrei sapere se e come è
possibile dal Pascal stesso creare un nuovo file e quinidi metterci dentro
dei normali caratteri ASCII. Inoltre, vorrei sapere se qualcuno ha mai
provato a fare un prog. che calcola il fattorale di un numero (es. fattorale
3 = 1*2*3 ecc...).
Grazie in anticipo a coloro che risponderanno.
Ritz
P.S.: avete qualche buon sito dedicato al Pascal in Italiano da
consigliarmi?

Per creare un semplice file di testo devi dichiarare una variabile di tipo
text (var T:text); all'interno del blocco istruzioni devi assegnare alla
variabile un percorso in cui trovare il file col comando assign (Stai
attento alla sintassi!!!):
assign(T,'C:\Percorso_DOS\Nome_File.txt');  L'estensione può essere una
qualsiasi. NB assign non fa parte del pascal std ma del TurboPascal, per cui
se usi una piattaforma diversa da DOS/WIN cerca sulla guida il comando
equivalente.
Prima di poter fare operazioni di I/O sul file devi specificare se deve
essere aperto in scrittura o in lettura.
Per aprirlo in lettura:
reset(T);   NB Il file deve essere già presente nella posizione specificata
da assign
Per aprirlo in scrittura:
rewrite(T);  NB A ogni chiamata di rewrite il contenuto del file andrà perso
e verrà creato un nuovo file. Per questo il file puntato da assign può anche
non esistere, verrà creato alla prima chiamata di rewrite, purchè prima non
vi siano chiamate a reset.
Infine, per leggervi e scrivervi si utilizzano le funzioni std read e write
con questa sintassi però:
read(T, variabili);
write(T,variabili,'stringhe');
Ovvero prima degli argomenti normali va specificato che questi vanno
letti/scritti sul file T, per il resto funzionano come sull'I/O standard;
ovviamente se un file è aperto in scrittura non puoi effettuare la read
prima di chiamare reset e viceversa. Questo è tutto per i file.
Per quanto riguarda il fattoriale ti scrivo il codice di una funzione
iterativa che restituisce il fattoriale di un numero n passato come
parametro in input. Tieni presente che la crescita del fattoriale è rapida
per cui già per un n=8 devi fare i conti con l'overflow. Questa funzione non
tratta il problema, credo esistano funzioni del TP per trattare numeri
maggiori di Maxint; oppure, meglio ancora, puoi dichiarare, come faccio io,
tue strutture dati per risolvere la cosa (che è un buon esercizio di
programmazione!). Comunque, in linea teorica, la funzione è applicabile a
ogni n.
function Fact(n:integer):integer;
var r:integer;
begin
   if (n=0) or (n=1)
       then r:=1
       else begin
                    r:=n;
                    while (n>=2) do
                        begin
                             r:=r * (n - 1);
                             n:=(n - 1)
                        end
               end;
   Fact:=r;
end;
Se ti interessa posso darti anche una versione ricorsiva della stessa
funzione, ma non è per nulla efficiente rispetto a quella iterativa.
Ciao
--
  ()        ()()()()()()  ICQ# 53299360
  ()          ()
  ()        ()()()()  
l...@freemail.it
  ()        ()()
  ()()()()()()()
  ~~~KEEP SURFING~~~

Dimenticavo di dirti che dopo l'apertura e l'eventuale modifica del file
devi chiuderlo con la direttiva Close(F), questo assicura che i dati
verranno salvati. Comunque ho notato che funziona tutto anche senza la
chiusura del file. Però non ti fidare si è trattato quasi sicuramente di
eccezioni, su delphi ad esempio senza la chiusura non viene salvato mai, o
quasi mai, niente.
Ciao
--
  ()        ()()()()()()  ICQ#  53299360
  ()          ()
  ()        ()()()()  
l...@freemail.it
  ()        ()()
  ()()()()()()()
    PEACE FOR HARMONY
  HARMONY FOR SURFING
    ~~~KEEP SURFING~~~

Grazie 1000 delle spiegazioni per quanto riguarda la creazione di un file,
cmq ho una domanda sul fattoriale: potresti darmi anche la versione
ricorsiva per favore?
Grazie e ciao.

 wrote in message
8023fm$7gg$1...@geronimo.keycomm.it...


 ricorsiva per favore?
Eccoti accontentato...
function Fact(n:integer):integer;
begin
    if (n=0) or (n=1)
        then Fact:=1
        else Fact:=n * Fact(n-1)
end;
Come vedi questa funzione è formalmente molto più elegante di quella
iterativa. Anche la complessità computazionale è la stessa, però
l'efficienza si riduce notevolmente in quanto vi è un utilizzo di memoria
molto superiore!


eccezioni, su delphi ad esempio senza la chiusura non viene salvato mai, o
Sui sistemi operativi seri, solitamente, al tempo di chiusura di un
programma corrisponde lo svuotamento dei buffer di scrittura aperti e
la chiusura dei file aperti.
Ovviamente Delphi non gira su un S.O. serio ;)
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 wrote in message 803vc6$dpq$1...@nslave2.tin.it...
| Dimenticavo di dirti che dopo l'apertura e l'eventuale modifica del
file
| devi chiuderlo con la direttiva Close(F), questo assicura che i dati
| verranno salvati. Comunque ho notato che funziona tutto anche senza
la
| chiusura del file. Però non ti fidare si è trattato quasi
sicuramente di
| eccezioni, su delphi ad esempio senza la chiusura non viene salvato
mai, o
| quasi mai, niente.
fai bene a non fidarti e a mettere sempre close();
che io sappia il TurboPascal chiude il file aperto con un assign alla
chiusura
del programma, per cui non hai problemi di perdere dati in files
aperti in
lettura; ma se apri un file in scrittura, se non lo chiudi con close
perdi i
dati che ci hai scritto...
e poi cosa costa un close...
PROGRAM files;
VAR T:text;
BEGIN
    assign(T,'prova.txt');
    rewrite(T);
    write('qualcosa');
    close(T);     // devi mettere la chiusura del file se no ottieni
il file
creato con assign, ma vuoto, poiché viene chiuso alla fine del
programma
automaticamente, ma non viene salvato ciò che ci hai scritto...
provare per
credere
END.
--
Ciao, ciao
E-mail: 
pi....@bigfoot.com
        (se 'rispondi al mittente', togli NO_SPAM)
HomePage: 
http://web.tiscalinet.it/pavelo
ICQ #37941259
"Non si rese conto di aver preso la decisione
finché il chiarore dell'alba invase tutto il cielo:
il veicolo temporale e la sua ombra erano scomparsi.
Quella sparizione segnava per sempre la
fine dell'Eternità. E il principio dell'Infinito."

provare per credere
Il tuo prg non va bene, sostituisci :
    write('qualcosa');
con 
    write(T, 'qualcosa') ;
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

| Il tuo prg non va bene, sostituisci :
|     write('qualcosa');
| con
|     write(T, 'qualcosa') ;
whops, sě, certo, un errore di scrittura... cosě scrive sul canale di
output predefinito... lo schermo...
