Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   В типизированный файл F с помощью генератора случайных чисел (http://www.tehnari.ru/f43/t91552/)

borntank 13.10.2013 00:57

В типизированный файл F с помощью генератора случайных чисел
 
В типизированный файл F с помощью генератора случайных чисел записать 1000 целых чисел из диапазона от – 50 до +50, затем из файла F скопировать в файл G все нечетные числа.
Pascal ABC

AlexZir 13.10.2013 05:37

Алгоритм:
В разделе переменных:
1. Определяете переменные для типизированных файлов и для циклов.
В программе
2. Ассоциируете файловые переменные с путями к файлам.
3. Открываете файл F по перезаписи командой rewrite(f).
4. Инициализируете генератор псевдослучайных чисел командой randomize.
5. В цикле записываете в файл 1000 случайных чисел из указанного диапазона. Получить их можно, к примеру, командой round(random*101)-50.
6. Переоткрываете файл F по чтению командой reset(f), а файл G - по перезаписи командой rewrite(G).
7. В цикле считываете число из F, анализируете его на делимость на 2, если не делится - записываете в файл G.
8. Закрываете оба файла.
По окончании работы программы можете просмотреть содержимое полученных файлов, к примеру, через Блокнот.

borntank 14.10.2013 08:39

Спасибо конечно за алгоритм, но, к сожалению, не могу понять задачи связанные с файлами.

Vladimir_S 14.10.2013 10:25

Цитата:

Сообщение от borntank (Сообщение 958145)
Спасибо конечно за алгоритм, но, к сожалению, не могу понять задачи связанные с файлами.

Ну что же - давайте разбираться. И, заодно, учиться.
Цитата:

В разделе переменных:
1. Определяете переменные для типизированных файлов и для циклов.
Код:

Var
 F,G:File of Integer;
 i,N,P:Integer;

Здесь добавлена еще переменная P - счетчик нечетных чисел.
Цитата:

В программе
Код:

Begin
Цитата:

2. Ассоциируете файловые переменные с путями к файлам.
Код:

Assign(F,'D:\First');
Assign(G,'D:\Second');

Здесь файлы с именами "First" и "Second" располагаются на диске D. Естественно, имена файлов и пути к ним Вы можете изменить на свой вкус.
Цитата:

3. Открываете файл F по перезаписи командой rewrite(f).
Код:

ReWrite(F);
Цитата:

4. Инициализируете генератор псевдослучайных чисел командой randomize.
Код:

Randomize;
Цитата:

5. В цикле записываете в файл 1000 случайных чисел из указанного диапазона. Получить их можно, к примеру, командой round(random*101)-50.
Код:

For i:=1 to 1000 do
  begin
  N:=-50+Random(101);
  Write(F,N);
  end;
 Close(F);

Здесь - одно замечание. Конечно, генерацию чисел можно организовать и так, как предлагает AlexZir, но мне представляется этот переход от вещественного к целочисленному формату излишним и перегружающим программу. Поэтому я предлагаю более простой и прямой вариант.
Цитата:

6. Переоткрываете файл F по чтению командой reset(f), а файл G - по перезаписи командой rewrite(G).
Код:

ReSet(F);
 ReWrite(G);

Цитата:

7. В цикле считываете число из F, анализируете его на делимость на 2, если не делится - записываете в файл G.
Код:

P:=0;
 For i:=1 to 1000 do
  begin
  Read(F,N);
  If (N mod 2)<>0 then
    begin
    Write(G,N);
    P:=P+1;
    end;
  end;

Добавлен подсчет количества нечетных чисел.
Цитата:

8. Закрываете оба файла.
Код:

Close(F);
 Close(G);

Цитата:

По окончании работы программы можете просмотреть содержимое полученных файлов, к примеру, через Блокнот.
Вот тут - внимание! Это так, но ТОЛЬКО если тип файлов - текстовый (Text). Если же, как в данном случае, объявлен числовой формат файлов, то всё, что Вы увидите, открыв их Блокнотом - это цепочку крякозябров. Ибо информация закодирована. Поэтому я вставил чтение и вывод на экран нечетных чисел, содержащихся в файле G, для чего мне и понадобился счетчик P:
Код:

ReSet(G);
 For i:=1 to P do
  begin
  Read(G,N);
  Write(N:4);
  end;

Ну и заканчиваем программу. Оператор Readln поставлен для того, чтобы приостановить работу и посмотреть на результат. Возможно, в АВС он не нужен - не знаю.
Код:

Readln
End.

Теперь осталось только состыковать фрагменты листинга. Это я предоставляю Вам.

borntank 20.10.2013 16:36

Цитата:

Вот тут - внимание! Это так, но ТОЛЬКО если тип файлов - текстовый (Text). Если же, как в данном случае, объявлен числовой формат файлов, то всё, что Вы увидите, открыв их Блокнотом - это цепочку крякозябров. Ибо информация закодирована. Поэтому я вставил чтение и вывод на экран нечетных чисел, содержащихся в файле G, для чего мне и понадобился счетчик P:
Спасибо большое,но можно чтоб в блокноте выводились нужные числа (в файле G были нечетные числа,а F все числа)?

AlexZir 20.10.2013 17:32

Цитата:

Сообщение от borntank (Сообщение 957695)
В типизированный файл F

Цитата:

Сообщение от borntank (Сообщение 960226)
но можно чтоб в блокноте выводились нужные числа

Ваше желание противоречит поставленной задаче, вам же уже выше писали
Цитата:

Сообщение от Vladimir_S (Сообщение 958154)
Если же, как в данном случае, объявлен числовой формат файлов, то всё, что Вы увидите, открыв их Блокнотом - это цепочку крякозябров. Ибо информация закодирована.

Впрочем, можно попытаться просмотреть содержимое файла, к примеру, через FAR Manager, но, к сожалению, никто не гарантирует, что вы получите желаемое.

Vladimir_S 20.10.2013 17:44

Цитата:

Сообщение от borntank (Сообщение 960226)
Спасибо большое,но можно чтоб в блокноте выводились нужные числа (в файле G были нечетные числа,а F все числа)?

Как указывалось выше (и мною, и AlexZir), это возможно только при текстовом типе файлов. Если таковой допустим, то так:
Код:

Var
 F,G:Text;
 i,N:Integer;


Begin
 Assign(F,'D:\First');
 Assign(G,'D:\Second');
 ReWrite(F);
 Randomize;
 For i:=1 to 1000 do
  begin
  N:=-50+Random(101);
  Write(F,N:4);
  end;
 Close(F);

 ReSet(F);
 ReWrite(G);

 For i:=1 to 1000 do
  begin
  Read(F,N);
  If (N mod 2)<>0 then Write(G,N:4);
  end;

 Close(F);
 Close(G);

End.


borntank 29.10.2013 00:40

А можно чтоб паскаль выводил ответ,а то он выводит значения только файла F?
Код HTML:

uses crt;
Var
 F,G:File of Integer;
 i,N,P:Integer;
Begin
clrscr;
 Assign(F,'D:\First');
 Assign(G,'D:\Second');
 ReWrite(F);
 Randomize;
For i:=1 to 1000 do
  begin
  N:=-50+Random(101);
  Write(F,N);
  end;
 Close(F);
  ReSet(F);
 ReWrite(G);
  P:=0;
 For i:=1 to 1000 do
  begin
  Read(F,N);
  If (N mod 2)<>0 then
    begin
    Write(G,N);
    P:=P+1;
    end;
  end;
 Close(F);
 Close(G);
  ReSet(G);
 For i:=1 to P do
  begin
  Read(G,N);
  Write(N:4);
  end;
  Readln
End.


borntank 30.10.2013 18:22

Ой извините,там все правильно)
Спасибо еще раз.


Часовой пояс GMT +4, время: 13:12.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.