Помощь - Поиск - Пользователи - Календарь
Полная версия: Массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Valkirie
Вводится массив. Найти минимум из сумм 3-х его последовательных элементов. Например, для массива

1 3 4 6 7
данные суммы равны 8, 13 и 17, минимум равен 8.

Помогите, умираю sad.gif
volvo
Valkirie
Не умирай ...
Код

const
 n = 5;
 a: array[1 .. n] of integer =
   (1, 3, 4, 6, 7);

var
 i, j, s: integer;
 min: integer;
begin
 min := maxInt;
 for i := 1 to n - 2 do
   begin
     s := 0;
     for j := i to i + 2 do
       s := s + a[j];
     if min > s then min := s
   end;

 writeln('min = ', min)
end.


Только проверь, я не компилировал...

P.S. Если массив A будет длиннее, можно сделать так:
Код

const
 n = 11;
 a: array[1 .. n] of integer =
   (1, 3, 4, 6, 7, 2, 1, 4, 3, 2, 1);

var
 i, s: integer;
 min: integer;
begin
 s := 0;
 for i := 1 to 3 do
   s := s + a[i];
 min := s;

 for i := 4 to n do
   begin
     s := s - a[i-3]+a[i];
     if min > s then min := s
   end;

 writeln('min = ', min)
end.
Valkirie
volvo
Спасибо огромное, без твоих идей наверное не разобралась бы.
Массив динамический, поэтому решение чуть-чуть другим вышло...
Код

var Mas1: array of integer;
var i,min,s:integer;
begin
SetLength(Mas1,ListBox1.Items.Count);
for i:=0 to ListBox1.Items.Count-1 do
Mas1[i]:=StrToInt(ListBox1.Items[i]);
min:=maxInt;
for i:=1 to Length(Mas1)-1 do
  begin
    s:=Mas1[i]+Mas1[i-1]+Mas1[i+1];
    if min>s then min:=s;
    end;
Label1.Caption:=FloatToStr(min);
  end;
end.


Не обращай внимания, что это Делфи, переписать я перепишу ;)
Спасибо, спас ;)
GoodWind
Valkirie, respect !
не просто ждете готового решения, но и сами что-то делаете.
Все бы так !
Valkirie
GoodWind
Стараюсь сама, но не всегда получается...вот сейчас ещё с одной задачкой мучаюсь...
Valkirie
Всё-таки нужна будет помощь... :molitva:
Дана последовательность целых чисел ai. Построить новую последовательность, содержащую элементы исходной последовательности, равными двойке в четной степени.
Вход
В каждой строке входа дано по одному элементу исходной последовательности. Признак конца последовательности - 0.
Выход
В каждую строку выхода вывести по одному элементу результирующей последовательности. Заключительный нуль в результат не выводить.

Пример
Вход:
433
16
8
128
1024
654
0

Выход:
16
1024

Я вот тут насочиняла
Код
var A,X:integer;
begin
repeat
Write('');
ReadLn(A);
X:=0;
if (A=Exp(X*Ln(2))) and (X mod 2=0) then
WriteLn(A)
else X:=X+1;
until A=0;
ReadLn;
end.


Но работать оно не желает =(
volvo
Valkirie
Если числа ограничены типом LongInt:
Код

var j, A:integer;
begin
 repeat
   ReadLn(A);
   if a = 0 then break;
   j := 2;
   while j <= 30 do
     if (longint(A)=longint($0001 shl j)) then
       begin writeln('>', A); break end
     else inc(j, 2)
 until A=0;
end.
Valkirie
Нам такого не рассказывали про Longint и про break blink.gif
volvo
Valkirie
Когда-то же надо начинать rolleyes.gif
Тогда попробуй вот так:
Код

var
 j, A:integer;
 stop: boolean;
begin
repeat
ReadLn(A);
if a <> 0 then
 begin
   j := 2;
   stop := false;
   while (j <= 30) and (not stop) do
     if A=($0001 shl j) then
       begin
         writeln('>', A); stop := true
       end
     else inc(j, 2)
 end
until a = 0;
end.
Valkirie
Не....всё не то...прога как находит чётную степень двойки так сразу останавливается, выводя её, не позволяя вводить последовательность дальше... =(
И ещё вот эта запись в теле цикла мну совсем не понятна...
Код
 (j <= 30) and (not stop) do
    if A=($0001 shl j) then


Зачем я вообще на это программирование учится пошла...
volvo
Valkirie
Ну вот только не надо говорить, что последняя программа это делает. Я все-таки программы тестирую перед тем, как запостить...
Valkirie
Ай ладно...
последняя...позволяет...только выводить она их не так должна...
а так как показано в задании на выходе...=(
volvo
Valkirie
А я и не делал по заданию... Я просто показал тебе, как определяется четная степень двойки. Ты же все равно переделываешь это на Дельфи... Так вместо того, чтобы печатать число - добавляй его к массиву, а после того, как программа выйдет из Repeat, распечатывай все содержимое массива...
Valkirie
т.е. вот это вот A=($0001 shl j) - чётная степень двойки...
Мне кстати эту задачу на Делфи перекатывать не нуно...она консольная должна быть...
Пойду повешусь...
volvo
Valkirie
Тогда другой вопрос - сколько чисел из введенных могут быть четной степенью двойки (в Паскале нет динамических массивов - так что нужно конкретное число)... Подставь его вместо 256 в maxPower.
Код

const
 maxPower = 256;

var
 numbers: array[1 .. maxPower] of integer; {можешь изменить на longint если нужно работать с большими числами}

 j, A:integer;
 stop: boolean;
 counter: Integer;
begin

counter := 0;
repeat
ReadLn(A);
if a <> 0 then
 begin
   j := 2;
   stop := false;
   while (j <= 30) and (not stop) do
     if A=($0001 shl j) then
       begin
         inc(counter); numbers[counter] := A; stop := true
       end
     else inc(j, 2)
 end
until a = 0;

writeln('results');
for j := 1 to counter do
 writeln(numbers[j]);
end.
Valkirie
ладно - спасибо...
всё равно всё это не так решается... намного проще...
я на твой код смотри и в обморок падаю - впервые такие ужасы вижу...
Всё равно спасибо, завтра к однокурсникам за помощью пойду - я тупая походу...
Valkirie
Код

var k,S,n:integer;
begin
Repeat
ReadLn(n);
S:=1;k:=0;
While S<n do
Begin
S:=S*2;
Inc(K)
end;
if (k mod 2=0) and (S=n) then WriteLn(n);
until n=0;
end.

Вот этого от меня хотел сервер....
volvo
Valkirie
Цитата
Вот этого от меня хотел сервер....

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

Моя программа от 2.12.04 20:57 делает точно то же самое, что и твоя последняя (убрать символ ">" не проблема... ) А если тебе нужно намного проще, то об этом надо говорить сразу. Я не телепат.
Valkirie
Не ругайся....
Я ведь в этом ничегошеньки не понимаю...сложно всё это мне... unsure.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.