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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
xWailx
Сообщений: n/a
08.09.2011, 11:40     Вывести сообщение о том, что все элементы в массиве равны #1
Здравствуйте... суть проблемы состоит в том, что я не знаю, как вывести сообщение о том, что все элементы массива равны между собой.
Задача заключается в том, чтобы найти сумму элементов до минимального элемента массива, а в случае, если все элементы равны, то есть все минимальные (например только нули или только единицы) - вывести сообщение об этом. А так же если минимальный элемент стоит первым в массиве. ( например первый элемент 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     Вывести сообщение о том, что все элементы в массиве равны
Посмотрите здесь:

Дана последовательность а1,а2,…,а15. Верно ли, что все элементы последовательности равны между собой? C++
C++ дана целочисленная матрица A , размером а х м, найти в матрице первую строку, все элементы которой равны нолю, Умножить элементы столбца с таким же н
C++ Найти в массиве минимальный и максимальный элементы. Вывести в порядке возрастания все целые числа из интервала
C++ В двумерном массиве вывести все элементы выше главной диагонали и ниже побочной
Вывести массивы номеров строк и столбцов, все элементы которых равны только 1 или только 0 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 12:06     Вывести сообщение о том, что все элементы в массиве равны #2
самый просто способ - сделай bool check = false;
если твое условие выполняется - делать истиной.
в конце проверки смотреть, true или false
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 12:13     Вывести сообщение о том, что все элементы в массиве равны #3
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
#include <iostream>
using namespace std;
 
int main()
{
    int * arr, n;
 
    cout << "Array size:\n>";
    cin >> n;
 
    arr = new int [n];
 
    cout << "Values:\n>";
 
    for( int i = 0; i < n; i++ )
        cin >> arr[i];
 
    cout << "Done. Last accepted element is " << arr[ n-1 ] << "\n\n";
 
    int min = arr[0],
        min_id = 0,
        summ = 0;
 
    bool allEqual = true;
 
    for( int i = 0; i < n; i++ )
    {
        if( arr[i] < min )
        {
            min = arr[i];
            min_id = i;
            allEqual = false;
        }
 
        summ += arr[i];
    }
 
    if( allEqual )
        cout << "All elements are equal";
    else
        cout << "Minimal element is arr[" << min_id << "] == " << min;
 
    cout << "\nSumm = " << summ << '\n';
 
    delete [] arr; // освобождать память не забывайте!
 
    return 0;
}
Вывод
Array size:
>5
Values:
>-1 -1 -1 -1 -1
Done. Last accepted element is -1

All elements are equal
Summ = -5


Добавлено через 33 секунды

Не по теме:

co6ak, мысли читаете?

-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 12:43     Вывести сообщение о том, что все элементы в массиве равны #4
Код и скриншоты работы
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;
}
Миниатюры
Вывести сообщение о том, что все элементы в массиве равны   Вывести сообщение о том, что все элементы в массиве равны   Вывести сообщение о том, что все элементы в массиве равны  

-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 12:45     Вывести сообщение о том, что все элементы в массиве равны #5
talis, проверять одинаковость элементов целесообразней при вводе, экономим как минимум 1 цикл...
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 12:46     Вывести сообщение о том, что все элементы в массиве равны #6
-=ЮрА=-, у меня всего один цикл

Добавлено через 20 секунд
впрочем, да, его можно сэкономить
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 12:47     Вывести сообщение о том, что все элементы в массиве равны #7
Цитата Сообщение от talis Посмотреть сообщение
впрочем, да, его можно сэкономить
- также целесообразней не находить минимальный если все элементы одинаковы - тоже экономия
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 12:48     Вывести сообщение о том, что все элементы в массиве равны #8
-=ЮрА=-, у вас у самого три цикла и ненужный вызов
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.09.2011, 12:54     Вывести сообщение о том, что все элементы в массиве равны #9
а как на счет такого варианта нахождения одинаковы ли все элементы в массиве

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 <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    vector<int> v;
 
    v.push_back(1);
    v.push_back(1);
    v.push_back(1);
    v.push_back(1);
    v.push_back(1);
    v.push_back(9);
    v.push_back(1);
 
    if ( 1 == v.size())
        exit(0);
 
    int d = 0;
    for(int i = 0; i < v.size(); ++i)
    {
        d ^= v[i];
    }
 
    if (d == v[0] &&  d == v[1])
        cout << "all equal";
        else cout <<"not all equal";
}
???
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 13:42     Вывести сообщение о том, что все элементы в массиве равны #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
???
Три ошибки в логике:
1. Для чётного количества одинаковых элементов не работает.
2. Для разных чисел, но записанных парами и первым числом, записанным три раза - не работает.
3. Для любых наборов чисел которые после маскирования совпадут с первыми двумя одинаковыми числами.
Не годится в общем такое решение.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.09.2011, 14:07     Вывести сообщение о том, что все элементы в массиве равны #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <algorithm>
 
template <class C> bool have_only_one_different_element( const std::vector< C >& vec )
{
        return std::min_element( vec.begin(), vec.end() ) == std::max_element( vec.begin(), vec.end() );
}
 
int main()
{
        std::vector<int> arr (5, 0);
        std::cout << std::boolalpha << have_only_one_different_element( arr ) << std::endl;
        
        arr[0] = 1;
        std::cout << std::boolalpha << have_only_one_different_element( arr ) << std::endl;
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 14:26     Вывести сообщение о том, что все элементы в массиве равны #12
diagon, зачем же два цикла (в min_element и в max_element), когда можно так:

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
#include <iostream>
#include <iterator>
#include <algorithm>
 
using namespace std;
 
int main()
{
    int i = 0,
        summ = 0,
        min;
 
    bool allEqual = true;
 
    for_each( istream_iterator<int>( cin ), istream_iterator<int>(),
             [&]( int el )
             {
                if( i++ == 0 )
                   min = el;
                else if( el < min )
                {
                  min = el;
                  allEqual = false;
                }
                summ += el;
             } );
 
    if( allEqual )
       cout << "All equal.";
    else
       cout << "Min = " << min;
 
    cout << " Summ = " << summ;
 
    return 0;
}
В конце ввода просто делаете format error (буковку там вводите, например).
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.09.2011, 14:47     Вывести сообщение о том, что все элементы в массиве равны #13
Цитата Сообщение от talis Посмотреть сообщение
diagon, зачем же два цикла (в min_element и в max_element), когда можно так:
Много букаф
Еще пара вариантов c STL
C++
1
2
3
4
template <class C> bool have_only_one_different_element( std::vector< C > vec )
{
        return std::unique( vec.begin(), vec.end() ) == vec.begin() + 1;
}
C++
1
2
3
4
5
template <class C> bool have_only_one_different_element( std::vector< C > vec )
{
        std::sort( vec.begin(), vec.end() );
        return *vec.begin() == *(vec.end() - 1);
}
C++
1
2
3
4
template <class C> bool have_only_one_different_element( const std::vector< C >& vec )
{
        return std::count( vec.begin(), vec.end(), *vec.begin() ) == (int) vec.size() ;
}
Можно еще кучу алгоритмов STL использовать, но суть не особо поменяется.

Последний вариант самый быстрый из всех возможных вроде. Хотя нет, можно быстрее.

Так побыстрее должно быть =\
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
 
template <class Forward_iterator> bool isnt_unique( Forward_iterator begin, Forward_iterator end )
{
    for ( Forward_iterator it = begin + 1; it != end ; ++it )
        if (*it != *begin)
            return false;
    return true;
}
 
int main()
{
        std::vector<int> arr (5, 0);
        std::cout << std::boolalpha << isnt_unique( arr.begin(), arr.end() ) << std::endl;
        
        arr[0] = 1;
        std::cout << std::boolalpha << isnt_unique( arr.begin(), arr.end() ) << std::endl;
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 14:50     Вывести сообщение о том, что все элементы в массиве равны #14
diagon, а если одновременно с этим считать сумму всех элементов и искать минимальный, как сказано в задании, то вы не далеко уйдёте от других вариантов в этом топике)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.09.2011, 14:57     Вывести сообщение о том, что все элементы в массиве равны #15
Да ну... Это как с задачей про чайник.
1-я задача: Дано - пустой чайник, кран, плита. Как скипятить чайник? Физик:
налить в чайник воду, поставить на плиту. Математик: налить в чайник воду,
поставить на плиту.
2-я задача: Дано - полный чайник, кран, плита. Как скипятить
чайник? Физик: поставить чайник на плиту. Математик: вылить воду из чайника.
Таким образом, задача сводится к предыдущей.
-=ЮрА=-
Заблокирован
Автор 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";
Ввод и если все одинаковы Мин даже не считаем...
talis
 Аватар для talis
789 / 541 / 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;
}
Вот и три цикла
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 17:11     Вывести сообщение о том, что все элементы в массиве равны #18
Цитата Сообщение от talis Посмотреть сообщение
а если одновременно с этим считать сумму всех элементов и искать минимальный
Нужно считать сумму элементов до минимального, а не сумму всех. За один проход задача не решаема.

И, почему-то, ещё ни одного рекурсивного варианта не было.)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 17:13     Вывести сообщение о том, что все элементы в массиве равны #19
Как всегда, какая-нибудь маааленькая хренушечка, которую ты не заметил, обязательно всё портит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2011, 17:55     Вывести сообщение о том, что все элементы в массиве равны
Еще ссылки по теме:

C++ Верно ли что все элементы последовательности равны между собой
Верно ли, что все элементы заданной последовательности равны между собой? C++
В двумерном массиве найти элементы, что введет пользователь и потом эти элементы сплюсовать и вывести C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор 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
* * * * * * * * {
Yandex
Объявления
08.09.2011, 17:55     Вывести сообщение о том, что все элементы в массиве равны
Ответ Создать тему
Опции темы

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