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


Ответ
 
Опции темы Опции просмотра
Старый 03.08.2011, 13:39   #31 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от gotherson Посмотреть сообщение
возможно, вы с Владимиром не совсем поняли друг друга, и программа не соответствует задаче...
Скорее всего. Я делал программу, строго следуя описанному алгоритму (хотя изначальную его нелепость я выше отметил). А догадаться, "что НА САМОМ ДЕЛЕ имел в виду автор", я, увы, не в состоянии.
Vladimir_S вне форума   Ответить с цитированием
Старый 03.08.2011, 14:23   #32 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

это понятно, никто не в состоянии. я когда пытался сделать прогрмму, заметил несколько неточностей, которые не знал, как лучше реализовать, например, чему в начале равен счётчик k, какое значение принимают a и b?
gotherson вне форума   Ответить с цитированием
Старый 03.08.2011, 23:23   #33 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Vladimir_S
...
3. Открываем пустое окно в любом Windows-редакторе, напр. в Notepad.
4. Выгружаем в это окно содержимое буфера.
...
Работает !!! Конечно лучше,сколько времени спасает. Спасибо !
Yug7 вне форума   Ответить с цитированием
Старый 03.08.2011, 23:44   #34 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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
Ваш код глянуть можно ?
Yug7 вне форума   Ответить с цитированием
Старый 04.08.2011, 12:49   #35 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 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]:= 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.
gotherson вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 04.08.2011, 17:31   #36 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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 ) напишу. За все,что для меня сделали, еще раз спасибо.
Yug7 вне форума   Ответить с цитированием
Старый 04.08.2011, 17:56   #37 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Yug7 Посмотреть сообщение
по моей задумке должно быть :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 и т.д. - то Ваш; в этом случае, как видите, единицы занимают нечетные позиции.
Я исходил из первого вида нумерации.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.08.2011, 18:04   #38 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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[i] = 0) then Begin //если хоть одна единица*
" Это куда она меня послала ? "
Yug7 вне форума   Ответить с цитированием
Старый 04.08.2011, 20:12   #39 (permalink)
Yug7
Member
 
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Опять я. Проверил : алгоритм абсолютно ПРАВИЛЬНЫЙ. Прошел от руки на бумаге до 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) (цикл окончен)
...

Последний раз редактировалось Yug7; 04.08.2011 в 20:20
Yug7 вне форума   Ответить с цитированием
Старый 04.08.2011, 21:24   #40 (permalink)
gotherson
Member
 
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 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.
gotherson вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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