Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.12.2017
Сообщений: 23
1

Функция: вернуть сумму элементов массива с номерами от left до right включительно

16.01.2019, 17:53. Показов 1699. Ответов 20
Метки нет (Все метки)

Написать функцию, которая принимает массив размера N и целые числа left и right и возвращает сумму элементов массива с номерами от left до right включительно.
Задать размерность массива как глобальную переменную (вынести ее в файл lib.h)
Аргументы left и right использовать как аргументы по умолчанию.
Функция должна так же работать с типами short,float,double.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2019, 17:53
Ответы с готовыми решениями:

Найти сумму элементов массива с номерами от K до L включительно
Использовать одномерный массив для решения такой задачи. Прочитать 20 целых чисел и записать их в...

Найти сумму элементов массива с номерами от K до L включительно.
Дан массив размера N и целые числа k и L(1<k<L<N). Найти сумму элементов массива с номерами от K до...

Найти сумму элементов массива с номерами от K до L включительно
Условие задачи: Дан*массив*A*размера*N*и*целые*числа*Kи*L*(1 ≤*K*<*L*≤*N) найти сумму...

Найти сумму элементов массива с номерами от K до L включительно.
Дан массив размера N и целые числа K и L (1 ≤ K ≤ L ≤ N). Найти сумму элементов массива с номерами...

20
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
16.01.2019, 21:35 2
Цитата Сообщение от Brudagon Посмотреть сообщение
Написать функцию
C++
1
2
3
4
5
6
7
8
9
template<typename T>
int sum(T* a, int n, int left = 0, int right = n - 1) {
  int ans = 0;
  
  for (; left <= right; ++left)
    ans += a[left];
 
  return ans;
}
0
6522 / 4436 / 2539
Регистрация: 18.12.2017
Сообщений: 13,854
17.01.2019, 00:19 3
ReDoX, не проверял, но разве у sum и ans должен быть тип int ?
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 01:37 4
Цитата Сообщение от Yetty Посмотреть сообщение
ReDoX, не проверял, но разве у sum и ans должен быть тип int ?
А, и правда, не додумался. Можно сделать возвращаемый тип и тип ans даблом, хотя не уверен, что такое решение вернет правильный ответ для int'овых массивов, это еще проверить надо
0
6522 / 4436 / 2539
Регистрация: 18.12.2017
Сообщений: 13,854
17.01.2019, 02:20 5
Цитата Сообщение от ReDoX Посмотреть сообщение
Можно сделать возвращаемый тип и тип ans даблом
a может int заменить на T
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 02:51 6
Цитата Сообщение от Yetty Посмотреть сообщение
a может int заменить на T
Можно, но если у меня массив шортов, а в нем большие значения, то может не поместиться
0
6522 / 4436 / 2539
Регистрация: 18.12.2017
Сообщений: 13,854
17.01.2019, 03:19 7
ReDoX, не совсем Вас понял. допустим массивы разных типов объявить в кейсах switch. что и куда должно не поместиться ?
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 04:00 8
Цитата Сообщение от Yetty Посмотреть сообщение
ReDoX, не совсем Вас понял. допустим массивы разных типов объявить в кейсах switch. что и куда должно не поместиться ?
Возьмем код:

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>
 
using namespace std;
 
template<typename T>
T sum(T* a, int n, int left = 0, int right = n - 1) {
  T ans = 0;
 
  for (; left <= right; ++left)
    ans += a[left];
 
  return ans;
}
 
int main() {
  int n;
  cin >> n;
 
  short* a = new short[n];
  for (int i = 0; i < n; ++i)
    cin >> a[i];
 
  cout << sum(a, n, 0, n - 1);
}
Ввод: 2 30000 30000
Вывод: -5536

Если результирующая переменная типа T (short), то сумма элементов в нее может не поместиться, хотя все элементы находятся в пределах своего типа

P.S.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
T sum(T* a, int n, int left = 0, int right = n - 1) // так делать нельзя
 
// Так можно:
int n;
 
template<typename T>
T sum(T* a, int left = 0, int right = n - 1) {
  T ans = 0;
 
  for (; left <= right; ++left)
    ans += a[left];
 
  return ans;
}
0
609 / 414 / 151
Регистрация: 11.01.2019
Сообщений: 1,742
17.01.2019, 09:59 9
ReDoX, не совсем верно. Функция sum должна возвращать тип U, а не T, т.к. сумма может "не влезть" в разрядность типа T и потребуется другой, более "широкий" тип.
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 10:12 10
Цитата Сообщение от jugu Посмотреть сообщение
ReDoX, не совсем верно. Функция sum должна возвращать тип U, а не T, т.к. сумма может "не влезть" в разрядность типа T и потребуется другой, более "широкий" тип.
Ну и чем будет U? Для short, int - int; для double - double. Если в шаблонах есть такая вариативность, то покажите, как это делается, иначе можно для всех просто взять double - по вместимости точно хватит, но вот вопрос: будет ли правильно считать для целых типов.


Пока вариант такой:


C++
1
2
3
4
5
6
7
8
9
10
11
int n;
 
template<typename T>
double sum(T* a, int left = 0, int right = n - 1) {
  double ans = 0;
 
  for (; left <= right; ++left)
    ans += a[left];
 
  return ans;
}
0
609 / 414 / 151
Регистрация: 11.01.2019
Сообщений: 1,742
17.01.2019, 10:17 11
Цитата Сообщение от ReDoX Посмотреть сообщение
Ну и чем будет U?
В соответствии с default promotion. Например, для short - int, для uint16_t - uint32_t, для int - long и т.п.

PS: А вот возвращать double это уж совсем криво, уж лучше T.
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 10:46 12
Цитата Сообщение от jugu Посмотреть сообщение
PS: А вот возвращать double это уж совсем криво, уж лучше T.
Почему криво? Работает же. Даже с интами

Цитата Сообщение от jugu Посмотреть сообщение
В соответствии с default promotion. Например, для short - int, для uint16_t - uint32_t, для int - long и т.п.
покажите код с двумя параметрами, а то я че-то не понимаю совсем
0
609 / 414 / 151
Регистрация: 11.01.2019
Сообщений: 1,742
17.01.2019, 10:50 13
Цитата Сообщение от ReDoX Посмотреть сообщение
Почему криво? Работает же. Даже с интами
"Работает" как критерий качества кода - это сильно *facepalm*
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 10:53 14
Цитата Сообщение от jugu Посмотреть сообщение
"Работает" как критерий качества кода - это сильно *facepalm*
>Ууу, кривой код
>Покажите рабочий
>Ууу, рабочий код - значит, не кривой, ууу

Отличный перл. Удачи в дальнейшем общении; отвечать вам я более не буду
0
609 / 414 / 151
Регистрация: 11.01.2019
Сообщений: 1,742
17.01.2019, 10:54 15
Цитата Сообщение от ReDoX Посмотреть сообщение
покажите код с двумя параметрами, а то я че-то не понимаю совсем
Так а что показывать?! Твоя функция sum должна быть такой. Возьми T = int и просуммируй массив чисел, близких к предельному положительному числу типа int. Сумма же может не влезть в int. Поэтому и берем более широкий тип для результата.
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 11:09 16
Цитата Сообщение от jugu Посмотреть сообщение
Так а что показывать?!
Цитата Сообщение от jugu Посмотреть сообщение
Функция sum должна возвращать тип U, а не T
Вы свои сообщения читаете? Я вам помог. Шаблонная функция с двумя параметрами, жду

Цитата Сообщение от jugu Посмотреть сообщение
Возьми T = int и просуммируй массив чисел, близких к предельному положительному числу типа int
Да, наверное, я сделал что-то другое, показывая эту недоработку шаблонной функции Yetty. Листните тему выше, если глаза есть

Цитата Сообщение от jugu Посмотреть сообщение
Поэтому и берем более широкий тип для результата.
Где вы его возьмете? Я написал:

C++
1
2
3
4
5
6
7
8
9
template<typename T, typename U>
U sum(T* a, int left = 0, int right = n - 1) {
  U ans = 0;
 
  for (; left <= right; ++left)
    ans += a[left];
 
  return ans;
}
Что возвращает, как возращает, как компилятор должен понять, что там будет short, int, long и т.д. - не понятно

>Берешь double как результат
>не стилистично

То есть криво - это не может быть одновременно не стилистично и неправильно. Да, нужно быть профессиональным логиком, чтобы заметить эту семантическую неоднозначность понятия. Раскрыли значения понятия по-своему, посмеялись над собеседником, хотя он имел ввиду совсем не это, и довольны. Грац

>напишите свой код
>ахахах, ты не видишь что ли вот так и так делай

Очень интересный уровень аргументации
0
609 / 414 / 151
Регистрация: 11.01.2019
Сообщений: 1,742
17.01.2019, 13:06 17
Вот, последний твой код мне нравится гораздо больше
0
884 / 340 / 78
Регистрация: 17.05.2015
Сообщений: 1,095
17.01.2019, 13:31 18
Цитата Сообщение от Brudagon Посмотреть сообщение
Аргументы left и right использовать как аргументы по умолчанию.
Функция должна так же работать с типами short,float,double.
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 <cassert>
   
template<class T, size_t N>    
auto summ(const T (&arr)[N], const size_t left = 0, const size_t right = N - 1)
{
    static_assert(
        N > 0,
        "[ERROR] size of array can not be zero"
    );
    assert(left  < N);
    assert(right < N);
    
    using Ret_t = decltype(arr[0] + arr[0]);
    
    Ret_t res = 0;
    size_t index = left;
    const auto count = right + 1;
 
    while(index != count)
        res += arr[index],
        ++index;
 
    return res;
}
 
int main()
{
    const char arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 120, 121 };
    std::cout << "res = " << summ(arr)       << '\n';  // 286
    std::cout << "res = " << summ(arr, 2, 4) << '\n';  // 12
}
0
83 / 20 / 0
Регистрация: 30.10.2018
Сообщений: 106
17.01.2019, 15:37 19
Цитата Сообщение от ReDoX Посмотреть сообщение
template<typename T, typename U>
можно поинтересоваться, как такая конструкция называется?
0
0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 3
26.02.2020, 17:02 20

///
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2020, 17:02

Найти сумму элементов массива с номерами от K до L включительно
Дан массив размера N и целые числа K и L (1 &lt;K &lt; L &lt; N). Найти сумму элементов массива с номерами...

Найти сумму элементов массива с номерами от K до L включительно
Дан массив размера N и целые числа K и L (0 &lt;=K&lt;=L&lt;=N-1). Найти сумму элементов массива с номерами...

Найти сумму элементов массива с номерами от K до L включительно
Дан массив размера N и целые числа K и L (1  K  L  N). Найти сумму элементов массива с номерами...

Найти сумму всех элементов массива, кроме элементов с номерами от k до l включительно
если кто сможет решить,буду очень-очень благодарна. вот задачи: 1)ДАН МАССИВ РАЗМЕРА N И ЦЕЛЫЕ...


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

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

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