• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Создать файл для результатов работы программы

  • Автор темы Автор темы Yug7
  • Дата начала Дата начала
а то, то вы исправили - это вылет за границу массива. у меня нумерация с единицы [1..N], а командой "For i:= 0 to count do" вы пытаетесь обратиться к нулевому элементу массива.
 
А если с 1 начинать , а не с 0 - совсем другой алгоритм реализуется
Обязательно надо, чтобы а начиналась с 0, а b начиналась с 1.
 
Последнее редактирование:
А как это лучше откорректировать,чем я сделал ?
 
в моём коде они так и начинаются. но если очень хочется, можно поменять нумерацию массива на, например, [0..N-1], тогда будет работать команда "For i:= 0 to count do", но в моём варианте реализации нет разницы.
 
а Вы посмотрели мой исправленный код на предидущей странице? выходной файл Вас не устраивает?

P.S. никак не пойму, как отредактировать сообщение, приходится новое писать...
 
Иду смотреть, честно не заметил. Склероз,не иначе.
 
Смотел, рад до некуда, все отлично. Сейчас набираю еще кое-что. Если не трудно, зайдите еще раз.
 
рад, что смог Вам помочь) простите, куда нужно зайти?
 
gotherson
Интересно : я когда-нибудь научусь вот так же легко,как вы программировать ? Есть вопрос :

1. Приостановка выполнения программы на время, определяемое пользователем
Простейшим решением данной задачи является запись в соответствующем месте процедуры Readln (оператор Read использовать нельзя) или функции ReadKey.
Пример использования процедуры Readln.
PROGRAM DemoReadln;
USES Crt;
BEGIN
ClrScr;
Writeln ('Выполнение программы приостановлено.');
Writeln;
Write ('Для продолжения нажмите клавишу Enter ....');
Readln;
Writeln;
Write ('Выполнение программы продолжается. Ждите 5 секунд. ');
Delay (5000);
END.
Для продолжения выполнения программы достаточно нажать клавишу Enter. Недостатком данного решения является обязательное нажатие клавиши Enter, а не любой клавиши, что увеличивает вероятность ошибочного действия пользователя и в ряде случаев приводит к непредсказуемым результатам.

Если в Вашем коде убрать ограничения по N=1000. А вставить вместо- вышесказанное. Так можно сделать ? И в каком месте Вашего кода лучше сделать вставку ?
 
Или здесь что-то не так ? Я это не сам программировал. Нашел готовое решение. Это будет работать ?
И еще я не совсем понял,как реализуется начало приостановки ? Как ввести с клавиатуры : " Приостановка выполнения программы " ?
Enter - это понятно.
 
да, конечно можно.

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

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

другое дело, что пока пользователь будет нажимать на клавишу, программа побежит вперёд и вероятно достаточно быстро израсходует наш массив, который рассчитан всего на 1000 переменных
 
Увеличил размер массива, компилятору не нравится строка
Assign(F, 'D:\f1.dat');
Красная строка : " Непредвиденное исключение "
 
Вернул диск С (перед этим сменил на D - я там работаю ). Программа пошла, пока обкатаю на N=1000000.

Assign(F, 'D:\f1.dat');-это я изменил. Не факт,что в этом причина : я
одновременно очень сильно увеличил N. Аппетит уменьшил. Отработает, буду помалу увеличивать.
 
в коде практически ничего не менял (выделено).

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

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

Код:
Program Progression;
[B]Uses CRT;[/B]

Const
  N = [B]1000000[/B];

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;
  [B]Writeln('Press any key to stop the program...');[/B]

  K:= 0;
  count:= 2;

  [B]REPEAT[/B]
    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;
  [B]UNTIL (count = N) or KeyPressed;[/B]
End.
 
тьфу, забыл, N ограничено 32767, если надо больше, во всём коде нужно менять тип Integer на LongInt..
 
за пол часа программа сгенерировала 43 670 записей в файл, т.е. нынешний порог 32767 осилит примерно за 15 минут. для справки)
 
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 = 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 = 0) then
Val:= Save
else
Dec(Val);
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.



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


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 = 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 = 0) then
Val:= Save
else
Dec(Val);
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.
А надо это ограничение снять ВООБЩЕ.
Это ВОЗМОЖНО ?
 
Опять забыл сказать :

gotherson

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