Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

08.09.2011, 11:40. Просмотров 3003. Ответов 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++
ребят помогите пожалуйста сдать лабу просто очень надо((((( Дана не пустая последовательность целых чисел, заканчивающаяся...

Верно ли, что все элементы заданной последовательности равны между собой? - C++
Дана непустая последовательность целых чисел, оканчивающаяся отрицательным числом. Верно ли, что все элементы последовательности равны...

Дана последовательность а1,а2,…,а15. Верно ли, что все элементы последовательности равны между собой? - C++
Найдите ошибку Дана последовательность а1,а2,…,а15. Верно ли, что все элементы последовательности равны между собой? #include...

Вывести произвольно взятую единицу измерения массива , у которого все элементы индекса равны - C++
Выведите произвольно взятую единицу измерения массива , у которого все элементы индекса равны Помогите

В двумерном массиве найти элементы, что введет пользователь и потом эти элементы сплюсовать и вывести - C++
Здравствуйте товарищи знатоки! Передомной постал такой вопрос: Надо в двумерном массиве найти элементы что введет пользователь и...

Вывести массивы номеров строк и столбцов, все элементы которых равны только 1 или только 0 - C++
Задан размер квадратной матрицы и значения ее элементов (0 или 1). Сформировать и вывести массив номеров строк и массив номеров столбцов,...

29
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 17:07 #16
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, у вас у самого три цикла и ненужный вызов
- где???
C++
1
2
3
4
5
6
7
8
9
10
for(i = 1; i < n; i++)
    {
                cout<<"Элемент # "<<i + 1<<" = ";
        cin>>arr[i];
                //Проверяем одинаковость всех элементов ещё при вводе
                if(arr[i] != arr[i - 1])
                        bEqual = false;
    }
        if(bEqual)
                cout<<"Все элементы массива одинаковы\r\n";
Ввод и если все одинаковы Мин даже не считаем...
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 17:10 #17
-=ЮрА=-, ваш код:

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
#include <iostream>
#include <windows.h>//нужен моей студии для подключения system ("pause")
 
using namespace std;
 
//Руссификация
ostream& operator<<(ostream &stream,char* s){
        for(char* ps=s; *ps; ps++){
                if(*ps=='ё')
                        stream<<char(241);
                else if(*ps=='Ё')
                        stream<<char(240);
                else if(*ps>=-64 && *ps<=-17)                   
                        stream<<char(*ps+64+128);
                else if(*ps<0)
                        stream<<char(*ps+64+176);
                else
                        stream<<*ps;
        }
        return stream;
}
 
int GetMin(int n, int * arr);
 
int main()
{
        bool bEqual = true;
        cout<<"Введите размерность массива: ";
    int n;cin>>n;
    cout<<"\tВведите элементы массива:\r\n";
        int * arr = new int[n];
        
        int i = 0,iMin,iSum = 0;
        cout<<"Элемент # "<<i + 1<<" = ";
    cin>>arr[i];
    for(i = 1; i < n; i++) /* <--------------------------------------- цикл номер раз */
    {
                cout<<"Элемент # "<<i + 1<<" = ";
        cin>>arr[i];
                //Проверяем одинаковость всех элементов ещё при вводе
                if(arr[i] != arr[i - 1])
                        bEqual = false;
    }
        if(bEqual)
                cout<<"Все элементы массива одинаковы\r\n";
        else
        {
                if(arr[0] == (iMin = GetMin(n,arr)))
                        cout<<"Первый элемент массива является минимальным элементом\r\n";
                else
                {
                        for(i = 0; i < n && arr[i] != iMin; i++)  /* <- цикл номер два */
                                iSum += arr[i];
                        cout<<"Cумма элементов до минимального элемента массива "<<iSum<<"\r\n";
                }
        }
        system ("pause");
        return 0;
}
 
int GetMin(int n, int * arr)
{
        int iMin = arr[0];
        for(int i = 1; i < n; i++) /* <------------------------------- цикл номер три */
                if(arr[i] < iMin)
                        iMin = arr[i];
        return iMin;
}
Вот и три цикла
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 17:11 #18
Цитата Сообщение от talis Посмотреть сообщение
а если одновременно с этим считать сумму всех элементов и искать минимальный
Нужно считать сумму элементов до минимального, а не сумму всех. За один проход задача не решаема.

И, почему-то, ещё ни одного рекурсивного варианта не было.)
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 17:13 #19
Как всегда, какая-нибудь маааленькая хренушечка, которую ты не заметил, обязательно всё портит.
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 17:55 #20
Цитата Сообщение от talis Посмотреть сообщение
/* <------------------------------- цикл номер три */
- вообще читаешь что пишу? циклы не все выполняются а по мере необходимости
Цитата Сообщение от talis Посмотреть сообщение
if(bEqual)
* * * * * * * * cout<<"Все элементы массива одинаковы\r\n";
* * * * else
* * * * {
Цитата Сообщение от talis Посмотреть сообщение
if(arr[0] == (iMin = GetMin(n,arr)))
* * * * * * * * * * * * cout<<"Первый элемент массива является минимальным элементом\r\n";
* * * * * * * * else
* * * * * * * * {
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
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;
}
Кстати, в чём глубинный смысл определения того, что все элементы одинаковые? Нужно просто искать не минимальное значение в массиве, а позицию первого элемента с минимальным значением. Если он первый в массиве - складывать в любом случае нечего.
0
diagon
Higher
1930 / 1196 / 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);
}
С небольшой натяжкой это можно отнести к динамическому программированию...
2
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 18:52 #23
Цитата Сообщение от diagon Посмотреть сообщение
Решаема.
Как всегда. Уменьшение времени за счёт увеличения использования памяти.)
Я был некорректен. Не решаема без увеличения объёма памяти вдвое.)
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.09.2011, 18:55 #24
Цитата Сообщение от Deviaphan Посмотреть сообщение
Для чётного количества одинаковых элементов не работает.
действительно
0
diagon
Higher
1930 / 1196 / 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); //если все элементы массива равны или минимальный элемент стоит первым - выводится ноль.
}
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 19:23 #26
Цитата Сообщение от diagon Посмотреть сообщение
Ну...
Вот про такое решение я даже не подумал.) В условии задачи нет ни слова о неизменности исходного массива, так что этот вариант я назначаю самым качественным!
0
Thinker
Эксперт С++
4228 / 2202 / 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;
}
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 06:34 #28
Цитата Сообщение от Thinker Посмотреть сообщение
Или я что-то недопонял?
Не сумму всех, а сумму до минимального элемента.

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

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

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

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

Добавлено через 1 минуту
Не увидел присваивания s2=s1, потому и решил, что сумма всех считается.
0
09.09.2011, 10:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2011, 10:51
Привет! Вот еще темы с ответами:

Как вывести сообщение, что элемент не найден в массиве? - C++
Куда в этом коде можно тыкнуть else&lt;&lt;&quot;Not Found&quot;;? Я пробовала написать его после break;}, но он выводил два раза Not Found и потом индекс...

В заданном массиве вывести на консоль все элементы, удовлетворяющие условию - C++
Дан целочисленный массив А размера 10. Вывести элементы массива Ак, которые удовлетворяют двойному неравенству А1&lt;Ак&lt;А10. Если таких...

В двумерном массиве вывести все элементы выше главной диагонали и ниже побочной - C++
Вообщем то задали такую задачку: В двумерном массиве вывести все элементы выше главной диагонали и ниже побочной. Но у меня получается...

Вывести одинаковые числа в массиве или сообщение, что таких чисел нет - C++
плиз помогите: дан одномерный массив, вывести одинаковые числа, и вывести если этих чисел нет; когда ставлю иначе(еlse) вывести &quot;одинаковых...


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

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

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