PDA

View Full Version : [DELPHI] lettura file di testo


palermitanodoc
28-06-2008, 18:18
procedure inserimento;
var x,y,i,j,z:integer;s:string;
begin
rewrite(input);
write('Inserisci la lunghezza delle stringhe per il ',i,chr(248),' dataset (tra 1 e 50) -> ');
repeat
readln(y);
setlength(s,y);
if (y<=0)or(y>50) then
write('Hai inserito un numero non consentito. Inserisci un numero compreso tra 1 e 50 ->');
until(y>0)and(y<=50);
write('Inserisci il numero di stringhe per il ',i,chr(248),' dataset (tra 1 e 100) -> ');
repeat
readln(z);
if (z<=0)or(z>100) then
write('Hai inserito un numero non consentito. Inserisci un numero compreso tra 1 e 100 ->');
until(z>0)and(z<=100);
writeln(input,y,' ',z);
writeln('Inserisci stringhe del ',i,chr(248),' dataset(devono avere lunghezza ',y,').');
for j:=1 to z do begin
writeln('Inserisci ',j,chr(248),' stringa: ');
repeat
readln(s);
if length(s)<>y then
writeln('La stringa inserita non e'' valida.Deve essere di lunghezza ',y,'.');
until length(s)=y;
writeln(input,ansiuppercase(s));
end;
close(input);
end;

questa è la mia procedura di inserimento che mi dovrebbe creare un file input.txt di questo tipo

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

type elemento=record
stringa:string;
grado:integer;
end;
vettore=array of elemento;

ecco ora io ora vorrei creare questo file che mi inserisca in un vettore,da me definito come sopra. Il 10 indica la lunghezza della stringa,il 6 indica il numero di stringhe. Quindi questo vettore deve essere di lunghezza 6, e contenere in ogni posizione del vettore nel record stringa,ogni stringa letta da input. come posso fare?

palermitanodoc
28-06-2008, 18:19
ho pure provato a fare la procedura di lettura ma nn capisco dove sbaglio:muro:
procedure leggifile(var v:vettore);
var x,y,j:integer;s:string;
begin
reset(input);
j:=1;
while not eoln(input) do begin
read(input,x,y);
setlength(s,x);
setlength(v,y);
end;
while not eof(input) do begin
v[j].stringa:=s;
v[j].grado:=0;
j:=j+1;
end;
end;

qualche buona anima pia che mi aiuti?:D

Tommy81
28-06-2008, 21:11
A quanto mi pare di capire sei un biologo o comunque ti occupi di genetica. Può essere semplificato l'input, nel senso che nelle tue porzioni di codice prendi carattere su carattere da tastiera... questo può rendere più veloce il tuo input ma meno leggibile (quindi più soggetto a possibili errori). Quindi, non sarebbe meglio scrivere, per es., tutta la prima stringa e poi mandare l'invio per la successiva? In lettura invece ti serve qualcosa che scorra le posizioni dei tuoi dati uno per uno oppure che stampi semplicemente sullo schermo il tuo file di testo?
Di seguito ti riporto un esempio di codice super-semplificato (non l'ho compilato accuratamente ma mi pare funzionare):

Program Genetic;
Var
input: text;
stringa: string [80]
i,n:byte;
Begin
assign (input,'C:\input.txt');
rewrite (input);
writeln ('Quante stringhe vuoi immettere?');
readln (n);
writeln ('Lunghezza di una stringa?');
readln (m);
writeln (input,' ',n,' ',m);
for i:=1 to n do
Begin
writeln (' digita la stringa n.',i:2);
readln (stringa);
write (input,stringa);
writeln (input);
End;
close (input);
reset (input);
writeln ('Questo è il file input.txt:');
writeln;
while not eof(input) do
Begin
while not eoln(input) do
Begin
read (input,stringa);
readln (input);
writeln (stringa);
End;
End;
close (input);
readln;
End.


-il file di testo è salvato come input.txt in C:\
-nel tuo esempio n=6 (numero stringhe) e m=10 (lunghezza stringa, uguale per tutte).
-manca la funzione ansiuppercase per rendere tutto maiuscolo.
-il mio codice manca della separazione in procedure, ma ci vogliono 2 minuti per farla.


p.s. non ho capito bene cosa sia "grado" nel tuo programma.

palermitanodoc
07-07-2008, 08:52
mi dispiace deluderti ma non sono nè un biologo nè mi occupo di genetica :D dovrei essere un matematico =/ e il problema che ti ho postato riguarda un progetto che dovrei portare. L'esercizio mi chiede di ordinare un certo numero di stringhe(nel caso dell'esempio 6) dalla meno ordinata alla più ordinata,quindi avevo intenzione di creare un vettore di record

type elemento=record
stringa:string;
grado:integer;
end;
vettore=array of elemento;

questo vettore veniva settato di lunghezza 6,e ogni campo stringa veniva settato a lunghezza 10. Nel campo grado volevo mettere il grado di disordine della stringa appartenente per poi ordinarla...uhm spero di essermi spiegato:stordita:

ora,per scrivere il file input l'ho scritto; il problema è la lettura da file.Io le stringhe non le voglio scrivere a video,ma le voglio assegnare al campo "stringa"...proprio ora ho notato che scrivendole a video le stringhe me le scrive(e quindi non è un problema di lettura:confused: ),ma se le vado ad assegnare al campo del vettore (per es. v[j].stringa:=s) ,quando avvio il programma la finestra si chiude...quindi cosa sbaglio??:cry:

palermitanodoc
07-07-2008, 14:35
finalmente sono riuscito a risolvere il problema della lettura del file:D ma ora non capisco perchè non mi parte la procedura quicksort:cry:

premetto che il tipo dichiarato è il seguente:

type elemento=record
stringa:string;
grado:integer;
end;
vettore=array of elemento;

function partition(var v:vettore;var i,f:integer):integer;
var inf,sup:integer; x:integer;
procedure scambia(var x,y:elemento);
var aux:elemento;
begin
aux:=x;
x:=y;
y:=aux;
end;
begin
x:=v[i].grado;
inf:=i+1;
sup:=f;
while inf<=sup do begin
while v[inf].grado<x do
inf:=inf+1;
while v[sup].grado>x do
sup:=sup-1;
if inf<=sup then
scambia(v[inf],v[sup]);
end;
scambia(v[i],v[sup]);
partition:=sup;
end;

procedure quicksort(var v:vettore; i,f:integer);
var m:integer;
begin
if i<f then begin
m:=partition(v,i,f);
quicksort(v,i,m-1);
quicksort(v,m+1,f);
end;
end;

ho modificato la procedura quicksort per ordinare gli elementi dell'array in base al campo grado(un integer che rappresenta il grado di disordine della stringa)...qualcuno sarebbe così gentile da dirmi cosa c'è di sbagliato?sarà per il cervello fuso o per mia ignoranza,ma non riesco a capire perchè non parte:confused: grazie in anticipo