Консультация № 175215
13.12.2009, 19:31
0.00 руб.
0 11 1
Добрый день,уважаемые эксперты,я некоторое время назад отправлял задачку на массивы с обработкой серий,помогите пожалуйста
Даны натуральное число n и целочисленный массив из n чисел. Подсчитать количество серий из чисел Фибоначчи (первое и второе числа равны 1, а каждое следующее число равно сумме двух предыдущих) и выдать эти серии
p.s. препод сказал что серия может определяться из одного элемента,который по идее может состоять в числах Фибоначчи.
в приложении прога,там при выполнении она считает только одну серию и то только первую, например если вводишь 1,1,2 то прога считает что эта серия ,а если вводишь 3,5,8 то нет,помогите, прошу вас!!!!!

Приложение:

program Fib;
const
MaxSize = 100;

type
TVector = array[1..MaxSize] of LongInt;

var
a: TVector;
i: integer;
j: integer;
first: integer;
len: integer; { длина текущей серии }
count: integer; { число серий }
n: integer; { используемый размер массива }
begin
repeat

write('n=');
readln(n)
until (n>0) and (n<=MaxSize);

for i:= 1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;

len := 0;
count := 0;
if (n>2) then { массив менее 3х элементов не содержит серий }
begin
if (a[1]=1) and (a[2]=1) then
begin
len := 2;
first := 1;
end;
for i:= 3 to n do
if (a[i]=1) then
begin
if (len=1) then
len := 2
else
begin
len := 1;
first := i;
end
end
else if (a[i]=a[i-1]+a[i-2]) and (len>=2) then
{ проверка, начиная с 3-го элемента }
begin
inc(len);
if (len=3) then { начало серии }
begin
inc(count);
writeln;
writeln('Серия номер ',count, '->');
write(a[i-2],';',a[i-1],';');
end;
write(a[i],';');
end
else
begin
if len>=3 then
writeln;
len := 0;
end;
end;

writeln;
writeln('В массиве');
for i:= 1 to n do
write(a[i],';');
writeln;
writeln('Число серий Фибоначчи =', count);
readln;

end.

Обсуждение

Неизвестный
14.12.2009, 08:48
общий
angel.nero:
Доброе утро! Вопрос № 174651: • Ответ от 1 декабря. № 257151.
Здравствуйте, angel.nero. Серией считаем самую длинную из возможных, длина не менее 3х элементов. Например, 1,1,2,3,1,1,2,3,5 содержит 2 серии (поскольку иное не указано).
Опять же, поскольку Вы не ответили на вопрос Boriss, принято решение рассматривать серию, начиная с 1,1,2,3,5... Уточните, пожалуйста, сколько серий в следующей строке: 1,2,3,4,5,8?

Неизвестный
14.12.2009, 22:04
общий
ситуация заключается в следующем:препод сказал что серия может определяться из одного элемента,который по идее может состоять в числах Фибоначчи.
в приложении прога,там при выполнении она считает только одну серию и то только первую, например если вводишь 1,1,2 то прога считает что эта серия ,а если вводишь 3,5,8 то нет,помогите, прошу вас!!!!!Думаю по идее должно быть в результате: если вводишь 1,1,2 - программа выдает что это серия, потом если вводим например 3,5,8 то это тоже серия,а сама прога не выдает этого,также если мы ввели 1,1,2,3,5,8 - то должна прога сказать по идее что содержится 2 серии первая: 1,1,2, вторая:3,5,8
Неизвестный
15.12.2009, 08:30
общий
angel.nero:
Добрый день! В Вашем приложении моя программаВечером будет ответ на Ваш вопрос.
Неизвестный
15.12.2009, 12:50
общий
leonid59:
спасибо!Буду ждать
давно
Академик
320937
2216
15.12.2009, 14:16
общий
это ответ
Здравствуйте, angel.nero. Текст программы в приложении. Ответ моделирует ручную работу подсчета серий Фибоначчи. Сначала создаем глобальный вектор чисел Фибоначчи, а затем выясняем, во-первых, нет ли очередного испытываемого числа в этом векторе, а, если есть, продолжает ли это число текущую серию (его индекс на единицу больше индекса предыдущего числа) или начинает новую. Если что-то неясно - спрашивайте.


Приложение:
program NewFibo;
uses
crt;
const
MaxSize=100; { максимальный размер массива }
type
_int = integer;
{ для того, чтобы можно было менять int - для отладки,
longint для показа }
TPtr = ^_int;
TVector = array[1..MaxSize] of _int;
var
i: integer;
v, vFibo: TVector;
MaxFiboIndex: integer; { максимольно возможный индекс Фибоначчи }
size : integer; { текущий (используемый) размер массива }
prev, curr: integer; { предыдущий и текущий индексы по массиву Фибоначчи }
SeriesCount: integer; { счетчик серий }
procedure GenFibo(p: TPtr; size: integer; var MaxIndex: integer);
{ формирование массива Фибоначчи }
var
f1, f2, NextFibo: _int;
begin
f1 := 1;
f2 := 1;
p^:=f1;
inc(p);
p^:=f2;
MaxIndex := 1;
while ( (f1>0) and (f2>0) and (f1+f2>0) ) do
begin
inc(p);
p^:= f1+f2;
f1:=f2;
f2:=p^;
inc(MaxIndex);
end;
end; { GenFibo }

function IndexOf(p: TPtr; size: integer; elem: _int): integer;
{ поиск в массиве, возвращает индекс элемента, начиная с 0, либо -1, если не найдено }
var
i: integer;
begin
i:= 0;
IndexOf := -1;
while ( (i<size) and (p^ <> elem) ) do
begin
inc(p);
inc(i);
end;
if p^= elem then
IndexOf := i
end; { IndexOf }

begin
ClrScr;

{ создание глобального массива чисел Фибоначчи }
GenFibo(@vFibo, MaxSize, MaxFiboIndex);
writeln('Вектор Фибоначчи');
for i:= 1 to MaxFiboIndex do
write(vFibo[i],';');
writeln;
writeln;

randomize;
{ создание массива чисел }

{ используемый массив }
size := 20;

{ size := random(MaxSize-1); }
for i:= 1 to size do
v[i] := random(10);

{ печать массива }
writeln('Данный массив');
for i:= 1 to size do
write(v[i],';');
writeln;
readln;

prev := -1;
SeriesCount := 0;
for i:= 1 to size do
begin
curr := IndexOf(@vFibo, MaxFiboIndex, v[i]);
if curr <> -1 then
begin
if (prev=-1) or (curr-prev<>1) then
{ новая серия }
begin
inc(SeriesCount);
writeln;
write('Серия ', SeriesCount, ' => ');
end;
write(v[i],';');
end;
prev := curr;
end;

writeln;
writeln('Всего ', SeriesCount, ' серий' );
readln;
end.
Неизвестный
15.12.2009, 23:25
общий
при запуске проги мне выдает:нет перегруженной подпрограммы с такими типами параметров
Неизвестный
16.12.2009, 08:23
общий
angel.nero:
Доброе утро! Вопросы
1. Из какой среды Вы ее запускаете? Программа написана и тестировалась в Turbo Pascal.
2. На какую процедуру среда "ругается"?
3. Возвращаюсь к вопросам о сериях. Ваши комментарии в минифоруме ответа 174651 противоречат Вашим же комментариям в минифоруме текущего вопроса. Сформулируйте непротиворечивую и недвусмысленную постановку задачи и приведите больше примеров
Неизвестный
24.12.2009, 00:49
общий
у нас местная в универе среда,pascal abc- так называется, говорит что нет перегруженной подпрограммы с такими типами параметров ругается на строчку inc(p) ( f1 := 1;
f2 := 1;
p^:=f1;
inc(p);
p^:=f2;)
по сериям спросил у препода,он сказал что он хочет видеть в конце,если мы вводим например 1,1,2,3,5,8,10,11 то в итоге она должна выдать, 1,1,2 - серия,1,2,3- серия, 2,3,5-серия,3,5,8-серия, количество в этом примере - 4 серии (это к примеру)
Неизвестный
24.12.2009, 08:00
общий
angel.nero:
Доброе утро! 1. Вместо inc(p) тогда просто пишите p:= p+1;
2. В постановке этого вопроса есть и в мини-форуме три взаимопротиворечащие фразы
p.s. препод сказал что серия может определяться из одного элемента,который по идее может состоять в числах Фибоначчи.

(именно на этот вопрос отвечает программа)
если мы ввели 1,1,2,3,5,8 - то должна прога сказать по идее что содержится 2 серии первая: 1,1,2, вторая:3,5,8

по сериям спросил у препода,он сказал что он хочет видеть в конце,если мы вводим например 1,1,2,3,5,8,10,11 то в итоге она должна выдать, 1,1,2 - серия,1,2,3- серия, 2,3,5-серия,3,5,8-серия, количество в этом примере - 4 серии (это к примеру)

Думаю, есть смысл сформулировать отдельный вопрос по Вашему сегодняшнему требованию.
PS. Если бы Вы сразу тогда ответили на простой вопрос BorisS...
Неизвестный
29.12.2009, 20:23
общий
lamed:
узнал,про серии,вообщем: нужно чтобы если пользователь вводит например: 1,1,2,3,5,8 то выдавало серии 1,1,2 1,2,3 2,3,5 3,5,8 (т.е. мы смотрим один элемент,если он принадлежит серии то мы его учитываем),если нет серий то выдаем сообщения,перемешать элементы нельзя
Неизвестный
30.12.2009, 10:07
общий
angel.nero:
Доброе утро! Полагаю, всех кроликов мы с Вами (вслед за Леонардо Пизанским) уже пересчитали :)
Код:
program NewFibo;
uses
crt;
const
MaxSize=100; { максимальный размер массива }
type
_int = integer;
{ для того, чтобы можно было менять int - для отладки,
longint для показа }
TPtr = ^_int;
TVector = array[1..MaxSize] of _int;
var
i: integer;
v, vFibo: TVector;
MaxFiboIndex: integer; { максимольно возможный индекс Фибоначчи }
size : integer; { текущий (используемый) размер массива }
first, second, curr: integer; { предыдущий и текущий индексы по массиву Фибоначчи }
SeriesCount: integer; { счетчик серий }
procedure GenFibo(p: TPtr; size: integer; var MaxIndex: integer);
{ формирование массива Фибоначчи }
var
f1, f2, NextFibo: _int;
begin
f1 := 1;
f2 := 1;
p^:=f1;
inc(p);
p^:=f2;
MaxIndex := 1;
while ( (f1>0) and (f2>0) and (f1+f2>0) ) do
begin
inc(p);
p^:= f1+f2;
f1:=f2;
f2:=p^;
inc(MaxIndex);
end;
end; { GenFibo }

function IndexOf(p: TPtr; size: integer; elem: _int): integer;
{ поиск в массиве, возвращает индекс элемента, начиная с 0, либо -1, если не найдено }
var
i: integer;
begin
i:= 0;
IndexOf := -1;
while ( (i<size) and (p^ <> elem) ) do
begin
inc(p);
inc(i);
end;
if p^= elem then
IndexOf := i
end; { IndexOf }

begin
ClrScr;

{ создание глобального массива чисел Фибоначчи }
GenFibo(@vFibo, MaxSize, MaxFiboIndex);
writeln('Вектор Фибоначчи');
for i:= 1 to MaxFiboIndex do
write(vFibo[i],';');
writeln;
writeln;

randomize;
{ создание массива чисел }

{ используемый массив }
size := 20;

{ size := random(MaxSize-1); }
for i:= 1 to size do
v[i] := random(10);
for i:= 1 to 5 do
v[i] := vFibo[i];

for i:= 11 to 15 do
v[i] := vFibo[i-10];

{ печать массива }
writeln('Данный массив');
for i:= 1 to size do
write(v[i],';');
writeln;
readln;

first := -1;
second := -1;
SeriesCount := 0;
for i:= 1 to size do
begin
if (i>=3) and (first<>-1) and (second=first+1) and (v[i]=v[i-1]+v[i-2]) then
begin
{ серия }
curr := second+1;
inc(SeriesCount);
writeln('(', v[i-2], ',' , v[i-1], ',', v[i], ')');
end
else if (second=0) and (v[i]=1) then
curr := 1
else
curr := IndexOf(@vFibo, MaxFiboIndex, v[i]);
first := second;
second := curr;
end;

writeln;
writeln('Всего ', SeriesCount, ' серий' );
readln;
end.

Форма ответа