Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Problema cu fisier text in pascal  (Citit de 4344 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
ionzlatan
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« : Aprilie 30, 2012, 09:49:11 »

 Read This!

Salutare
Am si eu o ne-lamurire

Folosind formula Aranjamentelor matematice (mai exact A de 80 luate cate 20) am generat un fisier de  50 de GB
asta inseamna ca am optinut un numar de linii x (nu le-am numarat inca)
ceea ce  vreau  sa fa este urmatorul lucru

Stiind ca fiecare linie contine 20 de numere:
1 sa calculez suma fiecareia ...
2 in functie de  o limita inpusa de mine Suma-minima si Suma-maxima
   sa calculez in aceste linii,   
        cate numere conume am


Cod:

PROGRAM linear_search;
USES crt;
const
n=20;
kin=80;

TYPE index=1..100;

VAR cautat,i,j:integer;
    gasit:boolean;
    control,arr:ARRAY[1..100] OF index;
    f:text; ch:byte;

    BEGIN
    clrscr;
     writeln('LINEAR SEARCH');
     assign(f,'i:\1.txt'); reset(f);

     for j:=1 to kin do
     begin
     control[j]:=j;
     cautat:=control[j];

     end;

     while not eof(f) do
     begin
     FOR i:=1 TO n DO
     BEGIN
          read(f,ch);
          write(ch,' ');
          arr[i]:=ch;
             j:=0;
     END;
     writeln;

     begin
     repeat
     j:=j+1;
     cautat:=control[j];

         i:=1;
     gasit:=false;

     WHILE ((i<=n) AND (gasit=false)) DO
     BEGIN
          IF arr[i]=cautat THEN
          gasit:=true
          ELSE gasit:=false;
          i:=i+1;
     END;
     IF gasit=true THEN
     writeln('Element gasit',' ',cautat)
    { ELSE
     writeln('Elementul.. ',' ', cautat,'.. nu a fost gasit');}
     until control[j] = kin;
     writeln;
end;
end;
readkey;
END.




eu asa am incercat
Memorat
scipianus
Nu mai tace
*****

Karma: 129
Deconectat Deconectat

Mesaje: 345



Vezi Profilul
« Răspunde #1 : Aprilie 30, 2012, 09:54:40 »

Pai la prima cerinta cu suma fiecarei linii,doar citesti din fisier cate 20 de numere si le aduni,nu vad ce e complicat  Eh? Cerinta a doua n-am prea inteles-o,incearca sa te exprimi mai bine.

Tu chiar vrei sa zici ca ai generat intr-un fisier toate aranjamentele de 80 luate cate 20,care sunt in total 21*22*....*80 Shocked ?
Memorat
ionzlatan
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« Răspunde #2 : Aprilie 30, 2012, 09:55:28 »

poate ca este gresit ,  si sigur este
acel repeat nu face mare treaba
imi verifica doar in primul rand existenta unuia din numerele [1..80]
ideea ar fi sa verifice existenta  cui control[j] in fiecare din randurile fisierului
iar cand  ajunge la capat EOF(f) in cazul in care  control[j] a fost gasit sa imi afiseze valoarea lui J ca si numar comun
si sa inceapa citirea  fisierului F de la linia 1 (adika de la capat) si verificarea cu control[j+1)

Spuneti-mi va rog unde gresesc, si cum sa repar aceasta greseala

mentionez ca nu am studiat la scoala informatica sau programare  si imi cer scuze pt deranj

Va multumesc anticipat...
Memorat
ionzlatan
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« Răspunde #3 : Aprilie 30, 2012, 09:57:18 »

pentru suma  am rezolvat
 
problema imi ramane insa principiul cautarii
si determinarea numerelor comune fiecarei linii cuprinse in suma

cum ar trebui sa fac ?
Memorat
scipianus
Nu mai tace
*****

Karma: 129
Deconectat Deconectat

Mesaje: 345



Vezi Profilul
« Răspunde #4 : Aprilie 30, 2012, 10:00:50 »

Explica mai bine te rog ce vrei sa faci la cerinta 2. Ce am inteles eu e ca tu specifici o suma minima si o suma maxima si apoi vrei sa afli numerele comune din liniile care au suma cuprinsa intre cele 2 sume alese. Prin numere comune ce intelegi? Ca apar in cel putin 2 linii sau ca apar in toate liniile respective?

In plus iti repet : tu chiar ai generat aranjamente de 80 luate cate 20? Sunt foarte multe,ca sa ai memorie pentru program incearca si tu ceva mai mic de atat  Huh
Memorat
ionzlatan
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« Răspunde #5 : Aprilie 30, 2012, 10:07:29 »

cerinta numarul 2
 pre exemplu pt suma:= 744
imi trebuie sa stiu cate numere comune am
astainseamna  ca una din linii am
2 9 11 17 18 22 25 27 29 35 36 38 40 42 53 54 59 72 77 78
iar pe cealalta
2 9 11 19 20 21 23 80 31 50 35 39 36 46 61 41 70 44 69 37

ceea ce trebuie sa imi afiseze mie ca rezultat este

numere comune sunt
2 9 11 36

adika numere care se repeta si intr-o lini si in alta

Memorat
scipianus
Nu mai tace
*****

Karma: 129
Deconectat Deconectat

Mesaje: 345



Vezi Profilul
« Răspunde #6 : Aprilie 30, 2012, 10:20:53 »

Deci pentru fiecare suma cuprinsa intre suma minima si suma maxima,sa vezi care numere apar in toate liniile care au acea suma?

Daca asta e intelesul atunci faci asa:
-parcurgi liniile
-cand ajungi la o linie cu suma cuprinsa intre suma minima si suma maxima incrementezi nrlinii[sum] (numarul de linii care au suma sum), parcurgi linia si la fiecare numar x din ea incrementezi nr[ x ][sum] , unde nr[ x ][sum] reprezinta numarul de aparitii ale lui x in liniile cu suma sum;
-la final iei fiecare suma dintre suma minima si suma maxima si vezi care numere x cuprinse intre 1 si 80 au nr[ x ][sum]==nrlinii[sum]
-resetezi matricea nr si vectorul nrlinii pentru urmatoarea interogare
« Ultima modificare: Aprilie 30, 2012, 10:32:37 de către Olariu Ciprian » Memorat
ionzlatan
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« Răspunde #7 : Aprilie 30, 2012, 10:30:16 »

da
dar problema e ca nu stiu cum sa fac
 
Imi poti da o idee ?

cam ce ar trebui sa ii spun vectorului sa faca ?
Memorat
ionzlatan
Strain


Karma: -2
Deconectat Deconectat

Mesaje: 16



Vezi Profilul
« Răspunde #8 : Aprilie 30, 2012, 11:39:38 »

problema cu matricea este ca...
o declar asa

Cod:

program caut_cu_matrice;
uses crt;
const
n=20;
max=1600;
type
index = 1..1000000;
var

    a:array[1..max,1..20] of integer;
    m,i,j,k:byte;
    com:boolean;
    f:text; ch: byte;

begin
clrscr;
writeln;
writeln;   textcolor(white);
Writeln('Nr linii? ');read(m);
{Write('Nr Coloane? ');readln(n);}
assign(f,'i:\8.txt'); reset(f);
clrscr;
writeln;
writeln;
writeln(' Lucrez ...');
for i:=1 to m do for j:=1 to n do begin
 {write(i,', ',j,': ');
 readln(a[i,j]);}
 read(f,ch);
 a[i,j]:=ch;
end;

clrscr;
writeln;
writeln;
for i:=1 to m do begin
 writeln;
 for j:=1 to n do write(a[i,j],' ');


end;

writeln;
writeln;
write(' In toate liniile sunt: ');
for k:=1 to n do begin
 i:=2; j:=1;
 while(i<=m)and(j<=n)do begin
  j:=1;
  while(j<=n)and(a[i,j]<>a[1,k])do inc(j);
  inc(i);
 end;                 textcolor(red);
 if(i>m)and(j<=n)then
 Write(a[1,k],' ');  textcolor(white);
end;

{write(#$D#$A+'b) In toate coloanele sunt: ');}
for k:=1 to m do begin
 j:=2; i:=1;
 while(j<=n)and(i<=m)do begin
  i:=1;
  while(i<=m)and(a[i,j]<>a[k,1])do inc(i);
  inc(j);
 end;
 if(j>n)and(i<=m)then{ Write(a[k,1]:5);    }
end;





readkey
end.



problema e limita
nu poate citi mai mult decat constanta max=1600
daca maresc aceasta constanta nu mai merge  imi da

ERROR 22:  STRUCTURE TOO LARGE

asta inseamna ca  am depasit ce
puterea de calcul
declaratiil tipului Huh

scuze dar nu inteleg


de aia ma gandisem sa fac cumva sa verific fisierul linie cu linie cu unul sau mai multi vectori

problema ca e nu merge
nu stiu sa  asez  instructiunile

am incercat asa

Cod:

PROGRAM linear_search;
USES crt;
const
n=20;
kin=80;

TYPE index=1..100;

VAR cautat,i,j:integer;
    gasit:boolean;
    control,arr:ARRAY[1..100] OF index;
    f:text; ch:byte;

    BEGIN
    clrscr;
     writeln('LINEAR SEARCH');
     assign(f,'i:\1.txt'); reset(f);

     for j:=1 to kin do
     begin
     control[j]:=j;
     cautat:=control[j];

     end;

     while not eof(f) do
     begin
     FOR i:=1 TO n DO
     BEGIN
          read(f,ch);
          write(ch,' ');
          arr[i]:=ch;
             j:=0;
     END;
     writeln;

     begin
     repeat
     j:=j+1;
     cautat:=control[j];

         i:=1;
     gasit:=false;

     WHILE ((i<=n) AND (gasit=false)) DO
     BEGIN
          IF arr[i]=cautat THEN
          gasit:=true
          ELSE gasit:=false;
          i:=i+1;
     END;
     IF gasit=true THEN
     writeln('Element gasit',' ',cautat)
    { ELSE
     writeln('Elementul.. ',' ', cautat,'.. nu a fost gasit');}
     until control[j] = kin;
     writeln;
end;
end;
readkey;
END.




dar si aici ma  incurc
nu stiu unde sa pun repeatul, asta daca trebuie pus,

in cazul asta cu vectorul arr de tip index

ori imi cauta decat in prima linie roate numerele din vectorul control

ori se blocheaza



cum ar trebui sa fac ?


vreo idee?


mersi pentru sugestii  oricum !!!!


scuze pentru deranj !!
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines