Помощь - Поиск - Пользователи - Календарь
Полная версия: задача на поиск среди чисел первого положительного
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
blum.gif
пользователь вводит последовательнось целых чисел, признак окончания ввода - 0. Найти первый положительный член, равный сумме трех предыдущих.
Malice
Цитата(18192123 @ 22.10.2006 19:52) *

blum.gif
пользователь вводит последовательнось целых чисел, признак окончания ввода - 0. Найти первый положительный член, равный сумме трех предыдущих.

Что не получается ? Задача же простая.. Цикл через Repeat, выход если 0 или совпадение условия. Предыдущие значения запоминать в 3-х переменных. Если выход из repeat-a был по нулю, то решений небыло, иначе еще 1 repeat для ввода следующих чисел, без анализа. Условие выхода - 0, после чего вывод результатов smile.gif
Bokul
Цитата
Если выход из repeat-a был по нулю, то решений небыло

А если последовательность будет такой: -5,3,2,0 ? Или 0 не есть положительным членом?
Malice
Цитата(Bokul @ 22.10.2006 20:44) *

А если последовательность будет такой: -5,3,2,0 ? Или 0 не есть положительным членом?

Хитрый ты smile.gif Если такой случай тоже нужен, то эту фразу читать так:
"Если выход из repeat-a был не по условию, то .."
18192123
Цитата(Malice @ 22.10.2006 20:30) *

Что не получается ? Задача же простая.. Цикл через Repeat, выход если 0 или совпадение условия. Предыдущие значения запоминать в 3-х переменных. Если выход из repeat-a был по нулю, то решений небыло, иначе еще 1 repeat для ввода следующих чисел, без анализа. Условие выхода - 0, после чего вывод результатов smile.gif

а как насчет более подробного ответа!? nea.gif
volvo
Цитата
а как насчет более подробного ответа!?
А как насчет САМОЙ попробовать хоть что-то сделать?
18192123
Цитата(volvo @ 22.10.2006 21:02) *

А как насчет САМОЙ попробовать хоть что-то сделать?

вопрос был адресован не тебе!!!!!!!!!! nea.gif
volvo
А мой - к тебе ...
Внимательно посмотри на картинку: Нажмите для просмотра прикрепленного файла

Видишь ключевое слово? Вместе, а не "за Вас"... Тебе уже подсказали, теперь твоя очередь.

А вот хамить не надо. Чревато...
18192123
Цитата(Malice @ 22.10.2006 20:30) *

Что не получается ? Задача же простая.. Цикл через Repeat, выход если 0 или совпадение условия. Предыдущие значения запоминать в 3-х переменных. Если выход из repeat-a был по нулю, то решений небыло, иначе еще 1 repeat для ввода следующих чисел, без анализа. Условие выхода - 0, после чего вывод результатов smile.gif

я не понимаю, как привязать к программе эти три переменные
Malice
Что-то типа этого:
Код

x1:=x2; x2:=x3; x3:=x;
readln (x);

т.е. происходит постоянный сдвиг и в х1, х2,х3 остаются 3 предыдущие переменные.
18192123
Цитата(Malice @ 23.10.2006 17:13) *

Что-то типа этого:
Код

x1:=x2; x2:=x3; x3:=x;
readln (x);

т.е. происходит постоянный сдвиг и в х1, х2,х3 остаются 3 предыдущие переменные.

а как с этими переменными соотносится первый положительный элемент?
мисс_граффити
если он равен их сумме и положителен - то он подходит
18192123
Цитата(мисс_граффити @ 23.10.2006 17:47) *

если он равен их сумме и положителен - то он подходит

а сколько переменных мне вводить, если для ввода задаю одну, то программа дальше ввода не идет
мисс_граффити
приводи код - я не могу вот так сказать, почему она не идет.
сомневаюсь, что дело в кол-ве переменных.
18192123
Цитата(мисс_граффити @ 23.10.2006 18:59) *

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

посмотри прогу, что-то тут не то, выдает первый элемент последовательности
Нажмите для просмотра прикрепленного файла
Reflex
нашла ошибку sorry
мисс_граффити
мм....?
Reflex и 18192123 - одно лицо?
Reflex
нет ... я вывесила решение задачи, а потом в нем нашла ошибку.

Код
x1:=x2;
x2:=x3;
x3:=x;
s:=x1+x2+x3;
if ((x3>0)and(s=x3)) then writeln ('pervy poloshitelniy element naiden=',x3);

этот код говорит если x2+x3=0 и x>0 то выведи x

впринципе могу решить, но если на это даст добро Вольво, а то он похоже против того, что-бы тебе полностью решили эту задачу. А если модератор так думает, то значит на это есть какие-то причины.
Reflex
на то что ты написала Volvo ругатьси еще больше будет, а код вот:
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;
const
nn = 100;
type
arr = array [1..nn] of integer;
var
a : arr;
n : integer;

function check(num : integer) : boolean;
var j, i : integer;
begin
check:=false;
if a[num]<0 then exit;
for i:= 1 to num - 1 do
for j:= 1 to num - 1 do
if (i<>j) and (a[num]=a[i]+a[j]) then begin
check:=true;
exit;
end;
end;

procedure read_data;
var temp:integer;
begin
n:=0;
read(temp);
while temp<>0 do begin
inc(n);
a[n]:=temp;
read(temp);
end;
end;

function find: integer;
var i : integer;
begin
find := 0;
for i:= 3 to n do
if check(i) then begin
find := i;
exit
end;
end;


begin
read_data;
write(find);
readln;
readln;
end.
Malice
Функция check здесь что-то другое проверяет.
Reflex
она проверяет является ли число суммой двух предыдущих, я надеюсь, что автор этой темы догадаетьси как это исправить в сумму трех предыдущих.
мисс_граффити
а по-моему, она проверяет не совсем то....
ты же проходишь от начала массива, то есть речь не обязательно о последних 2.
klem4
18192123, Сколько можно мусолить этот маразм ?! Функция, которая ищет нужный по твоему заданию элемент, если такого элемента нет, ф-я возвращает - 1.

function Find(const v: PVector; n: Integer): Integer;
var
s, i, j: Integer;
flag: Boolean;
begin
i := 4;
flag := false;
while (i <= n) and not(flag) do begin
if v^[i] > 0 then begin
j := i - 3;
s := 0;
while (j < i) and (s <= v^[i]) do begin
s := s + v^[j];
inc(j);
end;
flag := (s = v^[i]);
end;
if not(flag) then inc(i);
end;
if flag then Find := i else Find := - 1;
end;
18192123
Цитата(klem4 @ 24.10.2006 20:01)
18192123, Сколько можно мусолить этот маразм ?! Функция, которая ищет нужный по твоему заданию элемент, если такого элемента нет, ф-я возвращает - 1.

мне такой способ не подходит!
в этом задании мне нельзя использовать массивы, в основе решения должен лежать цикл.
наверняка, в этом задании все гораздо проще.
klem4
uses crt;

var
x, x1, x2, x3, s : Integer;
count: Integer;
find: Boolean;

begin
clrscr;
count := 0;
find := false;
repeat
write('x = '); readln(x);
inc(count);
case count of
1: x1 := x;
2: x2 := x;
3: x3 := x;
else
if (x > 0) and (x1 + x2 + x3 = x) then find := true
else begin
x1 := x2;
x2 := x3;
x3 := x;
end;
end;
until (x = 0) or (find);

if find then writeln('Find')
else writeln('Not find');

readln;
end.


?
Malice
klem4, "Найти первый положительный член", раз первый, значит могли бы быть и другие, значит прерывать ввод по find не надо. 0 тоже положительное число.
klem4
Malice, а как же быть с
Цитата
пользователь вводит последовательнось целых чисел, признак окончания ввода - 0.


?

Если делать выход по find, может возникнуть зацикленность, так как искомого числа до того как введен 0 может просто не быть ...

Если уточнить условие так что среди введенных чисел _точно_ есть искомое, то это меняет дело.
Malice
Цитата(klem4 @ 25.10.2006 12:41) *

Если делать выход по find, может возникнуть зацикленность, так как искомого числа до того как введен 0 может просто не быть ...

А ты говоришь "Маразм". smile.gif По find выходите _не надо_, об этом я и написал.
klem4
Все, понял smile.gif

uses crt;
var
x, x1, x2, x3, s : Integer;
count: Integer;
find: Integer;

begin
clrscr;
count := 0;
find := -maxint;
repeat
write('x = '); readln(x);
inc(count);
case count of
1: x1 := x;
2: x2 := x;
3: x3 := x;
else
if (x > 0) and (x1 + x2 + x3 = x) and (find = -maxint) then find := x
else begin
x1 := x2;
x2 := x3;
x3 := x;
end;
end;
until (x = 0);

if find <> -maxint then writeln('Find = ', Find)
else writeln('Not find');

readln;
end.
18192123
Цитата(klem4 @ 25.10.2006 13:43)
Все, понял smile.gif

скажи пожалуйста, что такое find := -maxint в твоей программе
и что такое count?
мисс_граффити
0 - это не положительное число! и не отрицательное.
18192123
Цитата(мисс_граффити @ 25.10.2006 22:32) *

0 - это не положительное число! и не отрицательное.

может ты мне объяснишь, что такое в последней проге klem4 count, find:=-maxint
мисс_граффити
find:=-maxint
это мы присваиваем самое маленькое возможное значение. если find равен такой бяке, значит, подходящее число мы еще не нашли.

count - количество введенных чисел. если оно меньше 3, мы просто записываем новое число в подходящую переменную, а если больше - сдвигаем имеющиеся и в последнюю записываем.
18192123
Цитата(мисс_граффити @ 25.10.2006 22:55) *

find:=-maxint
это мы присваиваем самое маленькое возможное значение. если find равен такой бяке, значит, подходящее число мы еще не нашли.

count - количество введенных чисел. если оно меньше 3, мы просто записываем новое число в подходящую переменную, а если больше - сдвигаем имеющиеся и в последнюю записываем.

большое спасибо, что объяснила, теперь с заданием все ясно!
мисс_граффити
пожалуйста.
Reflex
а... извините, неправильно поняла задачу я думал трех чисел, которые до этого числа встречались в массиве.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.