03.08.2011, 13:39 | #31 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
03.08.2011, 14:23 | #32 (permalink) |
Member
Регистрация: 01.08.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
это понятно, никто не в состоянии. я когда пытался сделать прогрмму, заметил несколько неточностей, которые не знал, как лучше реализовать, например, чему в начале равен счётчик k, какое значение принимают a и b?
|
03.08.2011, 23:23 | #33 (permalink) |
Member
Регистрация: 26.07.2011
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Vladimir_S
... 3. Открываем пустое окно в любом Windows-редакторе, напр. в Notepad. 4. Выгружаем в это окно содержимое буфера. ... Работает !!! Конечно лучше,сколько времени спасает. Спасибо ! |
03.08.2011, 23:44 | #34 (permalink) |
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 Ваш код глянуть можно ? |
04.08.2011, 12:49 | #35 (permalink) |
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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
04.08.2011, 17:31 | #36 (permalink) |
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 ) напишу. За все,что для меня сделали, еще раз спасибо. |
04.08.2011, 17:56 | #37 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
А это зависит от того, как Вы нумеруете массив. Дело в том, что, в отличие от Си, где стартовый номер жестко задан (0, если не ошибаюсь), в Паскале это оставлено на усмотрение программиста. Итак, Вы задаете последовательность:
0 1 0 1 0 1 0 1... Вопрос: как она пронумерована? Если так: 1, 2, 3, 4, 5 и т.д. - то правилен мой вариант, т.е. единицы стоят на четных позициях. А если так: 0, 1, 2, 3, 4 и т.д. - то Ваш; в этом случае, как видите, единицы занимают нечетные позиции. Я исходил из первого вида нумерации. |
04.08.2011, 18:04 | #38 (permalink) |
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 //если хоть одна единица* " Это куда она меня послала ? " |
04.08.2011, 20:12 | #39 (permalink) |
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 |
04.08.2011, 21:24 | #40 (permalink) |
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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|