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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Serdox
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 32
03.01.2013, 14:54     Вычислить произведение отрицательных элементов массива #1
Помогите пожалуйста! Надо написать программу в виде функций. Но я себе это как то слабо представляю. Вод задания:
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1.) произведение отрицательных элементов массива;
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
#include "stdafx.h"//Хранит все основные invludeпроекта
#include "conio.h"//Используется для создания текстового интерфейса пользователя
#include "stdio.h"//Реализует основные возможности ввода и вывода в языке Си
#include "locale.h"//Используется для выбора соответствующего языка.
#include "time.h"//содержит типы и функции для работы с датой и временем
#include<stdlib.h>// содержит в себе функции, занимающиеся выделением памяти
 
int _tmain(intargc, _TCHAR* argv[])
{
    setlocale(0, "Russian");//Активация Русского языка
    int n = 0, i, i_min = 0, flag, a, rand_chislo, random;//
    double pro = 1, sum = 0;//Представление чисел двойной точности с плавающей запятой
    double *arr = 0;
    printf("\n Введите размерность массива: ");
    scanf("%d", &n);
    arr = new double[n];
    printf("\n Выберите способ ввода матрицы: 1 - случайные значения, 2 - ручной ввод  ");
    scanf("%d", &flag);
    if (flag==1)//Если 1, то случайный ввод         
{for(i = 0; i < n; i++)
{srand(time(0));//Инициализация генератора случайных чисел
{arr[i]=(float)(-5000+rand()%13001)/1000;}//Случайный ввод чисел от -5 до 8
    if (flag==2)// Если 2, то ручной ввод
{for (i=0; i<n; i++)
{printf (" A[%d]= ",i); 
        scanf ("%lf", &arr[i]); }//ввод чисел последовательности
printf("\n%10.3lf", arr[i]);
    }
    inti_max=0;
    for(i = 0; i < n; i++){
        if(arr[i] < 0)
            pro *= arr[i];
        if(arr[i_max] <arr[i])
            i_max = i;}
    for(i = 0; i <i_max; i++)
        if (arr[i]>0)
        sum += arr[i];
    printf("\n\n Произведение отрицательных элементов массива = %10.3lf", pro);
printf("\n Сумма положительных элементов массива, расположенных до максимального элемента = %7.3lf\n", sum);
    printf("\n\n\n Исходный массив : ");
    for(i = 0; i < n; i++){
        printf("\n%10.3lf", arr[i])//Вывод Исходного массива
    }
        double temp;
    for ( i = 0 ; i<n/2 ; i++){//Изменение порядка следования
        temp = arr[i];
        arr[i] = arr[n-i-1];
arr[n-i-1]= temp;
    }
    printf("\n\n");
    printf("Обратный порядок следования :\n");
    for(i = 0; i < n; i++){
        printf("\n%10.3lf", arr[i]);//Вывод массива с обратным порядком следования
    }
getch();
    return 0;}}}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 14:54     Вычислить произведение отрицательных элементов массива
Посмотрите здесь:

C++ [C++] Рекурсивно вычислить произведение отрицательных элементов массива
Вычислить сумму отрицательных элементов массива и произведение элементов, расположенных между максимальным и минимальным элементами C++
В одномерном массиве вычислить сумму отрицательных элементов, произведение элементов массива между максимальным и минимальным элементами C++
C++ Работа с одномерными массивами (вычислить произведение отрицательных элементов массива.)
Вычислить произведение отрицательных элементов массива, расположенных в строках с нечетными номерами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
03.01.2013, 15:19     Вычислить произведение отрицательных элементов массива #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
#include <iostream>
#include <cstdlib>
#include <ctime>
void reverse(int *arr, size_t size){
    int *arrend=arr+size-1;
    int temp;
    while(arr<arrend){
        temp=*arr;
        *arr=*arrend;
        *arrend=temp;
        --arrend; ++arr;
    }
}
int GetMaxIndex(int * arr,int size){
    int maxindex=0;
    for(int i=1;i<size;maxindex=arr[i]>arr[maxindex]?i:maxindex,++i);
    return maxindex;
}
int foo1(int * arr,int size){
    int mult=1;
    for(int i=0;i<size;mult*=arr[i]<0?arr[i]:1,++i);
    return mult;
}
int foo2(int * arr,int size){
    int summ=0;
    for(int i=0;i<size;summ+=arr[i]>0?arr[i]:0,++i);
    return summ;
}
 
void show(int * arr,int size,bool endline=true){
    for(int i=0;i<size;++i)
        std::cout<<arr[i]<<" ";
    if(endline) std::cout<<std::endl;
}
void fillrandom(int * arr,int size,int max,int min){
    srand(time(NULL));
    for(int i=0;i<size;++i)
        arr[i]=rand()%(max-min+1)+min;
}
 
int main(){
    const int n=15;
    int arr[n];
    fillrandom(arr,n,10,-10);
    show(arr,n);
    std::cout<<"1) "<<foo1(arr,n)<<std::endl;
    std::cout<<"2) "<<foo2(arr,GetMaxIndex(arr,n))<<std::endl;
    std::cout<<"3) ";
    reverse(arr,n);
    show(arr,n);
    return 0; 
}
Вычислить произведение отрицательных элементов массива
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.01.2013, 17:12     Вычислить произведение отрицательных элементов массива #3
Ради интереса хотел через accumulate сделать, но не так то просто это оказалось. Вот что у меня получилось.
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
#include <iostream>
#include <algorithm>
#include <functional>
#include <numeric>
#include <array>
 
template<typename _InIt, typename _Ty, typename _Func1, typename _Func2>
_Ty accumulate_if(_InIt _First, _InIt _Last, _Ty _Val, _Func1 F1, _Func2 F2){
    for(; _First != _Last; ++_First)
        if( F2(*_First) )
            _Val = F1(_Val, *_First); 
    return _Val;
}
 
int main()
{
    setlocale (LC_ALL, "Russian");
 
    using namespace std::placeholders;
    std::array<int, 10> ar = {-8,6,5,-7,-5,11,2,6,1,4};
 
    std::cout<<"1.) произведение отрицательных элементов массива: "<<
        accumulate_if(ar.begin(), ar.end(), 1, std::multiplies<int>(), std::bind(std::less<int>(), _1, 0))<<"\n";
 
    
    std::cout<<"2.) сумма положительных элементов массива, расположенных до максимального элемента: "<<
        accumulate_if(ar.begin(), std::max_element(ar.begin(), ar.end()), 0, std::plus<int>(), std::bind(std::greater<int>(), _1, 0))<<"\n";
 
    std::cout<<"\n";
    system("pause");
    return 0;
}
Шаблон функции взял отсюда accumulate if?
Serdox
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 32
04.01.2013, 15:30  [ТС]     Вычислить произведение отрицательных элементов массива #4
Спасибо большое, выручили

Добавлено через 20 часов 12 минут
Croessmah, А ты не мог бы прокомментировать хотя бы основные функции
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
05.01.2013, 09:25     Вычислить произведение отрицательных элементов массива #5
Цитата Сообщение от Serdox Посмотреть сообщение
Croessmah, А ты не мог бы прокомментировать хотя бы основные функции
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 <iostream>
#include <cstdlib>
#include <ctime>
//Функция "переворачивает" массив
void reverse(int *arr, size_t size){
    int *arrend=arr+size-1;
    int temp;
    while(arr<arrend){
        temp=*arr;
        *arr=*arrend;
        *arrend=temp;
        --arrend; ++arr;
    }
}
//Функция возвращает индекс максимального элемента массива
int GetMaxIndex(int * arr,int size){
    int maxindex=0;
    for(int i=1;i<size;maxindex=arr[i]>arr[maxindex]?i:maxindex,++i);
    return maxindex;
}
//Функция возвращает произведение отрицательных элементов массива
int foo1(int * arr,int size){
    int mult=1;
    for(int i=0;i<size;mult*=arr[i]<0?arr[i]:1,++i);//mult*=arr[i]<0?arr[i]:1 - если arr[i] отрицательный, то mutl*=arr[i], иначе mult умножается на 1, то есть не изменяется
    return mult;
}
 
//Функция фозвращает сумму положительных элементов массива
int foo2(int * arr,int size){
    int summ=0;
    for(int i=0;i<size;summ+=arr[i]>0?arr[i]:0,++i);//По аналогии с foo1
    return summ;
}
//Функция вывода массива на консоль
void show(int * arr,int size,bool endline=true){
    for(int i=0;i<size;++i)
        std::cout<<arr[i]<<" ";
    if(endline) std::cout<<std::endl;
}
//Функция заполнения массива псевдослучайными числами
void fillrandom(int * arr,int size,int max,int min){
    srand(time(NULL));//Инициализируем генератор текущим временем
    for(int i=0;i<size;++i)
        arr[i]=rand()%(max-min+1)+min;//Генерируем число [min;max]
}
 
int main(){
    const int n=15;//Размер массива
    int arr[n];
    fillrandom(arr,n,10,-10);//Заполняем массив
    show(arr,n);//Выводим массив
    std::cout<<"1) "<<foo1(arr,n)<<std::endl;//Выводим результат выполнения функции foo1
    std::cout<<"2) "<<foo2(arr,GetMaxIndex(arr,n))<<std::endl;////Выводим результат выполнения функции foo1. В качестве размера передаем индекс максимального элемента, для ограничения.
    std::cout<<"3) ";
    reverse(arr,n);//Переворачиваем массив
    show(arr,n);//Выводим массив на консоль.
    return 0; 
}
Serdox
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 32
05.01.2013, 21:35  [ТС]     Вычислить произведение отрицательных элементов массива #6
Огромное спасибо!!!
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 21:40     Вычислить произведение отрицательных элементов массива #7
Croessmah, зря все так в кучу месите, от того, что вы на одну строчку в каждом методе в каждой функции напишете лишнюю строку хуже не будет. Я хотя бы про это
C++
1
for(int i=1;i<size;maxindex=arr[i]>arr[maxindex]?i:maxindex,++i);
То же самое, но понятнее же
C++
1
2
for(int i=1;i<size;++i)
   maxindex = arr[i]>arr[maxindex] ? i : maxindex
че бумагу экономить-то, она электронная
Croessmah
07.01.2013, 09:06
  #8

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
Croessmah, зря все так в кучу месите
Цитата Сообщение от Psilon Посмотреть сообщение
То же самое, но понятнее же
Кому как. Ненавижу расписывать банальные действия, которые и так понятны. В большом проекте даже банальная скобка на другой строчке
C++
1
2
if(abc)
{
бесит.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 09:12     Вычислить произведение отрицательных элементов массива
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
07.01.2013, 09:12     Вычислить произведение отрицательных элементов массива #9
Croessmah, по-моему это топик "C++ для начинающих", а не "откровения Senior Developer для таких же гуру". Мне в свое время и массивы были непонятны, это же не повод говорить "да че их знать, просто куча чисел". Разный уровень, разный уровень очевидного. Вот например, такая запись вам понятна? А кому-то наверное тоже примитивно и элементарно
C++
1
2
if (cmd[1] == RESET) // если принятая команда RESET
{((void(*)(void))0)();}
Yandex
Объявления
07.01.2013, 09:12     Вычислить произведение отрицательных элементов массива
Ответ Создать тему
Опции темы

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