Trochę bałaganu zauważyłem w tym kodzie;
type tablica=array[1..1000] of string;
type tablica2=array[1..1000] of string;
Przypomnę, że nie ma sensu w ten sposób tworzyć zmiennych tablicowych; Właściwym sposobem jest zadeklarowanie typu i wykorzystanie go przy deklaracji:
type
TLinesArr = array [1 .. 1000] of String;
var
laInput, laOutput: TLinesArr;
I nie deklarujcie macierzy jak humaniści - macierze powinno się indeksować od 0
; Poza tym co to za identyfikatory Tab1
, Tab2
? Zmiennym nadaje się nazwy takie, żeby patrząc na nie można było się szybko domyślić do czego służą; Po tym można się domyślić, że trzeba poszukać w kodzie ich (prze)znaczenia;
Następna sprawa:
procedure wczytaj;
begin
assign(plk,'z:\slowa.txt');
reset(plk);
i:=1;
for i:=1 to 1000 do
begin
read(plk,w);
tab[i]:=w;
close(plk);
end;
end;
Trochę w niej bałaganu; Zwróć uwagę na pętlę:
for i:=1 to 1000 do
begin
read(plk,w);
tab[i]:=w;
close(plk);
end;
Otwierasz plik, w pętli zaczynasz wczytywanie linii i od razu po pierwszym przejściu pętli zamykasz plik; Musisz to wyrzucić poza pętlę:
procedure Wczytaj;
begin
Assign(Plk, 'Z:\Slowa.txt');
Reset(Plk);
for I := 1 to 1000 do
ReadLn(Plk, Tab[I]);
Close(Plk);
end;
Przede wszystkim możesz w pętli wczytywać linijki z pliku bezpośrednio do macierzy, zmienna w
nie jest potrzebna; Poza tym niepotrzebnie przed pętlą inicjujesz zmienną i
(i := 1;
); Następnym błędem jest odczyt kolejnych linii z pliku procedurą Read
- musisz zastosować ReadLn
by działało prawidłowo;
Następnie strasznie pomieszana jest procedura zapisująca:
procedure zapisz;
begin
assign(plk,'z:\slowa.txt');
rewrite(plk);
begin
for i:=1 to 1000 do
writeln(tab2[i]);
end;
close(plk);
end;
Powinieneś ją zrobić w ten sposób:
procedure Zapisz;
begin
Assign(Plk, 'Z:\Slowa.txt');
ReWrite(Plk);
for I := 1 to 1000 do
WriteLn(Plk, Tab2[I]);
Close(Plk);
end;
Dlaczego? Już tłomaczę; Po pierwsze to niepotrzebnie objąłeś pętlę w blok begin .. end
- nie trzeba tego robić; Po drugie to nie wpisujesz w ogóle słów z macierzy do pliku, bo pierwszym argumentem procedury WriteLn
powinna być zmienna plikowa (tu: plk
), której nie podałeś, więc wszystko zapewne lądowało na ekranie monitora; Po trzecie - formatowanie...
Przyjrzyjmy się głównej części programu:
begin
clrscr;
wczytaj;
repeat
for i:=1 to 1000 do
begin
k:=length(tab[i])+1;
repeat until k>0;
tab2[i]:=tab[i]+tab[i][k];
k:=k-1;
end;
end;
zapisz;
end.
Tragedia... Dlaczego nie napiszesz sobie funkcji odwracającej łańcuch? Było by Ci łatwiej, a kod byłby przejrzysty:
function Odwroc(Lancuch: String): String;
var
I: Word;
begin
Result := '';
for I := Length(Lancuch) downto 1 do
Result := Result + Lancuch[I];
end;
Wystarczy teraz ją wywołać w pętli i zapisywać do pliku; Po co Ci tam repeat
i dlaczego nie jest domknięty o until
??? Nie rozumiem... Wracając do funkcji odwracającej łańcuch - wystarczy ją wywołać dla każdego pola tablicy i później zapisać wartości do pliku, np. tak:
Wczytaj;
for I := 1 to 1000 do
Tab2[I] := Odwroc(Tab2[I]);
Zapisz;
I będzie działać bez problemu;
To, co powinieneś zrobić:
- podawać tablice jako argument procedur,
- podawać nazwę pliku jako argument procedur,
- dzielić kod na procedury (zabrakło odwracającej łańcuch),
- używać zmiennych lokalnych w procedurach/funkcjach,
- stosować styl wielbłądzi w nazewnictwie każdego elementu kodu (jezyka),
- formatować kod na bieżąco,
- nazywać zmienne, procedury i funkcje po angielsku (spolszczanie nie ma sensu...);
To chyba tyle, jeśli chodzi o uwagi z mojej strony; Przede wszystkim polecam myśleć podczas pisania programu i starać się samemu rozwiązywać zawarte w kodzie błędy - samodzielność to nie wada;
Bóg ukarze mnie za polskie identyfikatory w tym przykładzie...