Форум программистов, компьютерный форум CyberForum.ru

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

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

C++ Найти сумму модулей элементов массива, расположенных после первого отрицательного элемента
Найти сумму модулей элементов массива, расположенных после первого отрицательного элемента C++
Вычислить сумму целых частей элементов массива, расположенных после последнего отрицательного элемента C++
C++ Написать программу, определяющую сумму элементов массива, находящихся в массиве после первого отрицательного элемента
Ввод и вывод массива целых чисел Вычислить сумму модулей элементов массива,располроженных после первого отрицательного C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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;
}
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 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;
}
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
28.01.2014, 02:02     Вычислить сумму элементов после первого отрицательного элемента #4
MrGluck, почему все так любят вектора? я вот прочитал решение к 3му пункту. сколько там реально линейных проходов по вектору?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
28.01.2014, 02:11     Вычислить сумму элементов после первого отрицательного элемента #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
MrGluck, почему все так любят вектора?
Потому что они предоставляют удобный интерфейс для работы: методы и итераторы. Массивам тут похвастаться нечем (в плане функциональности).
Цитата Сообщение от metaluga145 Посмотреть сообщение
сколько там реально линейных проходов по вектору?
В худшем случае 2 линейных прохода.

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

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

Добавлено через 2 минуты
MrGluck, можешь его как то упростить я как начинающий ни могу в нем разобраться даже чтобы переделать и в визуал студию впихнуть
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
28.01.2014, 02:35     Вычислить сумму элементов после первого отрицательного элемента #9
Цитата Сообщение от metaluga145 Посмотреть сообщение
один раз подсчет дистанции
http://www.cplusplus.com/reference/iterator/distance/
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 02:54     Вычислить сумму элементов после первого отрицательного элемента #10
Цитата Сообщение от goradon Посмотреть сообщение
cooller_94, код не работае
Что значит не работает? если ошибки, то напиши какие
goradon
 Аватар для goradon
0 / 0 / 0
Регистрация: 30.12.2013
Сообщений: 71
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
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 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));
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
28.01.2014, 03:58     Вычислить сумму элементов после первого отрицательного элемента #13
вместо NULL можно просто 0
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 04:46     Вычислить сумму элементов после первого отрицательного элемента #14
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
вместо NULL можно просто 0
А вместо 0 можно NULL. И что с этого?
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
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 в конце ...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
28.01.2014, 15:12     Вычислить сумму элементов после первого отрицательного элемента #16
Цитата Сообщение от goradon Посмотреть сообщение
ошыбка
жи-ши
Цитата Сообщение от metaluga145 Посмотреть сообщение
два find на самом деле сольются в один? или куда девается еще один проход(там два поиска элементов и один раз подсчет дистанции)?
Учите мат часть, в случае с итераторами вектора там всего лишь одна операция разности.
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
вместо NULL можно просто 0
NULL не всегда 0 (внезапно ). Хотя в данной задаче равнозначно и вообще ничего не меняет. Просто написать 0 короче.
goradon
 Аватар для goradon
0 / 0 / 0
Регистрация: 30.12.2013
Сообщений: 71
28.01.2014, 18:34  [ТС]     Вычислить сумму элементов после первого отрицательного элемента #17
cooller_94, Fene4ka_, MrGluck,
Народ както по проще я понимаю что вы знаите но я розобраться в вашем коде не могу !!! напишыте плиз попроще программу!!
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
28.01.2014, 18:45     Вычислить сумму элементов после первого отрицательного элемента #18
goradon, Что именно тебе не понятно?
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
28.01.2014, 19:28     Вычислить сумму элементов после первого отрицательного элемента #19
Цитата Сообщение от goradon Посмотреть сообщение
cooller_94, Fene4ka_, MrGluck,
Народ както по проще я понимаю что вы знаите но я розобраться в вашем коде не могу !!! напишыте плиз попроще программу!!
чтобы разобраться в моем коде нужно знать только циклы и функции, может вам нужно немного подучить мат.часть ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2014, 23:12     Вычислить сумму элементов после первого отрицательного элемента
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
goradon
 Аватар для goradon
0 / 0 / 0
Регистрация: 30.12.2013
Сообщений: 71
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;
всем спасибо за помощ !
Yandex
Объявления
28.01.2014, 23:12     Вычислить сумму элементов после первого отрицательного элемента
Ответ Создать тему
Опции темы

Текущее время: 07:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru