Skocz do zawartości

problem z programem w turbo pascal


Recommended Posts

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ć plik, którynie 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. :)

Edytowane przez Pliks
Link to post
Share on other sites

Dlaczego zamiast tworzyć plik od razu z prawidłową nazwą, tworzysz najpierw plik "lotor.txt", a dopiero później zmieniasz jego nazwę na prawidłową? Procedura zapisdaty ma swoją zmienną plik i nie ma informacji o tym pliku, który stworzyłeś.

Edytowane przez Luki91
Link to post
Share on other sites

Dlaczego zamiast tworzyć plik od razu z prawidłową nazwą, tworzysz najpierw plik "lotor.txt", a dopiero później zmieniasz jego nazwę na prawidłową? Procedura zapisdaty ma swoją zmienną plik i nie ma informacji o tym pliku, który stworzyłeś.

bo jak robię procedurę dopisania nowego wiersza do pliku używając append, to muszę podać nazwę pliku, i jaką mam podac nazwę, skoro plik jest utworzony  z datą i czasem w nazwie? albo po prostu nie wiem jak to sprytnie obejść?

Edytowane przez Pliks
Link to post
Share on other sites

Możesz zwyczajnie zapisać tą nazwę do zmiennej :)

 

Ale tak nawiasem mówiąc, cała struktura tego programu jest moim zdaniem błędna. Piszesz procedury w miejscach, gdzie powinieneś użyć funkcji. Budowa takiego programu powinna wyglądać następująco:

 

1) Masz:

- funkcję zwracającą nazwę pliku w oparciu o aktualną datę i czas

- funkcję zwracającą tablicę liczb

- funkcję przyjmującą tablicę i zwracającą posortowaną tablicę (lub procedurę sortującą w miejscu, to obojętne)

- procedurę przyjmującą nazwę pliku oraz tablicę, która zapisuje liczby z tablicy do pliku o danej nazwie

2) Kroki:

- pobierasz nazwę pliku do zmiennej

- pobierasz tablicę liczb do zmiennej

- sortujesz tablicę (za pomocą procedury bądź funkcji)

- wywołujesz procedurę zapisującą do pliku przekazując nazwę pliku i posortowaną tablicę

 

 

Każdy problem najlepiej dzielić na mniejsze i właśnie to uzyskujesz tym sposobem. Poza tym logiczny, spójny kod dużo łatwiej zrozumieć i zdebugować. W twoim kodzie problem jest posiekany na zbyt wiele niepasujących do siebie kawałków, stąd problemy :)

Edytowane przez Luki91
  • Popieram 1
Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...