Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Чижова
0 / 0 / 0
Регистрация: 24.12.2016
Сообщений: 44
#1

Найти сумму элементов массива после первого отрицательного числа

21.06.2017, 19:36. Просмотров 527. Ответов 15
Метки нет (Все метки)

Дан одномерный массив. Найти сумму элементов после первого отрицательного числа

Помогите пожалуйста! Очень прошу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2017, 19:36
Ответы с готовыми решениями:

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

Найти сумму модулей элементов массива, расположенных после первого отрицательного элемента
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1)...

Определить сумму элементов массива, расположенных после первого отрицательного элемента
Создать массив из 20 случайных чисел в диапазоне от -10 до 30. Определить...

В массиве найти числа после первого отрицательного и найти их сумму
//--------------------------------------------------------------------------- ...

Получить сумму ряда элементов, находящихся после первого отрицательного числа в i-ом рядке матрицы
Задано натуральное число n и целочисленная квадратная матрица порядка n...

15
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
21.06.2017, 19:50 #2
Чижова, Я предлагаю вот такую реализацию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  int sum = 0;
  bool flag = false;
  
  for(int i = 0; i < size; i++)
  {
    if (array[i] < 0 || flag == true)
    {
        flag = true;
        sum += array[i];
    }
  }
  
  std::cout << "Sum: " << sum << std::endl;
Буду рад, если кто-то предложит более лучшую реализацию, т.к. считаю, что моя реализация не идеальна.
0
Voll deMaar
3 / 3 / 1
Регистрация: 22.08.2016
Сообщений: 32
21.06.2017, 21:11 #3
igdev, если я не ошибаюсь, твой код прибавит к сумме также и самый первый отрицательный элемент.
Я сделал так:
C++
1
2
3
4
5
    for (int i = 0; i < size; i++)
    {
        if (flag)           sum += array[i];
        if (array[i] < 0)   flag = true;
    }
Или так, покороче будет:
C++
1
2
3
    int s   = 0;
    bool= false;
    for_each(v.begin(), v.end(), [&](int v){f ? s += v : s = 0; v < 0 ? f = true : f = f;});
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
21.06.2017, 21:35 #4
Voll deMaar, да, согласен. Немного не досмотрел. Вот так тогда.
C++
1
2
3
4
5
6
7
8
9
10
11
12
  int sum = 0;
  bool flag = false;
  
  for(int i = 0; i < size; i++)
  {
    if (array[i] < 0)
        flag = true;
    if (flag)
       sum += array[i];
  }
  
  std::cout << "Sum: " << sum << std::endl;
0
Voll deMaar
3 / 3 / 1
Регистрация: 22.08.2016
Сообщений: 32
21.06.2017, 21:46 #5
igdev, не-а, смотри. Встретился отрицательный элемент, ты перекинул флаг, и тут же сразу проверяешь на этот самый флаг, а он-то уже true. А в i у тебя всё ещё индекс первого отрицательного элемента.

Добавлено через 56 секунд
Так что сначала проверка на флаг, а только потом на знак элемента массива
0
igdev
74 / 63 / 27
Регистрация: 22.04.2016
Сообщений: 359
Завершенные тесты: 3
21.06.2017, 23:29 #6
Voll deMaar, мда. Что-то я вообще не внимательно подошел к этому вопросу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
  int sum = 0;
  bool flag = false;
  
  for(int i = 0; i < size; i++)
  {
    if (flag)
       sum += array[i];
    if (array[i] < 0)
        flag = true;
  }
  
  std::cout << "Sum: " << sum << std::endl;
Ну, теперь, думаю, уже точно должно быть правильно.

Не по теме:

Сессия немного выводит меня из строя, т.е. делает меня менее внимательным.

0
Manowar
1304 / 496 / 166
Регистрация: 12.03.2016
Сообщений: 1,882
Завершенные тесты: 1
21.06.2017, 23:48 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
int main()
{
    std::vector <int> vec{ 4, 6, -3, 5, 5, 7, -8 };
    auto pos = std::find_if(vec.begin(), vec.end(), [](int y) {return y < 0; });
    auto dist = pos - vec.begin();
    if (dist == vec.size()) {
        std::cout << " No negative element "; std::cout << std::endl; system ("pause");  return 1;
    }
    std::cout << " Sum after fist negative element = " << std::accumulate(vec.begin() + dist + 1, vec.end(), 0, std::plus<int>());
    std::cout << std::endl;
    system("pause");
}
0
Nishen
458 / 281 / 154
Регистрация: 26.02.2015
Сообщений: 1,329
Завершенные тесты: 2
21.06.2017, 23:50 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
 
template <class T>
T* initArray(T*& array, size_t size);
 
template <class T>
void setRandValues(T* array, size_t size, const T& minValue, const T& maxValue);
 
template <class T>
void print(T* array, size_t size);
 
template <class T>
T getSumm(T* array, size_t size);
 
template <class T>
void deleteArray(T*& array);
 
int main() {
 
    size_t size { 0 };
 
    std::cout
        << "Please, enter the size of array: ";
    std::cin
        >> size;
 
    int *array = initArray(array, size);
    setRandValues(array, size, -50, 50);
 
    std::cout
        << "Array: ";
    print(array, size);
    std::cout
        << std::endl;
 
    std::cout
        << "Summ: "
        << getSumm(array, size)
        << std::endl;
 
    return 0;
 
}
 
template <class T>
T* initArray(T*& array, size_t size) {
 
    array = new T[size];
 
    return array;
 
}
 
template <class T>
void setRandValues(T* array, size_t size, const T& minValue, const T& maxValue) {
 
    std::random_device rd;
    std::uniform_int_distribution<T> dist(minValue, maxValue);
 
    for (size_t i { 0 }; i < size; ++i) {
 
        array[i] = dist(rd);
 
    }
 
}
 
template <class T>
void print(T* array, size_t size) {
 
    std::copy(array, array + size, std::ostream_iterator<T>(std::cout, " "));
 
}
 
template <class T>
T getSumm(T* array, size_t size) {
 
    T* p = std::find_if(array, array + size, [](int value) { return value < 0; });
    T summ = 0;
 
    if (p != array + size) {
 
        for (++p; p < array + size; ++p) {
 
            summ += *p;
 
        }
 
        return summ;
 
    }
 
    return 0;
 
}
 
template <class T>
void deleteArray(T*& array) {
 
    delete[] array;
 
}
Добавлено через 47 секунд
мановар, правильнее будет вывести 0, наверное, если нет отрицательных элементов.
0
Manowar
1304 / 496 / 166
Регистрация: 12.03.2016
Сообщений: 1,882
Завершенные тесты: 1
22.06.2017, 00:03 #9
Цитата Сообщение от Nishen Посмотреть сообщение
правильнее будет вывести 0
0 чего?
0
Voll deMaar
22.06.2017, 00:04
  #10

Не по теме:

igdev, бывает, да.

0
Nishen
458 / 281 / 154
Регистрация: 26.02.2015
Сообщений: 1,329
Завершенные тесты: 2
22.06.2017, 07:25 #11
мановар, 0 - сумма, при отсутствии отрицательных элементов.
0
Manowar
1304 / 496 / 166
Регистрация: 12.03.2016
Сообщений: 1,882
Завершенные тесты: 1
22.06.2017, 07:42 #12
Nishen, по идее при отсутствии отрицательных элементов или одного отрицательного элемента, стоящего на последнем месте, следует писать : нет элементов для суммирования. Т.к. sum = 0, можно трактовать, что производилось вычисление суммы после отрицательного элемента и эта сумма = 0. Например массив {-5, 3, -3}, но на самом деле никаких операций не было. Но это уже извращения, думаю, ТС не до них. А если уж и принципиально, то сам сделает как надо.
0
Fixer_84
1039 / 654 / 648
Регистрация: 30.04.2016
Сообщений: 2,211
22.06.2017, 12:04 #13
Чижова, здравствуйте! Вот еще вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, sum, num, k;
    cout << "Введите размерность массива:" << endl;
    cout << "N = ";
    cin >> N;
    int* A = new int[N];
    cout << "Введите массив:" << endl;
    k = 0;
    for (int i = 0; i < N; i++)
    {
        cin >> A[i];
        if (A[i] < 0)
            k++;
    }
    for (int i = 0; i < N; i++)
    {
        if (A[i] < 0)
        {
            num = i;
            break;
        }
    }
    num++;
    sum = 0;
    for (int i = num; i < N; i++)
    {
        sum += A[i];
    }
    cout << "Искомая сумма элементов:" << endl;
    if (k > 0 && A[N-1] >= 0)
        cout << sum << endl;
    else
        cout << "Нет элементов для суммирования!" << endl;
    delete [] A;
    cin.get();
    return 0;
}
0
afront
1050 / 996 / 752
Регистрация: 29.02.2016
Сообщений: 3,187
22.06.2017, 15:42 #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main()
{
    srand(time(NULL));
    int n=6; 
    int sum=0, flag=0;
    int*a=new int[n];
    
    for(int i=0;i<n;++i)
    {
        a[i]=rand()%10 - 5;
        cout<<a[i]<<"\t";
        sum+=a[i]*flag;
        if(a[i]<0)flag=1;
    }
    cout<<endl;
    cout << sum << endl;
    system("pause");
    return 0;
}
0
Peoples
1334 / 827 / 747
Регистрация: 06.02.2016
Сообщений: 2,207
Записей в блоге: 17
Завершенные тесты: 4
22.06.2017, 17:04 #15
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
int main() {
    vector<int>v {1,2,3,-4,5,-6,7,-8,9,-10};
    cout<<accumulate(find_if(v.cbegin(),v.cend(),[](const int &x) { return x<0; } )+1,v.cend(),0,[](const int &a, const int &b) {
        return a+b;
    });
}
0
Manowar
1304 / 496 / 166
Регистрация: 12.03.2016
Сообщений: 1,882
Завершенные тесты: 1
22.06.2017, 17:13 #16
Peoples, а если нет ни одного отрицательного? Глючит.
0
22.06.2017, 17:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2017, 17:13

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

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru