Сумма модулей элементов массива, расположенных после первого отрицательного

Задача

Вычислить сумму модулей элементов массива, расположенных после первого отрицательного элемента.

Например, в массиве [5, 3, -1, 8, 0, -6, 1] первый отрицательный элемент является третьим по счету, а сумма модулей стоящих после него элементов массива будет составлять 8 + 0 + 6 + 1 = 15.

Пояснение к задаче и алгоритм решения

Поиск первого отрицательного:

Сначала находим первый отрицательный элемент и запоминаем его индекс (например, в переменной neg). На случай, если в массиве вообще не будет отрицательных элементов, до цикла поиска присваиваем neg значение, выходящее за границы диапазона индексов данного массива.

В цикле осуществляем проверку элементов на отрицательность. Как только попадается первый такой элемент, его индекс присваивается переменной neg, а цикл следует прервать (с помощью команды break).

Вычисление суммы модулей:

Если neg содержит выходящее за границы диапазона значение, то выводим сообщение, что в массиве нет отрицательных элементов. Иначе считаем сумму модулей элементов, расположенных после первого отрицательного. Начинать следует с элемента с индексом на 1 больше, чем у найденного первого отрицательного.

Для хранения суммы вводим переменную (например, s) и присваиваем ей 0. В цикле перебираем массив от элемента с индексом neg+1 и до конца, находим абсолютное значение каждого элемента и добавляем его к sum. После выполнения цикла выводим значение sum на экран.

Исходный код на языке программирования Pascal

const N = 10;
var
    arr: array[1..N] of integer;
    i,neg: byte;
    sum: integer;
begin
    randomize;
    for i:=1 to N do begin
        arr[i] := random(30)-5;
        write(arr[i]:4);
    end;
    writeln;
   
    neg := 0; // ищем первый отрицательный
    for i:=1 to N do
        if arr[i] < 0 then begin
            neg := i;
            break;
        end;
   
    if neg = 0 then
        writeln('Отрицательных элементов нет')
    else begin
        writeln('Номер первого отрицательного: ', neg);
        sum := 0; // считаем сумму модулей после первого отрицательного
        for i:=neg+1 to N do
            sum := sum + abs(arr[i]);
        writeln('Сумма модулей элементов после него: ', sum);
    end;
end.

Пример(ы) выполнения программы на языке Pascal

  17   4  11   9  -5  -2  22   3   8   0
Номер первого отрицательного: 5
Сумма модулей элементов после него: 35

Исходный код на языке программирования C

#include <stdio.h>
#define N 10
main() {
    int arr[N], sum;
    char i,neg;
    srand(time(NULL));
    for (i=0; i<N; i++) {
        arr[i] = rand()%30 - 5;
        printf("%d ", arr[i]);
    }
    printf("\n");
   
    neg = -1;
    for (i=0; i < N; i++) {
        if (arr[i] < 0) {
            neg = i;
            break;
        }
    }

    if (neg == -1) printf("нет отрицательных\n");
    else {
        printf("номер I-го отриц.: %d\n", neg+1);
        sum = 0;
        for (i=neg+1; i<N; i++) sum += abs(arr[i]);
        printf("сумма: %d\n", sum);
    }
}

Исходный код на языке программирования Python

from random import random
N = 10
arr = []
for i in range(N):
    arr.append(int(random() * 30) - 5)
print(arr)

neg = -1
for i in range(N):
    if arr[i] < 0:
        neg = i
        break

if neg == -1:
    print('Отрицательных нет')
else:
    print('Номер первого отриц.:', neg+1)
    s = 0
    for i in range(neg+1,N):
        s += abs(arr[i])
    print('Сумма: ', s)

Исходный код на языке программирования КуМир

алг сумма после перв отриц
нач
    цел N = 10
    цел таб arr[1:N]
    цел i,neg,sum
    нц для i от 1 до N
        arr[i] := irand(-5,30)
        вывод arr[i]:4
    кц
    вывод нс

    neg := 0
    нц для i от 1 до N
        если arr[i] < 0 то
            neg := i
            выход
        все
    кц

    если neg=0 то
        вывод "отриц. нет"
      иначе
        вывод "первый отриц.: ", neg, нс
        sum := 0
        нц для i от neg+1 до N
            sum := sum + iabs(arr[i])
        кц
        вывод "сумма модулей после = ", sum
    все
кон

Особенности решения задачи в среде КуМир

В языке КуМир функция abs() возвращает вещественное число. Поэтому ее нельзя использовать в выражении добавления значения к переменной sum (последняя целочисленная). Кроме abs() в языке предусмотрена функция iabs(), возвращающая целочисленное значение.

Исходный код на языке программирования Basic

N = 10
dim arr(N)
for i=0 to N-1
    arr[i] = int(rand*30) - 5
    print arr[i] + "  ";
next i
print

neg=-1
for i=N-1 to 0 step -1
    if arr[i] < 0 then
        neg = i
    endif
next i

if neg = -1 then
    print "Нет отриц."
else
    print "Номер перв. отриц.: " + (neg+1)
    sum = 0
    for i=neg+1 to N-1
        sum = sum + abs(arr[i])
    next i
    print sum
endif

Особенности решения на языке программирования Basic

В языке basic256 нет команды break. Поэтому поиск первого отрицательного элемента массива осуществляется перебором массива с конца.

Тема

Массивы

Уровень сложности

Средний

Дата публикации