Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 05.08.2011, 01:32   #51 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

да, конечно можно.

я думаю, для этого придётся заменить главный цикл For на цикл Repeat - Until ..

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

другое дело, что пока пользователь будет нажимать на клавишу, программа побежит вперёд и вероятно достаточно быстро израсходует наш массив, который рассчитан всего на 1000 переменных
gotherson вне форума   Ответить с цитированием
Старый 05.08.2011, 20:36   #52 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Увеличил размер массива, компилятору не нравится строка
Assign(F, 'D:\f1.dat');
Красная строка : " Непредвиденное исключение "
Yug7 вне форума   Ответить с цитированием
Старый 05.08.2011, 21:47   #53 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вернул диск С (перед этим сменил на D - я там работаю ). Программа пошла, пока обкатаю на N=1000000.

Assign(F, 'D:\f1.dat');-это я изменил. Не факт,что в этом причина : я
одновременно очень сильно увеличил N. Аппетит уменьшил. Отработает, буду помалу увеличивать.
Yug7 вне форума   Ответить с цитированием
Старый 05.08.2011, 22:48   #54 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

в коде практически ничего не менял (выделено).

добавил выход по нажатию клавиши и немного поменял основной цикл, что позволит использовать весь зарезервированный массив (раньше делали N действий, теперь продолжаем до создания N кол-ва переменных)

Yug7, думаю, научитесь я к Паскалю впервые притронулся только год назад)

Код:
Program Progression;
Uses CRT;

Const
  N = 1000000;

Type
  MyArray = Array [1..N] of Integer;

Var
  Save: MyArray;  // массив циклов (кол-во нулей)
  Val : MyArray;  // массив значений (ноль = 1, число = кол-во нулей до 1)

Function Check(count: Integer): Boolean;
Var
  i: Integer;
Begin
  Check:= True;
  For i:= 1 to count do
    If (Val[i] = 0) then Begin   //если хоть одна единица
      Check:= False;
      Exit;
    End;
End;

Procedure Step(count: Integer);  //процедура меняет значения переменных
Var
  i: Integer;

Begin
  For i:= 1 to count do Begin
    If (Val[i] = 0) then
      Val[i]:= Save[i]
    else
      Dec(Val[i]);
  End;
End;

Var
  F: text;
  d: Integer;     //последняя запись файла
  k: Integer;  //счетчик
  count: Integer; //кол-во активных переменных

Begin
  Assign(F, 'C:\f1.dat');
  Rewrite(F);
  Writeln(F, '3');
  Close(F);

  Val[1]:= 1; Save[1]:= 1;  //иначе говоря, а = 0
  Val[2]:= 0; Save[2]:= 2;  //              b = 1

  Writeln;
  Writeln('Press any key to stop the program...');

  K:= 0;
  count:= 2;

  REPEAT
    If Check(count) then begin    // если проверка удачна, значит все нули
      Reset(F);
      Repeat
        Readln(F, d);      // доходим до конца файла
      Until EoF(F);
      Close(F);
      d:= d + k;           // число + счетчик шагов

      Append(F);
      Writeln(F, d);       // пишем в файл
      Close(f);

      Inc(count);          // берем еще одну переменную
      Save[count]:= d - 1; // отнимаем 1 (новое кол-во нулей)
      Val[count] := 0;

      k:= 0;
    End
    Else Begin
      Step(count);         //если проверка не прошла, то двигаем значения по циклу
      Inc(k);
    End;
  UNTIL (count = N) or KeyPressed;
End.
gotherson вне форума   Ответить с цитированием
Старый 05.08.2011, 23:15   #55 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

тьфу, забыл, N ограничено 32767, если надо больше, во всём коде нужно менять тип Integer на LongInt..
gotherson вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 05.08.2011, 23:41   #56 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

за пол часа программа сгенерировала 43 670 записей в файл, т.е. нынешний порог 32767 осилит примерно за 15 минут. для справки)
gotherson вне форума   Ответить с цитированием
Старый 07.08.2011, 18:53   #57 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Program Progression;
Uses CRT;

Const
N = 1000000;

Type
MyArray = Array [1..N] of Integer;

Var
Save: MyArray; // массив циклов (кол-во нулей)
Val : MyArray; // массив значений (ноль = 1, число = кол-во нулей до 1)

Function Check(count: Integer): Boolean;
Var
i: Integer;
Begin
Check:= True;
For i:= 1 to count do
If (Val[i] = 0) then Begin //если хоть одна единица
Check:= False;
Exit;
End;
End;

Procedure Step(count: Integer); //процедура меняет значения переменных
Var
i: Integer;

Begin
For i:= 1 to count do Begin
If (Val[i] = 0) then
Val[i]:= Save[i]
else
Dec(Val[i]);
End;
End;

Var
F: text;
d: Integer; //последняя запись файла
k: Integer; //счетчик
count: Integer; //кол-во активных переменных

Begin
Assign(F, 'C:\f1.dat');
Rewrite(F);
Writeln(F, '3');
Close(F);

Val[1]:= 1; Save[1]:= 1; //иначе говоря, а = 0
Val[2]:= 0; Save[2]:= 2; // b = 1

Writeln;
Writeln('Press any key to stop the program...');

K:= 0;
count:= 2;

REPEAT
If Check(count) then begin // если проверка удачна, значит все нули
Reset(F);
Repeat
Readln(F, d); // доходим до конца файла
Until EoF(F);
Close(F);
d:= d + k; // число + счетчик шагов

Append(F);
Writeln(F, d); // пишем в файл
Close(f);

Inc(count); // берем еще одну переменную
Save[count]:= d - 1; // отнимаем 1 (новое кол-во нулей)
Val[count] := 0;

k:= 0;
End
Else Begin
Step(count); //если проверка не прошла, то двигаем значения по циклу
Inc(k);
End;
UNTIL (count = N) or KeyPressed;
End.



Вообще не работает.
Yug7 вне форума   Ответить с цитированием
Старый 07.08.2011, 19:11   #58 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Реально работает только этот листинг :


Program Progression;

Const
N = 1000;

Type
MyArray = Array [1..N] of Integer;

Var
Save: MyArray; // массив циклов (кол-во нулей)
Val : MyArray; // массив значений (ноль = 1, число = кол-во нулей до 1)

Function Check(count: Integer): Boolean;
Var
i: Integer;
Begin
Check:= True;
For i:= 1 to count do
If (Val[i] = 0) then Begin //если хоть одна единица
Check:= False;
Exit;
End;
End;

Procedure Step(count: Integer); //процедура меняет значения переменных
Var
i: Integer;

Begin
For i:= 1 to count do Begin
If (Val[i] = 0) then
Val[i]:= Save[i]
else
Dec(Val[i]);
End;
End;

Var
F: text;
d: Integer; //последняя запись файла
k, i: Integer; //счетчики
count: Integer; //кол-во активных переменных

Begin
Assign(F, 'C:\f1.dat');
Rewrite(F);
Writeln(F, '3');
Close(F);

Val[1]:= 1; Save[1]:= 1; //иначе говоря, а = 0
Val[2]:= 0; Save[2]:= 2; // b = 1

K:= 0;
count:= 2;

For i:= 1 to N do Begin
If Check(count) then begin // если проверка удачна, значит все нули
Reset(F);
Repeat
Readln(F, d); // доходим до конца файла
Until EoF(F);
Close(F);
d:= d + k; // число + счетчик шагов

Append(F);
Writeln(F, d); // пишем в файл
Close(f);

Inc(count); // берем еще одну переменную
Save[count]:= d - 1; // отнимаем 1 (новое кол-во нулей)
Val[count] := 0;

k:= 0;
End
Else Begin
Step(count); //если проверка не прошла, то двигаем значения по циклу
Inc(k);
End;
End;
End.





Вот только ОДНО "НО" :
Увеличить

Const
N = 1000;

Удается только до 1 000 000.
А надо это ограничение снять ВООБЩЕ.
Это ВОЗМОЖНО ?
Yug7 вне форума   Ответить с цитированием
Старый 07.08.2011, 19:16   #59 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Опять забыл сказать :

gotherson

за хорошо написанный листинг, о котором сказал ранеее,
БОЛЬШОЕ СПАСИБО !
Yug7 вне форума   Ответить с цитированием
Старый 07.08.2011, 19:21   #60 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

что значит урабть вообще?) в компьютере нет такого множества чисел как "от минус бесконечности до плюс бесконечности", если определённые типы у которых есть свои границы. я уже говорил в одном из предидущих сообщений, что можно заменить во всей программе тип Integer на LongInt это даст возможность установить N равное более дух миллиардов. может есть ещё способы, но вы уверены, что вам нужно ТАКОЕ количество чисел в файле?

Последний раз редактировалось gotherson; 07.08.2011 в 19:27
gotherson вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.