Mam napisać program, który w zmiennej tekstowej zapisze 10 losowo wylosowanych liczb z zakresu od 1…50, a następnie odczyta z pliku tekstowego te liczby, znajdzie minimum i wyświetli na ekranie. Napisałem taki oto kod, ale wyskakuje mi ‘ERROR 106’. Czy jeśli zapisuje się liczby w notatniku w jednej linii nie powinny być one oddalone od siebie jakoś spacjami? Gdzieś tak czytałem, że aby komputer poprawnie rozpoznał(odczytał z pliku tekstowego) liczbę musi ona być oddalona o 1 spację od kolejnej. Oto kod:
Program GenerujPlikTekstowy;
Uses Crt;
Var
plik_tekstowy: text;
Procedure Start;
Begin
clrscr;
writeln('--------------------------------------------------------------------');
writeln;
writeln('PROGRAM GENERUJE 10 LICZB DO PLIKU TEKSTOWEGO Z ZAKRESU OD 1 DO 50 I WYBIERA NAJMNIEJSZA');
End;
Procedure LosujIZapisz(var plik_tekstowy: text);
Var
i: byte;
t: array [1..10] of byte;
Begin
assign(plik_tekstowy, 'plik1.txt');
rewrite(plik_tekstowy);
randomize;
for i:=1 to 10 do
Begin
t[i]:=random(50)+1;
write(plik_tekstowy, t[i]);
End;
close(plik_tekstowy);
End;
Function OdczytajIZnajdzMinimum(var plik_tekstowy: text): byte;
Var
i, min: byte;
t: array [1..10] of byte;
Begin
assign(plik_tekstowy, 'plik1.txt');
reset(plik_tekstowy);
i:=1;
Repeat
read(plik_tekstowy, t[i]);
inc(i);
Until EOF(plik_tekstowy);
min:=t[1];
for i:=2 to 10 do
if t[i] < min then min:=t[i];
OdczytajIZnajdzMinimum:=min;
close(plik_tekstowy);
End;
Begin
Start;
writeln;
LosujIZapisz(plik_tekstowy);
writeln;
writeln('Minimum z losowo wygenerowanego zbioru wynosi: ',OdczytajIZnajdzMinimum(plik_tekstowy));
writeln;
write('Nacisnij dowolny klawisz aby zakonczyc prace programu...');
readkey;
End.
W miejscu gdzie operujesz na pliku zmień procedury read() i write() na readln() i writeln().
Jeżeli chcesz dowiedzieć się w jaki sposób pascal tłumaczy zmienne tekstowe na typy numeryczne poczytaj opis procedury val() i ew. pobaw się nią trochę.
W ten sposób powstanie rząd liczb oddzielonych spacjami. Standardowo oddziela się także liczby używając przecinka, średnika lub znaku tabulacji (jak chcesz poczytać szerzej: poszukaj coś w necie na temat formatu plików tekstowych csv/dat/txt - lub przejrzyj opcje importu arkuszy kalkulacyjnych - tam też coś się dowiesz).
Procedura odczytu taka jaką wysłałeś - z tego co sprawdzałem ze spacją jako znakiem rozdzielającym działa, ze średnikiem wyrzuca RE 106 (trzeba by się zapewne bawić w “ręczny” import).
Edit: Do zapisu możesz też użyć swojej procedury, tylko wymusić zapis w konkretnej (o 1 większej niż liczby) ilości znaków dziesiętnych (tu: 3) - różnica jest taka, że w tym przypadku spację nadmiarową będziesz miał na początku, a nie końcu pliku.
Zrobiłem tak jak kazaliście. Liczby zapisują się w jednej linii z odstępami. Tylko, że teraz nie działa mi algorytm znajdowania minimum. Nie wiem czemu ale wygląda to tak jakby wybierał 1 lepsza z przodu i brał ją za min.
Program GenerujPlikTekstowy;
Uses Crt;
Var
plik_tekstowy: text;
Procedure Start;
Begin
clrscr;
writeln('--------------------------------------------------------------------');
writeln;
writeln('PROGRAM GENERUJE 10 LICZB W TXT Z ZAKRESU OD 1 DO 50 I WYBIERA NAJMNIEJSZA');
End;
Procedure LosujIZapisz(var plik_tekstowy: text);
Var
i: byte;
t: array [1..10] of byte;
Begin
assign(plik_tekstowy, 'C:\plik1.txt');
rewrite(plik_tekstowy);
randomize;
for i:=1 to 10 do
Begin
t[i]:=random(50)+1;
write(plik_tekstowy, t[i], ' ');
End;
writeln;
write('Liczby zapisane do pliku txt: ');
for i:=1 to 10 do
write(t[i],', ');
close(plik_tekstowy);
End;
Function OdczytajIZnajdzMinimum(var plik_tekstowy: text): byte;
Var
i, min: byte;
c: string;
t: array [1..10] of byte;
Begin
assign(plik_tekstowy, 'C:\plik1.txt');
reset(plik_tekstowy);
i:=1;
Repeat
read(plik_tekstowy, t[i], c);
inc(i);
Until EOF(plik_tekstowy);
min:=t[1];
for i:=2 to 10 do
if t[i] < min then min:=t[i];
OdczytajIZnajdzMinimum:=min;
close(plik_tekstowy);
End;
Begin
Start;
LosujIZapisz(plik_tekstowy);
writeln;
writeln;
writeln('Minimum z losowo wygenerowanego zbioru wynosi: ',OdczytajIZnajdzMinimum(plik_tekstowy));
writeln;
write('Nacisnij dowolny klawisz aby zakonczyc prace programu...');
readkey;
End.