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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
xWailx
Сообщений: n/a
#1

Вывести сообщение о том, что все элементы в массиве равны - C++

08.09.2011, 11:40. Просмотров 2766. Ответов 29
Метки нет (Все метки)

Здравствуйте... суть проблемы состоит в том, что я не знаю, как вывести сообщение о том, что все элементы массива равны между собой.
Задача заключается в том, чтобы найти сумму элементов до минимального элемента массива, а в случае, если все элементы равны, то есть все минимальные (например только нули или только единицы) - вывести сообщение об этом. А так же если минимальный элемент стоит первым в массиве. ( например первый элемент 1, а все остальные больше 1) то естественно сумма будет равна 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
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
 
void main()
{
    int*arr;
    setlocale (0, "rus");
    int n;
    cout<<"Введите размерность массива: ";
    cin>>n;
    cout<<"\n Введите элементы массива:";
    arr=new int[n];
    for(int i=0; i<n; i++)
    {
        cout<<"\n Элемент № "<<i<<" = ";
        cin>>arr[i];
    }
    int min=arr[0];
    int ind=0;
 
    for(int i=0; i<n; i++)
 
    {
       if(arr[i]<min)
       {
          min=arr[i];
          ind=i;
       }
       
    }
    int sum=0;
    for(int i=0; i<ind; i++)
    {
 
    {
          sum+=arr[i];
    }
    
    }
    cout<<"Min= "<< min <<'\n';
    cout<<"Sum= "<< sum <<'\n';
  system ("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2011, 11:40     Вывести сообщение о том, что все элементы в массиве равны
Посмотрите здесь:
C++ Верно ли что все элементы последовательности равны между собой
Верно ли, что все элементы заданной последовательности равны между собой? C++
Дана последовательность а1,а2,…,а15. Верно ли, что все элементы последовательности равны между собой? C++
Вывести произвольно взятую единицу измерения массива , у которого все элементы индекса равны C++
В двумерном массиве найти элементы, что введет пользователь и потом эти элементы сплюсовать и вывести C++
Вывести массивы номеров строк и столбцов, все элементы которых равны только 1 или только 0 C++
C++ В заданном массиве вывести на консоль все элементы, удовлетворяющие условию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
08.09.2011, 18:28     Вывести сообщение о том, что все элементы в массиве равны #21
Цитата Сообщение от Deviaphan Посмотреть сообщение
И, почему-то, ещё ни одного рекурсивного варианта не было.
По просьбам трудящихся
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
#include <stdio.h>
#define count(arr) ( sizeof(arr) / sizeof(*(arr)) )
    
int * min_element(const int * arr, const size_t size){
    return ( size < 2 ) ? (int*)arr : ( *arr > *(arr + size - 1) ) ? min_element(arr + 1, size - 1) : min_element(arr, size - 1);
}
 
int sum(const int * arr, const size_t size){
    return ( size ) ? *arr + sum(arr + 1, size - 1) : 0;
}
 
void dump(const int * arr, const size_t size){
    if ( size ){
        printf("%d ", *arr);
        dump(arr + 1, size - 1);
    }
    else
        printf("\n");
}
 
int main(void){
    int a[] = { 3, 2, 5, 1, 4, 1 };
    int b[] = { 1, 2, 3, 4, 5 };
    int c[] = { 0, 0, 0 };
    
    int * f;
    
    printf("Array A: ");
    dump(a, count(a));
    if ( ( f = min_element(a, count(a)) ) == a )
        printf("Min element is the first in array or all elements are the same.\n");
    else
        printf("Sum of elements before min: %d\n", sum(a, f - a));
    
    printf("Array B: ");
    dump(b, count(b));
    if ( ( f = min_element(b, count(b)) ) == b )
        printf("Min element is the first in array or all elements are the same.\n");
    else
        printf("Sum of elements before min: %d\n", sum(b, f - b));
    
    printf("Array C: ");
    dump(c, count(c));
    if ( ( f = min_element(c, count(c)) ) == c )
        printf("Min element is the first in array or all elements are the same.\n");
    else
        printf("Sum of elements before min: %d\n", sum(c, f - c));
    
    return 0;
}
Кстати, в чём глубинный смысл определения того, что все элементы одинаковые? Нужно просто искать не минимальное значение в массиве, а позицию первого элемента с минимальным значением. Если он первый в массиве - складывать в любом случае нечего.
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.09.2011, 18:48     Вывести сообщение о том, что все элементы в массиве равны #22
Цитата Сообщение от Deviaphan Посмотреть сообщение
Нужно считать сумму элементов до минимального, а не сумму всех. За один проход задача не решаема.
Решаема.
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 <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
int main()
{
    int arr[] = { 2, 3, 4, 1, 5 };
    
    int size = sizeof(arr) / sizeof(*arr);
    
    int * dinamic = (int*) malloc( size * sizeof(int) );
    
    dinamic[0] = arr[0];
    
    int min = INT_MAX, pos = 0;
    
    for (int i = 0; i < size; ++i)
    {
        if (arr[i] < min)
        {
            min = arr[i];
            pos = i;
        }
        
        if ( i != 0 )
            dinamic[i] = dinamic[i - 1] + arr[i];
    }
    
    printf("%d\n", pos ? dinamic[pos - 1] : 0);
    
    free(dinamic);
}
С небольшой натяжкой это можно отнести к динамическому программированию...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 18:52     Вывести сообщение о том, что все элементы в массиве равны #23
Цитата Сообщение от diagon Посмотреть сообщение
Решаема.
Как всегда. Уменьшение времени за счёт увеличения использования памяти.)
Я был некорректен. Не решаема без увеличения объёма памяти вдвое.)
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.09.2011, 18:55     Вывести сообщение о том, что все элементы в массиве равны #24
Цитата Сообщение от Deviaphan Посмотреть сообщение
Для чётного количества одинаковых элементов не работает.
действительно
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.09.2011, 19:04     Вывести сообщение о том, что все элементы в массиве равны #25
Цитата Сообщение от Deviaphan Посмотреть сообщение
Как всегда. Уменьшение времени за счёт увеличения использования памяти.)
Я был некорректен. Не решаема без увеличения объёма памяти вдвое.)
Ну... Если массив больше не понадобится, то можно обойтись им одним =\ Причем код еще компактнее становится...
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
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
int main()
{
        int arr[] = { 2, 3, 4, 1, 5 };
        
        int size = sizeof(arr) / sizeof(*arr);
        
        int min = INT_MAX, pos = 0;
        
        for (int i = 0; i < size; ++i)
        {
                if (arr[i] < min)
                {
                        min = arr[i];
                        pos = i;
                }
                
                if ( i != 0 )
                        arr[i] += arr[i - 1];
        }
        
        printf("%d\n", pos ? arr[pos - 1] : 0); //если все элементы массива равны или минимальный элемент стоит первым - выводится ноль.
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 19:23     Вывести сообщение о том, что все элементы в массиве равны #26
Цитата Сообщение от diagon Посмотреть сообщение
Ну...
Вот про такое решение я даже не подумал.) В условии задачи нет ни слова о неизменности исходного массива, так что этот вариант я назначаю самым качественным!
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
08.09.2011, 21:06     Вывести сообщение о том, что все элементы в массиве равны #27
Цитата Сообщение от Deviaphan Посмотреть сообщение
Как всегда. Уменьшение времени за счёт увеличения использования памяти.)
Я был некорректен. Не решаема без увеличения объёма памяти вдвое
Без увеличения памяти и изменения массива.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#define N 5
 
int main()
{
   int a[N] = {3, 1, 4, 5, 7};
   int i, min, s1, s2, flag;
 
   flag = s1 = s2 = 0;
   min = a[0];
   for(i = 0; i < N; i++)
   {
       if (a[i] < min)
       {
          s2 = s1;
          min = a[i];
          flag = 1;
       }
       s1 += a[i];
   }
   flag ? printf("%d\n", s2) : printf("all elements == min OR a[0] == min");
   return 0;
}
Или я что-то недопонял?

Добавлено через 8 минут
Можно так еще:

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
#include <stdio.h>
#include <limits.h>
#define N 5
 
int main()
{
   int a[N] = {3, 1, 4, 5, 7};
   int i, min, s1, s2, j;
 
   s1 = s2 = 0;
   min = INT_MAX;
   j = -1;
   for(i = 0; i < N; i++)
   {
       if (a[i] < min)
       {
          s2 = s1;
          min = a[i];
          j = i;
       }
       s1 += a[i];
   }
   switch(j)
   {
      case -1:
         puts("all elements == min");
         break;
      case 0:
         puts("a[0] == min");
         break;
      default:
         printf("%d\n", s2);
   }
   return 0;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 06:34     Вывести сообщение о том, что все элементы в массиве равны #28
Цитата Сообщение от Thinker Посмотреть сообщение
Или я что-то недопонял?
Не сумму всех, а сумму до минимального элемента.

Оптимальное решение уже в посте 25 предоставлено.

Если исходный массив модифицировать нельзя, то можно вторым циклом вычесть лишние элементы из общей суммы, но это уже второй цикл...
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
09.09.2011, 09:47     Вывести сообщение о том, что все элементы в массиве равны #29
Цитата Сообщение от Deviaphan Посмотреть сообщение
Не сумму всех, а сумму до минимального элемента.
Так у меня и ищется сумма до первого минимального элемента. И алгоритм очень оптимальный. Нет дополнительных массивов и не меняем элементы исходного массива.

Цитата Сообщение от Thinker Посмотреть сообщение
Или я что-то недопонял?
А эта фраза просто означает, что непонятно почему такая простая задача вызвала споры.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2011, 10:51     Вывести сообщение о том, что все элементы в массиве равны
Еще ссылки по теме:
C++ В двумерном массиве вывести все элементы выше главной диагонали и ниже побочной
C++ Вывести одинаковые числа в массиве или сообщение, что таких чисел нет
C++ дана целочисленная матрица A , размером а х м, найти в матрице первую строку, все элементы которой равны нолю, Умножить элементы столбца с таким же н
C++ Найти в массиве минимальный и максимальный элементы. Вывести в порядке возрастания все целые числа из интервала
C++ Заменить в массиве все отрицательные элементы средним арифметическим значением всех положительных, вывести оба массива

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 10:51     Вывести сообщение о том, что все элементы в массиве равны #30
Цитата Сообщение от Thinker Посмотреть сообщение
ак у меня и ищется сумма до первого минимального элемента
Извиняюсь, не правильно прочитал алгоритм.)
Твой вариант ещё лучше, теперь это назначается самым оптимальным вариантом.

На заметку: Вот что значит делать преждевременные выводы, не подумав...

Добавлено через 1 минуту
Не увидел присваивания s2=s1, потому и решил, что сумма всех считается.
Yandex
Объявления
09.09.2011, 10:51     Вывести сообщение о том, что все элементы в массиве равны
Ответ Создать тему
Опции темы

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