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

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

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

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

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

  • Автор темы Автор темы Yug7
  • Дата начала Дата начала
Program
Source compiled 50 lines
Code size 3072 bytes
Data size 1194 bytes
Stack size 16384 bytes
Min heap size 0 bytes
Max heap size 655360 bytes
Real
DOS: 57 K
IDE : 10 K
Program : 0 K
Free : 562 K
Protekted
IDE : 568 K
Free : 15185 K

Status : PROGRAMZ.PAS terminated,
exit code 0
 
Компиляция прошла ? А как программу запустить ? Там все по-английски.
 
Пробовал я copy-paste. Turbo Pfscal не реагирует. Только когда в его окне что-то копируешь, тогда пожалуйста,и вставит,что скопировал.
А компиляцию,я так понимаю, он таки сделал. А как теперь посмотреть на результаты работы. Или еще что -то надо сделать ?
 
если программа успешно проработала, думаю результаты можно будет посмотреть в файлах вывода, у Vladimir_S это
D:\f1.dat
D:\f2.dat
 
Совершенно верно, есть такие файлы

D:\f1.dat
D:\f2.dat

оба читаются, но результаты совсем не те, что ожидались :
3
5
9
11
15
17
21
23 ... Это D:\f1.dat

1
4
8
10
14
16
20 ... Это D:\f2.dat
 

да. там кажись другой буфер обмена используется. хотя если честно хз. но чтоб скопировать надо открыть исходник проги в ТЕКСТОВОМ редакторе и туда скопировать код потом сохранить и все ок.
можно просто скопировать в файл например progrm.txt и переименовать в progam.pas
 
возможно, вы с Владимиром не совсем поняли друг друга, и программа не соответствует задаче... а какие результаты вы ожидали?
 
извиняюсь за даблпост, попробовал написать код.
у меня выходной файл: 3, 4, 8, 14, 26, 50... последовательность примерно такая:
Код:
k   a b
0   1 1     c (кол-во нулей: 3-1)
1   0 0 ->  1 (запись в файл 3+1)
1*  1 0     0
2   0 1     0
3   1 0     1     d (кол-во нулей: 4-1) 
4   0 0     0 ->  1 (запись в файл 4+4)
1*  1 1     0     0
2   0 0     1     0
...
 
Пробовал я copy-paste. Turbo Pfscal не реагирует. Только когда в его окне что-то копируешь, тогда пожалуйста,и вставит,что скопировал.
Объясняю, уже не помню, в который раз. Если Вы хотите скопировать листинг, выложенный в Windows-окне, в DOS Турбо-среду, то делается это так:
1. Выделяем текст.
2. Копируем в буфер.
3. Открываем пустое окно в любом Windows-редакторе, напр. в Notepad.
4. Выгружаем в это окно содержимое буфера.
5. Сохраняем в виде файла lalala.pas.
6. Открываем вновь созданный файл в Турбо-среде.
Возня, конечно, но всё лучше, чем вручную набивать.
 
возможно, вы с Владимиром не совсем поняли друг друга, и программа не соответствует задаче...
Скорее всего. Я делал программу, строго следуя описанному алгоритму (хотя изначальную его нелепость я выше отметил). А догадаться, "что НА САМОМ ДЕЛЕ имел в виду автор", я, увы, не в состоянии.
 
это понятно, никто не в состоянии. я когда пытался сделать прогрмму, заметил несколько неточностей, которые не знал, как лучше реализовать, например, чему в начале равен счётчик k, какое значение принимают a и b?
 
Vladimir_S
...
3. Открываем пустое окно в любом Windows-редакторе, напр. в Notepad.
4. Выгружаем в это окно содержимое буфера.
...
Работает !!! Конечно лучше,сколько времени спасает. Спасибо !
 
gotherson
извиняюсь за даблпост, попробовал написать код.
у меня выходной файл: 3, 4, 8, 14, 26, 50... последовательность примерно такая:
Код:

k a b
0 1 1 c (кол-во нулей: 3-1)
1 0 0 -> 1 (запись в файл 3+1)
1* 1 0 0
2 0 1 0
3 1 0 1 d (кол-во нулей: 4-1)
4 0 0 0 -> 1 (запись в файл 4+4)
1* 1 1 0 0
2 0 0 1 0
...

Yug7
Ваш код глянуть можно ?
 
конечно.

можно придумать другое место для хранения переменных, но я для простоты вляз массив..

Код:
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]:= 0; Save[1]:= 1;
  Val[2]:= 0; Save[2]:= 2;

  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);
      Inc(count);          // новая переменная
      Save[count]:= d - 1; // её цикл
      Val[count] := 0;

      d:= d + k;           // последняя запись + счетчик
      k:= 0;               //
                           //
      Append(F);           //
      Writeln(F, d);       // записывается в конец
      Close(F);
    End
    Else Begin
      Step(count);         // если проверка не прошла, то меняем значения
      Inc(k);
    End;
  End;
End.
 
Vladimir_S
Цитата:
Сообщение от gotherson Посмотреть сообщение
возможно, вы с Владимиром не совсем поняли друг друга, и программа не соответствует задаче...
Скорее всего. Я делал программу, строго следуя описанному алгоритму (хотя изначальную его нелепость я выше отметил). А догадаться, "что НА САМОМ ДЕЛЕ имел в виду автор", я, увы, не в состоянии.

Так и есть, и не совсем поняли друг друга,а может и алгоритм не работает:
CONST
N=1000;
VAR
f1,f2:TEXT;
i,k,d:Integer;

Function a(Ia:Integer):Integer;
begin
If (Ia mod 2)=0 then a:=1 else a:=0;
end;
...
по моей задумке должно быть :then a:=0 else a:=1;
Исправил, теперь в файле f2.dat первые 9 чисел,как хотелось :все простые, сбой пошел с 10 числа. Буду перепроверять алгоритм.
Зайдите при случае. Если исправлю ( или удостоверюсь,что он true ) напишу. За все,что для меня сделали, еще раз спасибо.
 
по моей задумке должно быть :then a:=0 else a:=1;
А это зависит от того, как Вы нумеруете массив. Дело в том, что, в отличие от Си, где стартовый номер жестко задан (0, если не ошибаюсь), в Паскале это оставлено на усмотрение программиста. Итак, Вы задаете последовательность:
0 1 0 1 0 1 0 1...
Вопрос: как она пронумерована?
Если так:
1, 2, 3, 4, 5 и т.д. - то правилен мой вариант, т.е. единицы стоят на четных позициях. А если так:
0, 1, 2, 3, 4 и т.д. - то Ваш; в этом случае, как видите, единицы занимают нечетные позиции.
Я исходил из первого вида нумерации.
 
gotherson
k a b
0 1 1 c (кол-во нулей: 3-1)
1 0 0 -> 1 (запись в файл 3+1)
1* 1 0 0
2 0 1 0
3 1 0 1 d (кол-во нулей: 4-1)
4 0 0 0 -> 1 (запись в файл 4+4)
1* 1 1 0 0
2 0 0 1 0
...
я имел в виду,что
k a b
0 0 1
1 1 0
2 0 0 -с=3+2+5 ( кол-во нулей 5-1=4 ) (цикл окончен)
0 0 0 1 (начало второго цикла)
1 1 1 0
2 0 0 0 -d=5+2=7 (кол-во нулей 7-1=6) (цикл окончен)
0 0 0 0 1 (начало третьего цикла)
1 1 0 0 0
2 0 1 0 0
3 1 0 1 0
4 0 0 0 0 -g=7+4=11 (кол-во нулей 11-1=10) (цикл окончен)
...

Я в Вашем коде изменил объявление первой переменной :
...
Var
i: Integer;
Begin
Check:= True;
For i:= 1 to count do
...
на следующее For i:= 0 to count do
компиляция прошла, а при запуске программы в Pascal ABC :
"(19) : Ошибка времени выполнения: Индекс находился вне границ массива."
и выделено красным :
If (Val = 0) then Begin //если хоть одна единица*
" Это куда она меня послала ? "
 
Опять я. Проверил : алгоритм абсолютно ПРАВИЛЬНЫЙ. Прошел от руки на бумаге до 53 и ни одного сбоя. Значит я плохо объяснил, можно еще попробую : в начале переменных - две :
а ( непрерывно периодически принимает значения "0" или "1",цикл такой : =0,=1,=0,=1,=0 ...) , b ( непрерывно периодически принимает значения "1" или "0",цикл такой : =1,=0,=0,=1,=0,=0,=1 ...).
Программа работает циклами : оценивает первую пару,если хоть одна переменная=1,то делает шаг -к следующим значениям переменных и так до тех пор,пока обе переменные =0.тогда исходное число файла - 3 + k (счетчик шагов)= второе число в файл, k=0, вводится третья периодическая переменная (число нулей между единицами =3+k-1). Цикл окончен. Новый цикл уже с тремя переменными. Алгоритм тот же : шагать,пока все переменные=0. Тогда последняя запись в файле +счетчик и записать в файл очередной записью. k=0, вводится еще одна переменная с кол-вом нулей между единицами : последняя запись в файле -1. Цикл окончен. Начинается новый ...
На бумаге это выглядит так :
k a b
0 0 1
1 1 0
2 0 0 -с=3+2=5 ( кол-во нулей 5-1=4 ) (цикл окончен)
0 0 0 1 (начало второго цикла)
1 1 1 0
2 0 0 0 -d=5+2=7 (кол-во нулей 7-1=6) (цикл окончен)
0 0 0 0 1 (начало третьего цикла)
1 1 0 0 0
2 0 1 0 0
3 1 0 1 0
4 0 0 0 0 -g=7+4=11 (кол-во нулей 11-1=10) (цикл окончен)
...
 
Последнее редактирование:
а, Вы имели в виду, что а начинает цикл с нуля, а b - с единицы.
и количество нулей берётся с самой последней записи (которую, собственно, только что посчитали). исправил.

выходной файл: 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53...

Код:
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.
 
Назад
Сверху