05.08.2011, 01:32 | #51 (permalink) |
Member
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
я думаю, для этого придётся заменить главный цикл For на цикл Repeat - Until .. в примере для приостановки используют Readln, но он нам не подходит, потому что приостанавливает программу, а нам нужно, чтобы она в это время числа в файл записывала надо будет использовать переменные KeyPressed и ReadKey из модуля CRT. другое дело, что пока пользователь будет нажимать на клавишу, программа побежит вперёд и вероятно достаточно быстро израсходует наш массив, который рассчитан всего на 1000 переменных |
05.08.2011, 21:47 | #53 (permalink) |
Member
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Вернул диск С (перед этим сменил на D - я там работаю ). Программа пошла, пока обкатаю на N=1000000.
Assign(F, 'D:\f1.dat');-это я изменил. Не факт,что в этом причина : я одновременно очень сильно увеличил N. Аппетит уменьшил. Отработает, буду помалу увеличивать. |
05.08.2011, 22:48 | #54 (permalink) |
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. |
05.08.2011, 23:15 | #55 (permalink) |
Member
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
тьфу, забыл, N ограничено 32767, если надо больше, во всём коде нужно менять тип Integer на LongInt..
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
07.08.2011, 18:53 | #57 (permalink) |
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. Вообще не работает. |
07.08.2011, 19:11 | #58 (permalink) |
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. А надо это ограничение снять ВООБЩЕ. Это ВОЗМОЖНО ? |
07.08.2011, 19:21 | #60 (permalink) |
Member
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
что значит урабть вообще?) в компьютере нет такого множества чисел как "от минус бесконечности до плюс бесконечности", если определённые типы у которых есть свои границы. я уже говорил в одном из предидущих сообщений, что можно заменить во всей программе тип Integer на LongInt это даст возможность установить N равное более дух миллиардов. может есть ещё способы, но вы уверены, что вам нужно ТАКОЕ количество чисел в файле?
Последний раз редактировалось gotherson; 07.08.2011 в 19:27 |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|