Program w Turbo Pascalu nie zapisuje zmienionej nazwy pliku.

0

Witam, od jakiegoś czasu chcę stworzyć program do generowania liczb losowych lotto w Turbo Pascalu, w taki sposób, żeby losował mi 6 liczb z 49, szeregował je od najmniejszej do największej i zapisywał do pliku w takim formacie nazwy np. : 2014-4-30_13;20;54. Najpierw udało mi się stworzyć program, który nie sortuje w kolejności od najmniejszej do największej, ale zapisuje do pliku pod odpowiednią nazwą:

program zadanie4;
uses dos,crt;

var a,i,j,p:byte;
    z:char;
    tab:array[1..6] of byte; 
    spr:boolean;
    plik2:text;
    opis: String;
     KoniecPetli: boolean;

procedure losujzapisz; {poczatek  procedury losujzapisz} 
  
begin
 clrscr;
 randomize;
 Begin
  assign(plik2, 'd:\lot.txt');
  rewrite(plik2);
spr:=false;

for p:=1 to 1 do
begin
 for i:=1 to 6 do
   begin
     repeat
       spr:=false;
       a:=random(49)+1;

         for j:=1 to i do
         begin
          if a=tab[j] then spr:=true;
         end;
      until spr<>true;
     tab[i]:=a;
       write(plik2, tab[i],' ');
       
writeln(tab[i],' ');
end;
end;

writeln(plik2);
 write('Liczby zapisane do pliku txt: ');

 for i:=1 to 6 do
write(tab[i],' '); 
 close(plik2); 
   readln;
  
End;


 end; {koniec procedury losujzapisz}


procedure dopisz; {porczatek procedury dopisz}

var a,i,j: byte;

 Begin
  assign(plik2, 'd:\lot.txt');
  append(plik2);
randomize;
spr:=false;


begin
 for i:=1 to 6 do
   begin
     repeat
       spr:=false;
       a:=random(49)+1;

         for j:=1 to i do
         begin
          if a=tab[j] then spr:=true;
         end;
      until spr<>true;
     tab[i]:=a;
       write(plik2, tab[i],' ');
writeln(tab[i],' ');
end;
end;

writeln(plik2);
 write('Liczby zapisane do pliku txt: ');

 for i:=1 to 6 do
write(tab[i],' '); 
 close(plik2); 

end;{koniec procedury dopisz}

procedure wybierz; {poczatek procedury wybierz}
begin
z:= Readkey;
if z=#27 then 
 exit;
Writeln('Wtamy w programie Lotto.');
Write('Wcisnij enter aby wylosowac i dopisac lub escape aby zakonczyc.');

begin
readln(z);

repeat
z:=ReadKey;
if z=#27 then 
 exit;

read;

dopisz;
until z = #27;  


end;
end; {koniec procedury wybierz}

procedure zapisdaty;
const
dni:array[0..6] of string=('Niedz','Pon','Wto','Sro','Czw','Pia','Sob');

var plik: text;
var godz, min, sek, sek100, rr, mm, dd, dztyg: word;
var g2,m2,s2, rr2, mm2, dd2: String;

begin
clrscr;

getdate(rr, mm, dd, dztyg);

Str(rr,rr2);
writeln(rr2);
Str(mm,mm2);
writeln(mm2);
Str(dd,dd2);
writeln(dd2);

gettime(godz, min, sek, sek100);

Str(godz,g2);
writeln(g2);
Str(min,m2);
writeln(m2);
Str(sek,s2);
writeln(s2);

rename(plik2, 'D:\' +rr2+'-'+mm2+'-'+dd2+'_'+g2+';' +m2+';' +s2+ '.txt' );


end;  
{kod glowny}
begin

repeat
z:= Readkey;
if z=#27 then 
 exit;

losujzapisz;


wybierz;
until   z = #27;
zapisdaty;
clrscr;


end.
 

po jakimś czasie stworzyłem program który zapisuje w kolejności rosnącej liczby do tablicy:

program sortowanie;
uses dos, crt;
const
  n = 6;

type
  tablica = array[1..n] of byte;

 var plik: text;

procedure sortowanie_babelkowe(var tab : tablica);
var
   i, j, tmp: byte;

begin
  for i:=1 to n-1 do
    for j := i+1 to n do
      if tab[i] > tab[j] then
      begin
        tmp := tab[i];
        tab[i] := tab[j];
        tab[j] := tmp;
      end;
     
end;




procedure wyswietl(tab : tablica);
var
   i : byte;
   plik: text;
   begin
 assign (plik, 'D:\lotor.txt');
 append(plik);
begin

  for i := 1 to n do
        write(plik, tab[i],' ');
  writeln;

 
end;
  writeln(plik);
 write('Liczby zapisane do pliku txt: ');
 for i:=1 to n do
write(tab[i],','); 
 close(plik);
end;

procedure uzupelnij(var tab : tablica);
var
   a,i,j,p : integer;
   spr: boolean;
begin
randomize;
      spr:=false;

for p:=1 to 1 do
begin
 for i:=1 to n do
   begin
     repeat
       spr:=false;
       a:=random(49)+1;

         for j:=1 to i do
         begin
          if a=tab[j] then spr:=true;
         end;
      until spr<>true;
     tab[i]:=a;
       write( tab[i],' ');
     
end;

{procedure zapisz;
 Begin
  assign(plik2, 'd:\lotos.txt');
  rewrite(plik2);
spr:=false;

for p:=1 to 1 do
begin
 for i:=1 to n do
   begin
     repeat
       spr:=false;
       a:=random(49)+1;

         for j:=1 to i do
         begin
          if a=tab[j] then spr:=true;
         end;
      until spr<>true;
     tab[i]:=a;
       write(plik2, tab[i],' ');  }
       end;
       end;

procedure nowy;
var plik: text;
 Begin
  assign(plik, 'D:\lotor.txt');
  rewrite(plik);
  close(plik);
  end;
  
procedure zapisdaty;
const
dni:array[0..6] of string=('Niedz','Pon','Wto','Sro','Czw','Pia','Sob');

var plik: text;
var godz, min, sek, sek100, rr, mm, dd, dztyg: word;
var g2,m2,s2, rr2, mm2, dd2: String;

begin
clrscr;

getdate(rr, mm, dd, dztyg);

Str(rr,rr2);
writeln(rr2);
Str(mm,mm2);
writeln(mm2);
Str(dd,dd2);
writeln(dd2);

gettime(godz, min, sek, sek100);

Str(godz,g2);
writeln(g2);
Str(min,m2);
writeln(m2);
Str(sek,s2);
writeln(s2);

rename(plik, 'D:\' +rr2+'-'+mm2+'-'+dd2+'_'+g2+';' +m2+';' +s2+ '.txt' );
end;
       
var
   tab : tablica;
   z: char;
   
begin
nowy;

repeat
z:= Readkey;
if z=#27 then 
exit;
   uzupelnij(tab);
   {wyswietl(tab);}
   sortowanie_babelkowe(tab);
   wyswietl(tab);
   readln;
   until   z = #27;
   zapisdaty;
end.
 

ale nie działa z kolei zapis pliku pod nazwą w formacie daty i czasu utworzenia pliku, tak jakbym chciał...ma ktoś pomysł jak to dobrze zaimplementować do kodu? Z góry dzięki za pomoc. Pozdrawiam. :)

1

Skompiluj to pod FPC. A nie używasz archaicznego softu dla DOS'a, który nie obsługuje długich nazw plików. Bo być może w tym jest problem. Poza tym użyj jakiegoś formattera. Ponieważ kod nie jest do końca czytelny. W jednych miejscach są wcięcia, później nie ma.

0

kompilowałem oba kody i uruchamiałem w FPC, i za każdym razem tak samo - nie ma różnicy

0

To jeszcze popraw formatowanie kodu, a wtedy pewnie ktoś spojrzy. Ja niestety teraz nie mam jak, bo nie piszę z PC.

2

Kod jest długi i mało czytelny, więc go sformatuj jak należy - będzie się go łatwiej analizowało; Nazwa pliku jest poprawna - myślałem, że używasz znaku dwukropka, ale to jednak jest średnik;

Z tego co zauważyłem w tym kodzie - 4x wywołujesz procedurę Randomie, a powinieneś tylko raz; Wilokrotne jej wywoływanie nie daje żadnych korzyści, ewentualnie może źle wpłynąć na losowanie;

Do obsługi daty i czasu są odpowiednie funkcje - Now aby pobrać czas, FormatDateTime aby przekonwertować datę i czas na łańcuch w odpowiednim formacie, a także odpowiedni typ - TDateTime; Jest też mnóstwo funkcji do operowania na tym typie danych, więc z nich powinieneś korzystać, aby napisać sprawny i przejrzysty kod;

Korzystasz z ze zmiennych globalnych, co powtarzam po raz setny - jest złą praktyką; Widoczność zmiennych powinna być minimalna, aby panował porządek i ograniczyć dostęp do danych, do których dostęp jest zbędny lub zakazany - unikniesz pomyłek;

To tyle na wstępie - aby rozgryźć problem i go rozwiązać, powinieneś skorzystać z debugera i popodglądać sobie zmienne oraz prześledzić działanie programu; Na pewno znajdziesz przyczynę.

0

proszę o jeszcze jedno szybkie spojrzenie, bo się pomyliłem i wstawiłem 2 takie same kody, teraz jest ten co nie działa zmiana nazwy pliku(ten 2gi), jak mam sformatować? po prostu poukładać kod, aby był przejrzysty tak? i zastanawiam się jak? bo wpierw robię losowanie jak tworzę plik, a potem kolejne losowanie w kolejnej procedurze, jako dopisanie nowej linijki w tym pliku

0
assign(plik2, 'd:\lot.txt');

Jest bardzo prawdopodobne, że w katalogu głównym nie masz praw do zapisu.

0
Azarien napisał(a):
assign(plik2, 'd:\lot.txt');

Jest bardzo prawdopodobne, że w katalogu głównym nie masz praw do zapisu.

to jest z 1wszego kodu lot.txt, tutaj działała zmiana nazwy pliku na format daty i czasu, nie działa w 2gim kodzie;
oto 1wszy kod po potraktowaniu JEDI CODE FORMAT

program zadanie4;
uses dos,crt;

var a,i,j,p:byte;
z:char;
tab:array[1..6] of byte; 
spr:boolean;
plik2:text;
opis: String;
KoniecPetli: boolean;

procedure losujzapisz; {poczatek  procedury losujzapisz} 
  
begin
clrscr;
randomize;
Begin
assign(plik2, 'd:\lot.txt');
rewrite(plik2);
spr:=false;

for p:=1 to 1 do
begin
for i:=1 to 6 do
begin
repeat
spr:=false;
a:=random(49)+1;

for j:=1 to i do
begin
if a=tab[j] then
begin spr:=true end;
end;
until spr<>true;
tab[i]:=a;
write(plik2, tab[i],' ');
       
writeln(tab[i],' ');
end;
end;

writeln(plik2);
write('Liczby zapisane do pliku txt: ');

for i:=1 to 6 do
begin write(tab[i],' ') end; 
close(plik2); 
readln;
  
End;


end; {koniec procedury losujzapisz}


procedure dopisz; {porczatek procedury dopisz}

var a,i,j: byte;

Begin
assign(plik2, 'd:\lot.txt');
append(plik2);
randomize;
spr:=false;


begin
for i:=1 to 6 do
begin
repeat
spr:=false;
a:=random(49)+1;

for j:=1 to i do
begin
if a=tab[j] then
begin spr:=true end;
end;
until spr<>true;
tab[i]:=a;
write(plik2, tab[i],' ');
writeln(tab[i],' ');
end;
end;

writeln(plik2);
write('Liczby zapisane do pliku txt: ');

for i:=1 to 6 do
begin write(tab[i],' ') end; 
close(plik2); 

end;{koniec procedury dopisz}

procedure wybierz; {poczatek procedury wybierz}
begin
z:= Readkey;
if z=#27 then 
begin exit end;
Writeln('Wtamy w programie Lotto.');
Write('Wcisnij enter aby wylosowac i dopisac lub escape aby zakonczyc.');

begin
readln(z);

repeat
z:=ReadKey;
if z=#27 then 
begin exit end;

read;

dopisz;
until z = #27;  


end;
end; {koniec procedury wybierz}

procedure zapisdaty;
const
dni:array[0..6] of string=('Niedz','Pon','Wto','Sro','Czw','Pia','Sob');

var plik: text;
var godz, min, sek, sek100, rr, mm, dd, dztyg: word;
var g2,m2,s2, rr2, mm2, dd2: String;

begin
clrscr;

getdate(rr, mm, dd, dztyg);

Str(rr,rr2);
writeln(rr2);
Str(mm,mm2);
writeln(mm2);
Str(dd,dd2);
writeln(dd2);

gettime(godz, min, sek, sek100);

Str(godz,g2);
writeln(g2);
Str(min,m2);
writeln(m2);
Str(sek,s2);
writeln(s2);

rename(plik2, 'D:\' +rr2+'-'+mm2+'-'+dd2+'_'+g2+';' +m2+';' +s2+ '.txt' );


end;  
{kod glowny}
begin

repeat
z:= Readkey;
if z=#27 then 
begin exit end;

losujzapisz;


wybierz;
until   z = #27;
zapisdaty;
clrscr;


end.

i 2gi kod:

program sortowanie;
uses dos, crt;
const
n = 6;

type
tablica = array[1..n] of byte;

var plik: text;

procedure sortowanie_babelkowe(var tab : tablica);
var
i, j, tmp: byte;

begin
for i:=1 to n-1 do
begin for j := i+1 to n do
begin if tab[i] > tab[j] then
begin
tmp := tab[i];
tab[i] := tab[j];
tab[j] := tmp;
end end end;
     
end;




procedure wyswietl(tab : tablica);
var
i : byte;
plik: text;
begin
assign (plik, 'D:\lotor.txt');
append(plik);
begin

for i := 1 to n do
begin write(plik, tab[i],' ') end;
writeln;

 
end;
writeln(plik);
write('Liczby zapisane do pliku txt: ');
for i:=1 to n do
begin write(tab[i],',') end; 
close(plik);
end;

procedure uzupelnij(var tab : tablica);
var
a,i,j,p : integer;
spr: boolean;
begin
randomize;
spr:=false;

for p:=1 to 1 do
begin
for i:=1 to n do
begin
repeat
spr:=false;
a:=random(49)+1;

for j:=1 to i do
begin
if a=tab[j] then
begin spr:=true end;
end;
until spr<>true;
tab[i]:=a;
write( tab[i],' ');
     
end;

{procedure zapisz;
 Begin
  assign(plik2, 'd:\lotos.txt');
  rewrite(plik2);
spr:=false;

for p:=1 to 1 do
begin
 for i:=1 to n do
   begin
     repeat
       spr:=false;
       a:=random(49)+1;

         for j:=1 to i do
         begin
          if a=tab[j] then spr:=true;
         end;
      until spr<>true;
     tab[i]:=a;
       write(plik2, tab[i],' ');  }
end;
end;

procedure nowy;
var plik: text;
Begin
assign(plik, 'D:\lotor.txt');
rewrite(plik);
close(plik);
end;
  
procedure zapisdaty;
const
dni:array[0..6] of string=('Niedz','Pon','Wto','Sro','Czw','Pia','Sob');

var plik: text;
var godz, min, sek, sek100, rr, mm, dd, dztyg: word;
var g2,m2,s2, rr2, mm2, dd2: String;

begin
clrscr;

getdate(rr, mm, dd, dztyg);

Str(rr,rr2);
writeln(rr2);
Str(mm,mm2);
writeln(mm2);
Str(dd,dd2);
writeln(dd2);

gettime(godz, min, sek, sek100);

Str(godz,g2);
writeln(g2);
Str(min,m2);
writeln(m2);
Str(sek,s2);
writeln(s2);

rename(plik, 'D:\' +rr2+'-'+mm2+'-'+dd2+'_'+g2+';' +m2+';' +s2+ '.txt' );
end;
       
var
tab : tablica;
z: char;
   
begin
nowy;

repeat
z:= Readkey;
if z=#27 then 
begin exit end;
uzupelnij(tab);
   {wyswietl(tab);}
sortowanie_babelkowe(tab);
wyswietl(tab);
readln;
until   z = #27;
zapisdaty;
end.
0

Teraz sobie przypomniałem. Gotowy do używania Jedi Code Formatter mam u siebie pod adresem http://olesio.eu/jcf Jest on zdaje się poprawiony, w taki sposób jaki opisałem na swoim blogu. W artykule o używaniu IDR. Skorzystaj więc z tej wersji.

0

wielkie dzięki, teraz widać różnicę :)
1wszy kod:

program zadanie4;
uses
  dos,
  crt;

var
  a, i, j, p : Byte;
  z : Char;
  tab : array[1..6] of Byte;
  spr : boolean;
  plik2 : Text;
  opis : string;
  KoniecPetli : boolean;

  procedure losujzapisz; {poczatek  procedury losujzapisz}
  begin
    clrscr;
    randomize;

    begin
      Assign(plik2, 'd:\lot.txt');
      rewrite(plik2);
      spr := False;

      for p := 1 to 1 do
      begin
        for i := 1 to 6 do
        begin
          repeat
            spr := False;
            a := random(49) + 1;

            for j := 1 to i do
            begin
              if a = tab[j] then
                spr := True;
            end;
          until spr <> True;

          tab[i] := a;
          Write(plik2, tab[i], ' ');
          writeln(tab[i], ' ');
        end;
      end;

      writeln(plik2);
      Write('Liczby zapisane do pliku txt: ');

      for i := 1 to 6 do
        Write(tab[i], ' ');

      Close(plik2);
      readln;
    end;
  end; {koniec procedury losujzapisz}

  procedure dopisz; {porczatek procedury dopisz}
  var
    a, i, j : Byte;
  begin
    Assign(plik2, 'd:\lot.txt');
    append(plik2);
    randomize;
    spr := False;

    begin
      for i := 1 to 6 do
      begin
        repeat
          spr := False;
          a := random(49) + 1;

          for j := 1 to i do
          begin
            if a = tab[j] then
              spr := True;
          end;
        until spr <> True;

        tab[i] := a;
        Write(plik2, tab[i], ' ');
        writeln(tab[i], ' ');
      end;
    end;

    writeln(plik2);
    Write('Liczby zapisane do pliku txt: ');

    for i := 1 to 6 do
      Write(tab[i], ' ');

    Close(plik2);
  end;{koniec procedury dopisz}

  procedure wybierz; {poczatek procedury wybierz}
  begin
    z := Readkey;

    if z = #27 then
      Exit;

    Writeln('Wtamy w programie Lotto.');
    Write('Wcisnij enter aby wylosowac i dopisac lub escape aby zakonczyc.');

    begin
      readln(z);
      repeat
        z := ReadKey;
        if z = #27 then
          Exit;
        Read;
        dopisz;
      until z = #27;
    end;
  end; {koniec procedury wybierz}

  procedure zapisdaty;
  const
    dni : array[0..6] of string = ('Niedz', 'Pon', 'Wto', 'Sro', 'Czw', 'Pia', 'Sob');
  var
    plik : Text;
  var
    godz, min, sek, sek100, rr, mm, dd, dztyg : word;
  var
    g2, m2, s2, rr2, mm2, dd2 : string;
  begin
    clrscr;
    getdate(rr, mm, dd, dztyg);
    Str(rr, rr2);
    writeln(rr2);
    Str(mm, mm2);
    writeln(mm2);
    Str(dd, dd2);
    writeln(dd2);

    gettime(godz, min, sek, sek100);
    Str(godz, g2);
    writeln(g2);
    Str(min, m2);
    writeln(m2);
    Str(sek, s2);
    writeln(s2);

    rename(plik2, 'D:\' + rr2 + '-' + mm2 + '-' + dd2 + '_' + g2 + ';' + m2 + ';' + s2 + '.txt');
  end;

{kod glowny}
begin
  repeat
    z := Readkey;

    if z = #27 then
      Exit;

    losujzapisz;
    wybierz;
  until z = #27;

  zapisdaty;
  clrscr;
end.

2gi kod:

program sortowanie;
uses
  dos,
  crt;

const
  n = 6;
type
  tablica = array[1..n] of Byte;
var
  plik : Text;

  procedure sortowanie_babelkowe(var tab : tablica);
  var
    i, j, tmp : Byte;
  begin
    for i := 1 to n - 1 do
      for j := i + 1 to n do
        if tab[i] > tab[j] then
        begin
          tmp := tab[i];
          tab[i] := tab[j];
          tab[j] := tmp;
        end;
  end;

  procedure wyswietl(tab : tablica);
  var
    i : Byte;
    plik : Text;
  begin
    Assign(plik, 'D:\lotor.txt');
    append(plik);

      for i := 1 to n do
        Write(plik, tab[i], ' ');
      writeln;

    writeln(plik);
    Write('Liczby zapisane do pliku txt: ');

    for i := 1 to n do
      Write(tab[i], ',');

    Close(plik);
  end;

  procedure uzupelnij(var tab : tablica);
  var
    a, i, j, p : integer;
    spr : boolean;
  begin
    randomize;
    spr := False;

    for p := 1 to 1 do
    begin
      for i := 1 to n do
      begin
        repeat
          spr := False;
          a := random(49) + 1;

          for j := 1 to i do
          begin
            if a = tab[j] then
              spr := True;
          end;
        until spr <> True;

        tab[i] := a;
        Write(tab[i], ' ');
      end;
    end;
  end;

  procedure nowy;
  var
    plik : Text;
  begin
    Assign(plik, 'D:\lotor.txt');
    rewrite(plik);
    Close(plik);
  end;

  procedure zapisdaty;
  const
    dni : array[0..6] of string = ('Niedz', 'Pon', 'Wto', 'Sro', 'Czw', 'Pia', 'Sob');
  var
    plik : Text;
  var
    godz, min, sek, sek100, rr, mm, dd, dztyg : word;
  var
    g2, m2, s2, rr2, mm2, dd2 : string;
  begin
    clrscr;

    getdate(rr, mm, dd, dztyg);
    Str(rr, rr2);
    writeln(rr2);
    Str(mm, mm2);
    writeln(mm2);
    Str(dd, dd2);
    writeln(dd2);

    gettime(godz, min, sek, sek100);
    Str(godz, g2);
    writeln(g2);
    Str(min, m2);
    writeln(m2);
    Str(sek, s2);
    writeln(s2);

    rename(plik, 'D:\' + rr2 + '-' + mm2 + '-' + dd2 + '_' + g2 + ';' + m2 + ';' + s2 + '.txt');
  end;

var
  tab : tablica;
  z : Char;
begin
  nowy;

  repeat
    z := Readkey;

    if z = #27 then
      Exit;

    uzupelnij(tab);
    sortowanie_babelkowe(tab);
    wyswietl(tab);
    readln;
  until z = #27;

  zapisdaty;
end.

edit: usunąłem puste linie

1 użytkowników online, w tym zalogowanych: 0, gości: 1