Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ задача на поиск среди чисел первого положительного

Автор: 18192123 22.10.2006 22:52

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

Автор: Malice 22.10.2006 23:30

Цитата(18192123 @ 22.10.2006 19:52) *

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

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

Автор: Bokul 22.10.2006 23:44

Цитата
Если выход из repeat-a был по нулю, то решений небыло

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

Автор: Malice 22.10.2006 23:56

Цитата(Bokul @ 22.10.2006 20:44) *

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

Хитрый ты smile.gif Если такой случай тоже нужен, то эту фразу читать так:
"Если выход из repeat-a был не по условию, то .."

Автор: 18192123 22.10.2006 23:58

Цитата(Malice @ 22.10.2006 20:30) *

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

а как насчет более подробного ответа!? nea.gif

Автор: volvo 23.10.2006 0:02

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

Автор: 18192123 23.10.2006 0:26

Цитата(volvo @ 22.10.2006 21:02) *

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

вопрос был адресован не тебе!!!!!!!!!! nea.gif

Автор: volvo 23.10.2006 0:41

А мой - к тебе ...
Внимательно посмотри на картинку: Прикрепленное изображение

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

А вот хамить не надо. Чревато...

Автор: 18192123 23.10.2006 20:06

Цитата(Malice @ 22.10.2006 20:30) *

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

я не понимаю, как привязать к программе эти три переменные

Автор: Malice 23.10.2006 20:13

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

Код

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

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

Автор: 18192123 23.10.2006 20:42

Цитата(Malice @ 23.10.2006 17:13) *

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

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

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

а как с этими переменными соотносится первый положительный элемент?

Автор: мисс_граффити 23.10.2006 20:47

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

Автор: 18192123 23.10.2006 21:08

Цитата(мисс_граффити @ 23.10.2006 17:47) *

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

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

Автор: мисс_граффити 23.10.2006 21:59

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

Автор: 18192123 23.10.2006 22:59

Цитата(мисс_граффити @ 23.10.2006 18:59) *

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

посмотри прогу, что-то тут не то, выдает первый элемент последовательности
Прикрепленный файл  FIGNAI.PAS ( 349 байт ) Кол-во скачиваний: 471


Автор: Reflex 23.10.2006 23:45

нашла ошибку sorry

Автор: мисс_граффити 24.10.2006 0:17

мм....?
Reflex и 18192123 - одно лицо?

Автор: Reflex 24.10.2006 0:32

нет ... я вывесила решение задачи, а потом в нем нашла ошибку.

Код
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 24.10.2006 3:21

на то что ты написала 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 24.10.2006 15:42

Функция check здесь что-то другое проверяет.

Автор: Reflex 24.10.2006 17:24

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

Автор: мисс_граффити 24.10.2006 21:42

а по-моему, она проверяет не совсем то....
ты же проходишь от начала массива, то есть речь не обязательно о последних 2.

Автор: klem4 24.10.2006 23:01

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 25.10.2006 12:37

Цитата(klem4 @ 24.10.2006 20:01)
18192123, Сколько можно мусолить этот маразм ?! Функция, которая ищет нужный по твоему заданию элемент, если такого элемента нет, ф-я возвращает - 1.

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

Автор: klem4 25.10.2006 14:58

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 25.10.2006 15:38

klem4, "Найти первый положительный член", раз первый, значит могли бы быть и другие, значит прерывать ввод по find не надо. 0 тоже положительное число.

Автор: klem4 25.10.2006 15:41

Malice, а как же быть с

Цитата
пользователь вводит последовательнось целых чисел, признак окончания ввода - 0.


?

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

Если уточнить условие так что среди введенных чисел _точно_ есть искомое, то это меняет дело.

Автор: Malice 25.10.2006 16:06

Цитата(klem4 @ 25.10.2006 12:41) *

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

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

Автор: klem4 25.10.2006 16:43

Все, понял 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 25.10.2006 20:46

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

скажи пожалуйста, что такое find := -maxint в твоей программе
и что такое count?

Автор: мисс_граффити 26.10.2006 1:32

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

Автор: 18192123 26.10.2006 1:42

Цитата(мисс_граффити @ 25.10.2006 22:32) *

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

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

Автор: мисс_граффити 26.10.2006 1:55

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

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

Автор: 18192123 26.10.2006 2:49

Цитата(мисс_граффити @ 25.10.2006 22:55) *

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

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

большое спасибо, что объяснила, теперь с заданием все ясно!

Автор: мисс_граффити 26.10.2006 2:59

пожалуйста.

Автор: Reflex 27.10.2006 18:03

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