Помощь - Поиск - Пользователи - Календарь
Полная версия: задача на поиск среди чисел первого положительного
Форум «Всё о Паскале» > 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
а... извините, неправильно поняла задачу я думал трех чисел, которые до этого числа встречались в массиве.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.