Тема: сума перших 5 чисел без використання циклів

В програмі потрібно знайти суму перших 5 додатних елементів масива, без використання циклів.
допоможіть доробити, я не знаю як без указання цикла знайти суму перших 5 додатніх чисел..

program sdfsd;
const n=9; k=5;
type 
ar=array[1..n] of real;
label m1; 
const a:ar=(2.8,-3.5,-2.1,4,6,8.1,6.2,9.5,1.1);
var 
i:integer; s:real;  
begin
 i:=0; s:=0;
 m1: i:=i+1;
 if a[i]>0 then s:=s+a[i];
 if i<k then goto m1;
 writeln('suma=',s);
 readln;
 end.

2

Re: сума перших 5 чисел без використання циклів

Використовуй рекурсію, Люк!

3

Re: сума перших 5 чисел без використання циклів

lichmanmaksim
Один із варіантів у вашому коді - мітки. Але там потрібно ввести іще один лічильник, котрий буде відраховувати лише додатні елементи, а не усі підряд.

4 Востаннє редагувалося lichmanmaksim (24.04.2014 18:05:33)

Re: сума перших 5 чисел без використання циклів

Torbins , як за допомогою міток таке зробити?!

5 Востаннє редагувалося koala (24.04.2014 22:14:09)

Re: сума перших 5 чисел без використання циклів

lichmanmaksim написав:

Torbins , як за допомогою міток таке зробити?!

Мабуть, щільно заплющити очі і тричі сказати: "перехід назад - не цикл, перехід назад - не цикл, перехід назад - не цикл!"

6

Re: сума перших 5 чисел без використання циклів

koala написав:

Використовуй рекурсію, Люк!

Сума перших N додатніх елементів масиву - це:
    Якщо перший елемент масиву додатній, то 
        результат - це сума перших N-1 додатніх елементів масиву без першого елемента
    інакше 
        результат - це сума перших N додатніх елементів масиву без першого елемента.

7

Re: сума перших 5 чисел без використання циклів

lichmanmaksim написав:

Torbins , як за допомогою міток таке зробити?!

Так само, як зроблено у коді з першого посту, тільки додати іще одну змінну. Ви ж писали цей код, маєте розуміти, як він працює. Чи не ви?

bunyk
Боюся рекурсію вони ще не проходили.

8 Востаннє редагувалося lichmanmaksim (24.04.2014 22:41:19)

Re: сума перших 5 чисел без використання циклів

Torbins, та я писав, просто після 5-годинного марафону роботи над курсовою, ту уже нічого не розумієш і дивися на код як на звичайний текст
я пробував знову зробити через ці мітки, але не виходить, пробував робити так як ви говорили, для початку знайти всі елементи масиву більші 0, але потім завтрявав на внесенні до нового масиву цих чисел та закінченням використання мітки.

9

Re: сума перших 5 чисел без використання циклів

koala, ну то скажіть "доступною мовою", а не як завжди, своєю "остроумністю", як це зробити без використання циклів, якщо ви такий розумний)

10

Re: сума перших 5 чисел без використання циклів

Я серйозно: якщо взагалі без циклів, то єдиний варіант - рекурсія.  Ви не знаєте, що таке рекурсія? Продемонструйте, що хоч щось спробували почитати на цю тему, покажіть новий код (наприклад, за bunyk-овим псевдокодом) - допоможемо довести до ладу.

Якщо ж мова тільки про repeat, while і for, то можна поставити мітку, як ви і зробили.

11

Re: сума перших 5 чисел без використання циклів

koala, ну ось, вона працює але тільки для заданого прикладу, для інших я так розумію будуть збої.

program sdfsd;
const  k=5;
type 
ar=array[1..9] of real;
label m1,m; 
const a:ar=(2.8,-3.5,-2.1,4,6,8.1,6.2,9.5,1.1);
var 
i:integer; s:real;   
begin
 i:=0; s:=0;
 m1: i:=i+1;
 if a[i]>0 then s:=s+a[i];
 if i<7 then goto m1;
 writeln('suma=',s);
 readln;
 end.

12 Востаннє редагувалося koala (25.04.2014 06:16:48)

Re: сума перших 5 чисел без використання циклів

А, в цьому сенсі... ну то

m1: i:=i+1;
if a[i]>0 then begin
  s:=s+a[i];
  positive := positive + 1;
end;
if ( i <= 9 ) and ( positive < 5) then 
  goto m1;
Подякували: lichmanmaksim1

13

Re: сума перших 5 чисел без використання циклів

Рекурсивним методом:

type
  TArray = array[1..100] of integer;
var
 havePositive : integer; //лічильник додатніх чисел
 sum : integer; // сума елементів
procedure withoutCycle(A : TArray; n : integer; index : integer);
begin
  if (index = 1) then //якщо масив заповнюємо з 1
  begin
    havePositive := 0;
    sum := 0;
  end;
  { якщо вже отримали 5 додатніх або відбувається переповнення(індекс виходить
  за кількість елеменів в масиві) }
  if (havePositive = 5) or ( index > n) then exit;

  if (A[index] > 0) then
  begin
    sum := sum + A[index];
    havePositive:= havePositive + 1;
  end;
  withoutCycle(a,n,index + 1); // викликаємо рекурсивно
end;
var
  A : TArray;
  i,n : integer;
begin
  read(n);
  for i := 1 to n do { зчитування робимо без циклу}
   read(a[i]);
  withoutCycle(A,n,1);
  writeln(sum);
  readln;
  readln
end.

Варто було б змінні havePositive та sum занести в список переметрів процедури та забрати оцей кусок коду:

var
 havePositive : integer; //лічильник додатніх чисел
 sum : integer
Подякували: 0xDADA11C7, lichmanmaksim2

14 Востаннє редагувалося rkurtash (29.04.2014 11:10:53)

Re: сума перших 5 чисел без використання циклів

з мітками буде легше.
1: якщо лічильник ; кількість´то
початок
   додав число;
   додав лічильник';
   поернувся до 1;
кінець;
вивести суму;

15 Востаннє редагувалося koala (29.04.2014 11:25:28)

Re: сума перших 5 чисел без використання циклів

type
  TArray = array[1..100] of integer;

function withoutCycle(var A : TArray; index, left : integer):integer;
begin
  result := 0;
  if (left > 0) and (index < 100) then begin
    if A[ index ] > 0 then result := A[ index ] + withoutCycle(A, index + 1, left -1 )
    else result := withoutCycle(A, index + 1, left )
  end
end;

...

 writeln(withoutCycle(A,1,5));

так красивіше, як на мене.

Подякували: Odin881