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

Вычислить сумму элементов после первого отрицательного элемента - C++

28.01.2014, 01:33. Просмотров 660. Ответов 19
Метки нет (Все метки)

Написать программу, которая в одномерном массиве размером n (задается пользователем)
1. вычисляет сумму элементов после первого отрицательного элемента
2. вычисляет произведение элементов после последнего отрицательного элемента
3. вычисляет количество элементов между А и В, где А, В-это элементы заданные пользователем. Если элементы повторяются в массиве то для А рассматривается последнее вхождение, а для В первый.
Например, имеем массив 4 6 8 9 3 5 1 4 2 12 5 23
Пользователь вводит значение для А - 9 и для В - 12
Результат между А и В находится 5 элементов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2014, 01:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вычислить сумму элементов после первого отрицательного элемента (C++):

Вычислить номер минимального по модулю элемента и сумму модулей элементов, расположенных после первого отрицательного
Добрый день. Прошу Вашей помощи. В одномерном массиве, состоящем из n...

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

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

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

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

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

19
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
28.01.2014, 01:58 #2
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
#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <random>
#include <vector>
 
int main()
{
    int N;
    std::mt19937 gen {std::random_device()() };
    std::uniform_int_distribution<int> dist(-100, 100);
    auto isNeg = [](const int x) { return x < 0; };
 
    std::cout << "N = ";
    std::cin >> N;
    if (N <= 0)
        return 1;
    std::vector<int> v(N);
 
    std::generate(v.begin(), v.end(), [&dist, &gen] {return dist(gen); });
    std::cout << "Vector:\n";
    std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    // 1. вычисляет сумму элементов после первого отрицательного элемента
    auto it = std::find_if(v.cbegin(), v.cend(), isNeg);
    if (it == v.cend())
        std::cout << "1. No such\n";
    else
        std::cout << "1. " << std::accumulate(it + 1, v.cend(), 0) << std::endl;
 
    // 2. вычисляет произведение элементов после последнего отрицательного элемента
    auto it2 = std::find_if(v.rbegin(), v.rend(), isNeg);
    if (it2 == v.rend())
        std::cout << "2. No such\n";
    else
        std::cout << "2. " << std::accumulate(v.begin() + (v.rend() - it2), v.end(),
            1, std::multiplies<int>()) << std::endl;
 
    // 3. вычисляет количество элементов между А и В, где А, В-это элементы заданные
    // пользователем. Если элементы повторяются в массиве то для А рассматривается
    // последнее вхождение, а для В первый.
    int A, B;
    std::cout << "A = ";
    std::cin >> A;
    std::cout << "B = ";
    std::cin >> B;
    auto it3 = std::find(v.rbegin(), v.rend(), A), it4 = std::find(v.rbegin(), v.rend(), B);
    if (it3 == v.rend() || it4 == v.rend())
        std::cout << "3. No such\n";
    else if (it3 == it4)
        std::cout << "3. They are same\n";
    else
        std::cout << "3. " << std::abs(std::distance(it3, it4)) - 1 << std::endl;
}
0
cooller
565 / 533 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 02:01 #3
goradon,ну и без stl
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
#include <iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
int main()
{
    size_t ArraySize;
    std::cin>>ArraySize;
    srand(time(nullptr));
    int *array = new int [ArraySize];
    std::cout<<"Array: ";
    /*for(size_t i = 0; i<ArraySize; i++)
        std::cout<<(array[i] = rand()%20 - 5)<<" ";*/
    for(int i=0; i<ArraySize; i++)
        std::cin>>array[i];
    size_t PositionLastNegative(0),PositionA(0),PositionB(0),CountBetween(0);
    int Sum(0),Product(0);
    bool flag(false);
    for(size_t i = 0; i<ArraySize; i++)
    {
        if(array[i]<0)
        {
            flag = true;
            PositionLastNegative = i;
        }
        if(flag && (i+1)!=ArraySize)
            Sum+=array[i+1];
    }
    for(size_t i = PositionLastNegative + 1; i<ArraySize; i++)
        Product*=array[i];
    int A,B;
    std::cout<<"\nInput A and B:";
    std::cin>>A>>B;
    flag = false;
    for(size_t i = 0; i<ArraySize; i++)
    {
        if(array[i]==B && !flag)
        {
            std::cout<<"i="<<i;
            PositionB = i;
            flag = true;
        }
        PositionA = (array[i]==A)?i:PositionA;
    }
    for(size_t i = std::min(PositionA,PositionB) + 1; i<std::max(PositionB,PositionA); i++)
        CountBetween++;
    std::cout<<"\Sum of the elements after the first negative element: "<<Sum;
    std::cout<<"\nProduct of the elements after the last negative element: "<<Product;
    std::cout<<"\nBetween A and B: "<<CountBetween;
 
    delete []array;
}
0
metaluga145
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
28.01.2014, 02:02 #4
MrGluck, почему все так любят вектора? я вот прочитал решение к 3му пункту. сколько там реально линейных проходов по вектору?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
28.01.2014, 02:11 #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
MrGluck, почему все так любят вектора?
Потому что они предоставляют удобный интерфейс для работы: методы и итераторы. Массивам тут похвастаться нечем (в плане функциональности).
Цитата Сообщение от metaluga145 Посмотреть сообщение
сколько там реально линейных проходов по вектору?
В худшем случае 2 линейных прохода.

Супероптимизация для лаб? Как то не критично в данном конкретном случае. Что там N + N проверок, что тут, только вынесено в методы удобные.

Добавлено через 1 минуту
Да и вообще, на массивах я уже нарешался, дайте хоть растечься мыслию по древу и покодить в свое удовольствие
0
goradon
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 72
28.01.2014, 02:20  [ТС] #6
а можна както по проще ?
у меня ошыбка на max i min
я сижу через визуал студио
0
metaluga145
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
28.01.2014, 02:21 #7
Цитата Сообщение от MrGluck Посмотреть сообщение
В худшем случае 2 линейных прохода.
два find на самом деле сольются в один? или куда девается еще один проход(там два поиска элементов и один раз подсчет дистанции)?
0
goradon
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 72
28.01.2014, 02:30  [ТС] #8
cooller_94, код не работает чо та можно его както упростить ?

Добавлено через 2 минуты
MrGluck, можешь его как то упростить я как начинающий ни могу в нем разобраться даже чтобы переделать и в визуал студию впихнуть
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
28.01.2014, 02:35 #9
Цитата Сообщение от metaluga145 Посмотреть сообщение
один раз подсчет дистанции
http://www.cplusplus.com/reference/iterator/distance/
0
cooller
565 / 533 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 02:54 #10
Цитата Сообщение от goradon Посмотреть сообщение
cooller_94, код не работае
Что значит не работает? если ошибки, то напиши какие
0
goradon
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 72
28.01.2014, 03:11  [ТС] #11
cooller_94,
C++
1
 srand(time(nullptr));
и
C++
1
for(size_t i = std::min(PositionA,PositionB) + 1; i<std::max(PositionB,PositionA); i++)
имено на min и max
0
cooller
565 / 533 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 03:36 #12
goradon, Какой у тебя компилятор?
попробуй подключить
C++
1
#include<algorithm>
Добавлено через 11 минут
Цитата Сообщение от goradon Посмотреть сообщение
1
srand(time(nullptr));
Попробуй заменить на
C++
1
    srand(time(NULL));
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
28.01.2014, 03:58 #13
вместо NULL можно просто 0
0
cooller
565 / 533 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 04:46 #14
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
вместо NULL можно просто 0
А вместо 0 можно NULL. И что с этого?
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
28.01.2014, 05:10 #15
вот еще один вариант, если до этого вам не нравились ...
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
void SetMas(int, int[]);
void GetMas(int, int[]);
int FindNegativeAndSumm(int, int[]);
int FindNegativeAndProizv(int, int[]);
int FindRange(int, int[], int, int);
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(0));
    setlocale(0, "");
    cout << "Введите размер массива : ";
    int size;
    cin >> size;
    int* mas = new int[size];
    SetMas(size, mas); //заполняем массив
    GetMas(size, mas); //выводим массив
    cout << "Сумма элементов после отрицательного числа : " << FindNegativeAndSumm(size, mas) << endl;  //первое задание
    cout << "Произведение элементов после отрицательного числа : " << FindNegativeAndProizv(size, mas) << endl;  //второе задание
    cout << "Введите числа А и В : ";
    int A, B;
    cin >> A >> B;
    cout << "Расстояние от А до В : " << FindRange(size, mas, A, B) << endl; //третее задание
    system("pause");
    return 0;
}
 
void SetMas(int size, int mas[])
{
    for (int i = 0; i < size; i++)
        mas[i] = rand() % 10 - 4;
}
 
void GetMas(int size, int mas[])
{
    for (int i = 0; i < size; i++)
        cout << mas[i] << " ";
    cout << endl;
}
 
int FindNegativeAndSumm(int size, int mas[])
{
    bool Flag = false;
    int S = 0;
    for (int i = 0; i < size; i++)
    {
        if (Flag == true) //если нада, чтобы считало вместе с отрицательным элементом - поменяй if местами
            S += mas[i];
        if (mas[i] < 0)
            Flag = true;
    }
    return S;
}
 
int FindNegativeAndProizv(int size, int mas[])
{
    bool Flag = false;
    int S = mas[size-1];
    if (S < 0)
        return 0;
    else
        S = 1;
    for (int i = size - 1; i > 0; i--)
    {
        if (mas[i] >= 0 && Flag == false)
            S *= mas[i];
        else
            Flag = true;
    }
    return S;
}
 
int FindRange(int size, int mas[], int A, int B)
{
    int PozA = 0, PozB = 0;
    for (int i = 0; i < size; i++)
        if (mas[i] == A)
            PozA = i;
    for (int i = 0; i < size; i++)
        if (mas[i] == B)
        {
            PozB = i;
            break;
        }
    if (PozA > PozB)
        return PozA - PozB - 1;
    else
        return PozB - PozA - 1;
}
Добавлено через 3 минуты
чуть не забыл, добавьте delete[] mas в конце ...
0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
28.01.2014, 15:12 #16
Цитата Сообщение от goradon Посмотреть сообщение
ошыбка
жи-ши
Цитата Сообщение от metaluga145 Посмотреть сообщение
два find на самом деле сольются в один? или куда девается еще один проход(там два поиска элементов и один раз подсчет дистанции)?
Учите мат часть, в случае с итераторами вектора там всего лишь одна операция разности.
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
вместо NULL можно просто 0
NULL не всегда 0 (внезапно ). Хотя в данной задаче равнозначно и вообще ничего не меняет. Просто написать 0 короче.
0
goradon
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 72
28.01.2014, 18:34  [ТС] #17
cooller_94, Fene4ka_, MrGluck,
Народ както по проще я понимаю что вы знаите но я розобраться в вашем коде не могу !!! напишыте плиз попроще программу!!
0
cooller
565 / 533 / 280
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 18:45 #18
goradon, Что именно тебе не понятно?
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
28.01.2014, 19:28 #19
Цитата Сообщение от goradon Посмотреть сообщение
cooller_94, Fene4ka_, MrGluck,
Народ както по проще я понимаю что вы знаите но я розобраться в вашем коде не могу !!! напишыте плиз попроще программу!!
чтобы разобраться в моем коде нужно знать только циклы и функции, может вам нужно немного подучить мат.часть ?
0
goradon
0 / 0 / 1
Регистрация: 30.12.2013
Сообщений: 72
28.01.2014, 23:12  [ТС] #20
вот как должна быть ета программа
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
int setSize;
    cout << "Сколько элементов будет у вас есть? ";
    cin >> setSize;
    const int getSize = setSize;
    int * a = new int[setSize];
    
 
    for (int i = 0; i < getSize; i++)
    {
        cout << "номер элемента " << i + 1 << ": ";
        cin >> a[i];
    }
 
    int sum = 0, product = 1, numberCount = 0, A, B, lastDegreeIndex, lastAIndex;
    bool firstDegree = false;
    cout << "вводить A: ";
    cin >> A;
    cout << "вводить B: ";
    cin >> B;
    for (int i = 0; i < getSize; i++)
    {
        if (firstDegree == true)
            sum += a[i];
 
        if (a[i] < 0)
        {
            firstDegree = true;
            lastDegreeIndex = i;
        }
 
        if (a[i] == A)
            lastAIndex = i;
    }
 
    for (int i = lastDegreeIndex + 1; i < getSize; i++)
    {
        product *= a[i];
    }
 
    for (int i = lastAIndex + 1; i < getSize; i++)
    {
        if (a[i] == B)
            break;
        numberCount++;
    }
    
    cout << "Сумма элементов после первой степени " << sum << endl;
    cout << "Произведение элементов после последней степени " << product << endl;
    cout << "Количество элементов между А и В" << numberCount << endl;
всем спасибо за помощ !
0
28.01.2014, 23:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2014, 23:12
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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