Wątek przeniesiony 2015-05-20 22:04 z Delphi i Pascal przez olesio.

Zwracanie informacji o losowej liczbie zapisanej w pliku

0

Witam, zastanawiam się nad takim oto zadaniem:

Napisz program, który zapisuje do pliku losową liczbę rzeczywistą, a następnie odczytuje je z tego pliku zwracając informację :
a/ ile danych
b/ jaka najmniejsza i najwieksza
c/ srednia wartosc

Wskazówka:
Użyj konstrukcji while not EoF, pierwszą daną przeczytaj niezależnie i przyjmij ją jako początkowo minimalną i początkowo maksymalną.

Mógłby mi ktoś w stanie w tym pomóc/ dać linki do materiałów o tym? Nie było mnie na tym w szkole i nie bardzo rozumiem, zrobiłem już łatwiejsze zadanie dotyczące zapisu do pliku, ale tutaj już chwilę siedzę i nic nie wymyśliłem ;/.
Oczywiście z góry wielkie dzięki.

dodanie znacznika <quote> - @furious programming

2

Proszę bardzo linki do materiałów:
Eof
Random
TextFile
Wyznaczenie najmniejszej to ustawiamy zmienną pomocniczą na High(Real), w pętli sprawdzamy wczytane liczby, kiedy wczytana liczba jest mniejsza to ustawiamy na nią. W ten sposób znajdziemy najmniejszą po skończeniu pętli. Największa to odwrotnie tylko ustawiamy zmienną pomocniczą na Low(Real) i sprawdzamy kiedy jest większa. Średnią to chyba dziecko w podstawówce wie jak się wylicza, tak że tego nie tłumacze. I następnym razem pytania o tak banalne podstawy zadajemy tutaj w dziale Newbie. Tam też przenoszę ten wątek.

1

@kiro67 - a gdybyś zastanawiał się nad tym, w jaki sposób za pomocą funkcji Random wylosować liczbę rzeczywistą, to jest na to proste rozwiązanie; Wystarczy wylosować dwie liczby z dużego przedziału i podzielić jedną przez drugą:

var
  rlNumber: Real;

{...}

rlNumber := (Random(1000) + 1) / (Random(1000) + 1);

Domyślam się, że chodzi o starego i badziewnego Pascala - w razie użytkowania czegoś "na czasie", polecam skorzystać z typu Double zamiast Real.

0

Mógłby ktoś podesłać jeszcze link z tymi high i low? Byłbym mega wdzięczny, bo resztę już ogarnąłem.

1

No masz - High i Low.

0

Czyli aby wypisało mi największą wartość wystarczy wstawić writeln(High(i)); ?

Ok, więc póki co zrobiłem coś takiego:

randomize;
assign(plik, 'C:\Users\Mirek\Documents\liczba.txt');
rewrite(plik);
for i:=1 to 10 do
  write(plik, ' ',(Random(1000) + 1) div (Random(1000) + 1));
close(plik);

Użyłem div, gdyż przy / wychodziły jakieś dzikie liczby. Myślę, że dobrze, tak?

zamiana znacznika <quote> na <code class="pascal"> - @furious programming

1

Użyłem div, gdyż przy / wychodziły jakieś dzikie liczby. Myślę, że dobrze, tak?

No właśnie nie - Ty masz wylosować liczby rzeczywiste, a nie całkowite, więc nie możesz używać operatora Div do dzielenia, bo wynikiem jest liczba całkowita; Po to właśnie podałem Ci przykład, żebyś wiedział jak uzyskać losową liczbę rzeczywistą;

Kolejna rzecz - skoro w treści zadania napisane jest, aby użyć konstrukcji while not EoF; To znaczy, że kolejne liczby mają być zapisane w kolejnych liniach pliku; Dlatego też w pętli używaj instrukcji Writeln;

Poza tym napisz z jakiego środowiska/kompilatora korzystasz.

1
kiro67 napisał(a):

Czyli aby wypisało mi największą wartość wystarczy wstawić writeln(High(i)); ?

Nie! Napisałem co nalezy zrobić. Użyć pętli sprawdzając wczytane liczby. Chodziło o wartość początkową zmiennej do ustalenia najmniejszej/największej liczby. Poczytaj z podanych linków co robią funkcje Low oraz High.

Ok, więc póki co zrobiłem coś takiego:

r

andomize;
assign(plik, 'C:\Users\Mirek\Documents\liczba.txt');
rewrite(plik);
for i:=1 to 10 do
write(plik, ' ',(Random(1000) + 1) div (Random(1000) + 1));
close(plik);

Użyłem div, gdyż przy / wychodziły jakieś dzikie liczby. Myślę, że dobrze, tak?

Raczej ja bym kombinował coś w ten deseń. I więcej się postaraj zrobić samodzielnie. Co chwile nie ma sensu na forum smarować post. Jakbyś przysiadł, pogooglował, poczytał kurs z podstawami, ewentualnie podane artykuły, a także dalsze wskazówki oraz linki w nich zawarte to już dawno miałbyś ten program gotowy. To jest zadanie zaliczeniowe dla Ciebie, a nie dla nas. Także do dzieła! :)

program testy;

uses
  Math;

var
  D : Double;
  I : integer;
  Plik : TextFile;
begin
  Randomize;
  Assign(Plik, 'liczby.txt');
  Rewrite(Plik);
  for I := 1 to 10 do
  begin
    D := RandomRange(10, 1000 + 1) / 100;
    Writeln(Plik, D : 0 : 2);
  end;
  Close(Plik);
end.
0

Dzięki wielkie za pomoc, generowanie liczb mam nadzieje ze zrobilem juz poprawnie, zrobiłem też liczenie średniej, teraz tylko reszta

program randomowaliczba;

var
 liczba: real;
 liczba1: real;
 i:integer;
 plik: text;




begin
  randomize;
  assign(plik, 'C:\Users\Mirek\Documents\liczba.txt');
  rewrite(plik);
  liczba:=(random(1000) + 1) / (Random(1000) + 1) ;
  writeln(liczba);

  for i:=1 to 10 do
  begin
   liczba1 := (Random(1000) + 1) / (Random(1000) + 1) ;
   writeln(plik, liczba1 : 0 : 5)


   end;

   writeln('srednia to:' ,(liczba1+liczba)/(10+1));
   readln;
   close(plik);

   end.

zamiana znaczników <quote> na <code class="pascal"> - @furious programming

1

@kiro67 - Twój kod póki co nie spełnia wszystkich oczekiwań;

Poza tym, na początku bloku głównego (tuż po otwarciu pliku do zapisu) losujesz liczbę, po czym wyświetlasz ją na ekranie, następnie wykonywana jest już pętla; Po co więc to nadmiarowe losowanie? Z treści zadania:

Użyj konstrukcji while not EoF, pierwszą daną przeczytaj niezależnie i przyjmij ją jako początkowo minimalną i początkowo maksymalną.

wynika, że pierwsza liczba w pliku (głupio nazwana "ile danych") określa ilość po niej zapisanych liczb rzeczywistych; Ty natomiast nic takiego nie zapisujesz, wzamian jest to jedno dziwne losowanie i wyświetlanie wylosowanej liczby na ekranie;

Skup się - po pierwsze musisz stworzyć plik, w pierwszym wierszu zapisać liczbę całkowitą, określającą to ile będzie zapisanych liczb rzeczywistych po niej; Podpowiem, że ta całkowita liczba określać będzie ilość iteracji pętli przy zapisywaniu liczb rzeczywistych do pliku;

Przy liczeniu średniej, wartości minimalnej i maksymalnej musisz pominąć tę liczbę całkowitą (?!), pobrać pierwszą rzeczywistą i ją użyć do określenia początkowego minimum i maksimum; Nie wiem kto formułował treść tego zadania, ale jeśli ma być użyta wymieniona konstrukcja:

Użyj konstrukcji while not EoF, pierwszą daną [...]

to podpunkt a) jest zupełnie niepotrzebny i tylko komplikuje wszystko; Tę konstrukcję użyć można w przypadku, gdy ilość zapisanych w pliku liczb rzeczywistych jest znana lub kiedy nie jest znana (odczytujemy liczby aż do końca zawartości pliku); Natomiast zapisywanie w pierwszej linii pliku ilości liczb rzeczywistych ma sens jedynie w przypadku, gdy ich ilość jest znana;

Treść tego zadania też jest kosmiczna...:

Napisz program, który zapisuje do pliku losową liczbę rzeczywistą, a następnie odczytuje je z tego pliku [...]

No tak, zapisz liczbę a potem odczytaj liczby - kompletnie nielogiczne;
____Na Twoim miejscu darowałbym sobie podpunkt a) i do pliku zapisywał losową ilość liczb rzeczywistych, a potem przy odczytywaniu tych liczb użył konstrukcji while not EoF, aby móc odczytać je wszystkie.

1

Kod niesformatowany, nieeleganckie nazewnictwo zmiennych do tego z małych liter i dość późna pora. Lecz jeśli pamiętam podstawy logiko matematyki. To średnia, jest sumą liczb podzieloną przez ich ilość. W powyższym kodzie nie umiem dostrzec żadnego sumowania.

Edit: no tak, treść zadania jest tak ułożona, że na prawdę ciężko zrozumieć o co chodzi. Ja zrozumiałem początkowo tak, iż program ma zawsze dopisać nową wylosowaną liczbę do poprzednich z pliku, który otworzymy i dokonać liczenia średniej, najniższej, najwyższej. Ale faktycznie ta ilość danych. Zamiast napisać po ludzku, w pierwszym wierszu pliku umiść ilośc wylosowanych liczb. To faktycznie by sugerowało, że może być ona losowa.

0

Mam nadzieję, że o to mniej więcej chodzi:

program randomowaliczba;

var
 calkowita: integer;
 liczba1: real;
 i:integer;
 plik: text;




begin
  randomize;
  assign(plik, 'C:\Users\Mirek\Documents\liczba.txt');
  rewrite(plik);
  calkowita:=(random(1000) + 1) div (Random(1000) + 1) ;
  writeln(plik, calkowita);


  for i:=1 to calkowita do
  begin
   liczba1 := (Random(1000) + 1) / (Random(1000) + 1) ;
   writeln(plik, liczba1 : 0 : 5)   ;
   readln;

   close(plik);

   end;
   end.
0

Jesteś pewny, że zmienną z liczbą iteracji pętli należy losować w tak przedziwny sposób? Poza tym nie ma nadal żadnego wyznaczania minumum, maximum ani średniej. Do tego pętla zamykać będzie już po pierwszym przebiegu zamknięty plik. Wszystko dlatego, że uparcie nie formatujesz kodu i nie widzisz gdzie kończy się kod pętli. Stosuj formatowanie jak radzę w swoim postcie tutaj: http://4programmers.net/Forum/1108392

0

Ok, wprowadziłem drobne poprawki, póki co bez max, min i średniej:

program randomowaliczba;

var
 calkowita: integer;
 liczba1: real;
 i:integer;
 plik: text;





begin
  randomize;
  assign(plik, 'C:\Users\Mirek\Documents\liczba.txt');
  rewrite(plik);
  calkowita:=random(10);
  writeln(plik, calkowita);


  for i:=1 to calkowita do
  begin
   liczba1 := (Random(1000) + 1) / (Random(1000) + 1) ;
   writeln(plik, liczba1 : 0 : 5)   ;
   readln;
  end;


   writeln('ilosc skladnikow:' ,calkowita );
   readln;
   close(plik);
   end.
0

Poczytaj jak działa Random. Twoja pętla może się nie wykonać wcale. Najlepiej usiądź, napisz ten program do końca i wtedy postnij najwyżej kod. Bo tak co chwile nie ma sensu. I nadal się nie stosujesz do podstawowego zalecenia. FORMATUJ KOD! A i daruj sobie zbędne puste linijki.

0
olesio napisał(a)

Twoja pętla może się nie wykonać wcale.

No tak, dlatego zawsze będziemy powtarzać, aby indeksować jak ludzie - od zera :]

@kiro67 - musisz poprawić zakres iteratora pętli z 1 na 0.

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