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

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

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

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

08.09.2011, 11:40. Просмотров 3010. Ответов 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
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 12:06 #2
самый просто способ - сделай bool check = false;
если твое условие выполняется - делать истиной.
в конце проверки смотреть, true или false
0
talis
792 / 544 / 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, мысли читаете?

0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Вывести сообщение о том, что все элементы в массиве равны   Вывести сообщение о том, что все элементы в массиве равны   Вывести сообщение о том, что все элементы в массиве равны  

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

Добавлено через 20 секунд
впрочем, да, его можно сэкономить
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 12:47 #7
Цитата Сообщение от talis Посмотреть сообщение
впрочем, да, его можно сэкономить
- также целесообразней не находить минимальный если все элементы одинаковы - тоже экономия
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 12:48 #8
-=ЮрА=-, у вас у самого три цикла и ненужный вызов
0
PointsEqual
ниначмуроФ
836 / 520 / 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";
}
???
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 13:42 #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
???
Три ошибки в логике:
1. Для чётного количества одинаковых элементов не работает.
2. Для разных чисел, но записанных парами и первым числом, записанным три раза - не работает.
3. Для любых наборов чисел которые после маскирования совпадут с первыми двумя одинаковыми числами.
Не годится в общем такое решение.
0
diagon
Higher
1930 / 1196 / 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;
}
0
talis
792 / 544 / 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 (буковку там вводите, например).
0
diagon
Higher
1930 / 1196 / 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;
}
2
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 14:50 #14
diagon, а если одновременно с этим считать сумму всех элементов и искать минимальный, как сказано в задании, то вы не далеко уйдёте от других вариантов в этом топике)
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.09.2011, 14:57 #15
Да ну... Это как с задачей про чайник.
1-я задача: Дано - пустой чайник, кран, плита. Как скипятить чайник? Физик:
налить в чайник воду, поставить на плиту. Математик: налить в чайник воду,
поставить на плиту.
2-я задача: Дано - полный чайник, кран, плита. Как скипятить
чайник? Физик: поставить чайник на плиту. Математик: вылить воду из чайника.
Таким образом, задача сводится к предыдущей.
1
08.09.2011, 14:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2011, 14:57
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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