Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Руслан Волошин
1 / 1 / 0
Регистрация: 01.02.2019
Сообщений: 12
1

Определить сумму положительных элементов, расположенных между минимальным и максимальным элементами данного массива

01.02.2019, 09:43. Просмотров 1136. Ответов 13
Метки c++ (Все метки)

В массиве А, содержащем 14 элементов, определить сумму положительных элементов, расположенных между минимальным и максимальным элементами данного массива.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2019, 09:43
Ответы с готовыми решениями:

Найти сумму положительных элементов массива, расположенных между минимальным и максимальным элементами
Попросили решить задачу,дан массив чисел,нужно вывести два числа, разделенных пробелом: сумму...

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

Найти сумму элементов массива, расположенных между максимальным и минимальным элементами
Всем привет. Сегодня столкнулся с проблемой, моя программа не хочет выполнять действия после 3...

Вычислить сумму нечетных элементов массива, расположенных между максимальным и минимальным элементами
В одномерном массиве состоящем из 10 вещественных элементов,вычислить сумму нечетных элементов...

В массиве вычислить сумму нечетных элементов массива, расположенных между максимальным и минимальным элементами
1. В одномерном массиве, состоящем из 8 вещественных элементов, вычислить сумму нечетных элементов...

13
Reddyard
5 / 5 / 0
Регистрация: 12.11.2013
Сообщений: 19
02.02.2019, 13:28 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
#include <stdio.h>
#include <time.h>
 
int main()
{
    srand( time(NULL) );
 
    int i, arr[14], min, indmin, max, indmax, sum = 0;;
 
    /* Заполняем arr случайными числами от -100 до 100 */
    for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
        arr[i] = ( rand() % 101 ) * ( ( rand() % 2 ) ? 1 : -1 );
        printf("%d ", arr[i]);
    }
 
    /* Определяем индексы наименьшего и наибольшего членов arr */
    for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
        if ( arr[i] < min ) {
            min = arr[i]; indmin = i;
        }
        if ( arr[i] > max ) {
            max = arr[i]; indmax = i;
        }
    }
 
    /* в случае, если наименьший член имеет меньший индекс */
    if ( indmin < indmax ) {
        for( i = indmin + 1; i < indmax; ++i )
            if ( arr[i] > 0 )
                sum += arr[i];
    }
    /* иначе */
    else {
        for( i = indmax + 1; i < indmin; ++i )
            if ( arr[i] > 0 )
                sum += arr[i];
    }
 
    printf( "\n%min: %d max: %d sum: %d\n", min, max, sum );
 
    return 0;
}
1
Байт
Эксперт C
20450 / 12980 / 2728
Регистрация: 24.12.2010
Сообщений: 27,157
02.02.2019, 13:40 3
Reddyard, я бы строки, начиная с 26 оформил так
C
1
2
3
4
5
6
7
8
9
10
if ( indmin < indmax ) {
  ifirst = indmin;
  ilast = indmax;
}
else {
  ifirst = indmax;
  ilast = indmim;
}
for( i = ifirst + 1; i < ilast; ++i )
  ....
В данном случае это ведет даже к удлинению кода. Но если в рабочем цикле производится более серьезная работа, этот прием может оказаться полезным.
1
Reddyard
5 / 5 / 0
Регистрация: 12.11.2013
Сообщений: 19
02.02.2019, 13:43 4
Байт,
ну там да, намудрил я, нужно было подольше подумать все же.
0
02.02.2019, 13:43
Байт
Эксперт C
20450 / 12980 / 2728
Регистрация: 24.12.2010
Сообщений: 27,157
02.02.2019, 13:45 5
Reddyard, Но если предыдущее замечание было всего лишь предложением, то посмотрев на ваш код повнимательнее, обнаружил уже ошибку. В строках 18, 21 вы сравниваете с min, max, которые в этот момент еще не получили значения, то есть с мусором. Правильно так (один из вариантов)
C
1
2
3
4
5
6
7
8
    for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
        if (i==0 || arr[i] < min ) {
            min = arr[i]; indmin = i;
        }
        if ( i==0 || arr[i] > max ) {
            max = arr[i]; indmax = i;
        }
    }
1
Reddyard
5 / 5 / 0
Регистрация: 12.11.2013
Сообщений: 19
02.02.2019, 13:53 6
Байт,
несколько прогонов в Qt убедили меня, что код работает, но вы правы, это упущение и на другой платформе результат может опечалить. Ниже прикрепляю подправленный код.
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
#include <stdio.h>
#include <time.h>
 
int main()
{
    srand( time(NULL) );
 
    int i, arr[14], min, indmin, max, indmax, sum = 0;;
 
    /* Заполняем arr случайными числами от -100 до 100 */
    for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
        arr[i] = ( rand() % 101 ) * ( ( rand() % 2 ) ? 1 : -1 );
        printf("%d ", arr[i]);
    }
 
    /* Определяем индексы наименьшего и наибольшего членов arr */
    for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
        if ( i == 0 || arr[i] < min ) {
            min = arr[i]; indmin = i;
        }
        if ( i == 0 || arr[i] > max ) {
            max = arr[i]; indmax = i;
        }
    }
 
    /* в случае, если наименьший член имеет меньший индекс */
    if ( indmin < indmax ) {
        for( i = indmin + 1; i < indmax; ++i )
            if ( arr[i] > 0 )
                sum += arr[i];
    }
    /* иначе */
    else {
        for( i = indmax + 1; i < indmin; ++i )
            if ( arr[i] > 0 )
                sum += arr[i];
    }
 
    printf( "\n%min: %d max: %d sum: %d\n", min, max, sum );
 
    return 0;
}
2
Руслан Волошин
1 / 1 / 0
Регистрация: 01.02.2019
Сообщений: 12
02.02.2019, 16:40  [ТС] 7
Спасибо большое, а то искал вариант решения, ни один не подходил под условие задачи
0
stake-k26
659 / 456 / 349
Регистрация: 25.04.2016
Сообщений: 1,309
02.02.2019, 17:01 8
Лучший ответ Сообщение было отмечено Руслан Волошин как решение

Решение

Я бы еще добавил, что не за чем вычислять размер массива sizeof(arr) / sizeof(int), когда он и так известен arr[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
25
26
27
28
29
30
31
32
33
34
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define SIZE 14
 
int main (void)
{
    srand( (unsigned int)time(NULL)/2 );    // без приведения типов в MSVS приведет к ошибке
 
    int i, arr[SIZE], min, max, sum = 0;
 
    /* Заполняем arr случайными числами от -100 до 100 */
    for ( i = 0; i < SIZE; ++i )
        printf("%d ", arr[i] = rand() %201 - 100);
 
    /* Определяем индексы наименьшего и наибольшего членов arr */
    for ( i = 0; i < SIZE; ++i )
    {
        if ( i<1 || arr[i] < min ) min = arr[indmin = i];
        if ( i<1 || arr[i] > max ) max = arr[indmax = i];
    }
 
    /* в случае, если наименьший член имеет меньший индекс */
    int start, end;
    if (indmin < indmax) { start = indmin+1; end = indmax; }
    else { start = indmax+1; end = indmin; }
    /* находим сумму */
    for( i = start; i < end; ++i )
        if (arr[i] > 0)
            sum += arr[i];
 
    printf( "\nmin: %d max: %d sum: %d\n", min, max, sum );
    return 0;
}
Вот только меня никак не отпускает ощущение того, что... не за чем вычислять минимум и максимум, когда достаточно вычислить лишь их позиции:
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
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define SIZE 14
 
int main (void)
{
    srand( (unsigned int)time(NULL)/2 );    // без приведения типов в MSVS приведет к ошибке
 
    int i, arr[SIZE], min, max, start, end, sum = 0;
 
    /* Заполняем arr случайными числами от -100 до 100 */
    for ( i = 0; i < SIZE; ++i )
        printf("%d ", arr[i] = rand() %201 - 100);
 
    /* Определяем индексы наименьшего и наибольшего членов arr */
    min = max = 0;
    for ( i = 1; i < SIZE; ++i )
    {
        if ( arr[i] < arr[min] ) min = i;
        if ( arr[i] > arr[max] ) max = i;
    }
 
    /* в случае, если наименьший член имеет меньший индекс */
    if (min < max) { start = min+1; end = max; }
    else { start = max+1; end = min; }
    /* находим сумму */
    for( i = start; i < end; ++i )
        if (arr[i] > 0)
            sum += arr[i];
 
    printf( "\nmin: %d max: %d sum: %d\n", arr[min], arr[max], sum );
    return 0;
}
ну и наконец, зачем столько одинаковых циклов?
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
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define SIZE 14
 
int main (void)
{
    srand( (unsigned int)time(NULL)/2 );
 
    int i, arr[SIZE], start, end, min = 0, max = 0, sum = 0;
 
    /* Заполняем arr случайными числами от -100 до 100 */
    for ( i = 0; i < SIZE; ++i )
    {
        printf("%d ", arr[i] = rand() %201 - 100);      // а заодно выводим на экран
        if ( i<1 || arr[i] < arr[min] ) min = i;        // и находим минимум
        if ( i<1 || arr[i] > arr[max] ) max = i;        // и максимум
    }
 
    /* в случае, если наименьший член имеет меньший индекс */
    if (min < max) { start = min+1; end = max; }
    else { start = max+1; end = min; }
    /* находим сумму */
    for( i = start; i < end; ++i )
        if (arr[i] > 0)
            sum += arr[i];
 
    printf( "\nmin: %d max: %d sum: %d\n", arr[min], arr[max], sum );
    return 0;
}
1
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,506
Завершенные тесты: 1
02.02.2019, 18:13 9
Цитата Сообщение от Reddyard Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
/* Определяем индексы наименьшего и наибольшего членов arr */
 for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
    if ( i == 0 || arr[i] < min ) {
     min = arr[i]; indmin = i;
  }
  if ( i == 0 || arr[i] > max ) {
   max = arr[i]; indmax = i;
  }
 }
и на каждом проходе сравнения
по моему проще так
C
1
2
3
4
5
6
7
8
9
10
11
/* Определяем индексы наименьшего и наибольшего членов arr */
 min =max =arr[0];
indmin =indmax=0;
for ( i = 0; i < sizeof(arr) / sizeof(int); ++i ) {
    if (  arr[i] < min ) {
     min = arr[i]; indmin = i;
  }
  if (  arr[i] > max ) {
   max = arr[i]; indmax = i;
  }
 }
ну а совсем по феншую
C
1
2
3
4
5
6
7
8
9
10
11
/* Определяем индексы наименьшего и наибольшего членов arr */
 min =max =arr[0];
indmin =indmax=0;
for ( i = 1; i < sizeof(arr) / sizeof(int); ++i ) {
    if (  arr[i] < min ) {
     min = arr[i]; indmin = i;
  }
   if (  arr[i] > max ) {
   max = arr[i]; indmax = i;
  }
 }
0
stake-k26
02.02.2019, 18:46
  #10

Не по теме:

ValeryS, и в итоге вы написали то же самое, что было сказано постом выше и где-то на час раньше. :)

0
Руслан Волошин
1 / 1 / 0
Регистрация: 01.02.2019
Сообщений: 12
06.02.2019, 13:54  [ТС] 11
Хотелось бы с оператором вывода cout увидеть, с принт у меня не особо работает
0
Байт
Эксперт C
20450 / 12980 / 2728
Регистрация: 24.12.2010
Сообщений: 27,157
06.02.2019, 14:55 12
Цитата Сообщение от Руслан Волошин Посмотреть сообщение
с оператором вывода cout
Тогда тебе в другую ветку. С++
Но переделать легко
C++
1
2
3
4
// Есть
printf( "\n%min: %d max: %d sum: %d\n", min, max, sum );
// Заменяешь
cout << "\nmin: " << min << " max: " << max << " sum: " << sum << endl;
0
Руслан Волошин
1 / 1 / 0
Регистрация: 01.02.2019
Сообщений: 12
06.02.2019, 15:07  [ТС] 13
Я уже переделал под свое, там много чего пришлось поменять
0
stake-k26
659 / 456 / 349
Регистрация: 25.04.2016
Сообщений: 1,309
13.02.2019, 20:40 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
25
26
27
28
29
30
31
32
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define SIZE 14
 
int main (void)
{
    srand( (unsigned int)time(NULL)/2 );
 
    int i, arr[SIZE], start, end, min = 0, max = 0, sum = 0;
 
    /* Заполняем arr случайными числами от -100 до 100 */
    for ( i = 0; i < SIZE; ++i )
    {
        arr[i] = rand() %201 - 100;
        cout << arr[i] << " ";                          // выводим на экран
        if ( i<1 || arr[i] < arr[min] ) min = i;        // находим минимум
        if ( i<1 || arr[i] > arr[max] ) max = i;        // и максимум
    }
 
    /* в случае, если наименьший член имеет меньший индекс */
    if (min < max) { start = min+1; end = max; }
    else { start = max+1; end = min; }
    /* находим сумму */
    for( i = start; i < end; ++i )
        if (arr[i] > 0)
            sum += arr[i];
 
    cout << "\nmin: " << arr[min] << " max: " << arr[max] << " sum: " << sum << endl;
    return 0;
}
по сути у нас
stdio.h == iostream
stdlib.h == cstdlib
time.h == ctime
printf == std::cout

ну и для удобства, чтобы дополнительно не прописывать std::, указываем пространство имен, что дает +1 строчку к коду.
0
13.02.2019, 20:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2019, 20:40

Найти произведение элементов массива, расположенных между максимальным и минимальным элементами
Помогите, пожалуйста, найти ошибки. При выводе выдает все нули =/ Само задание : В одномерном...

Найти произведение элементов массива, расположенных между максимальным и минимальным элементами
Ребят, подскажите хотя бы с чего начать и как делать Необходимо в одномерном массиве,состоящем...

Вычислить произведение элементов массива, расположенных между максимальным и минимальным элементами
В одномерном массиве, состоящем из 10 целых элементов, вычислить произведение элементов массива,...


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

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

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