Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
noname12345
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 156
1

Не входит в первый if, который ищет минимальный элемент

21.01.2019, 19:33. Просмотров 290. Ответов 21
Метки нет (Все метки)

Подскажите почему не входит в первый if, который ищет минимальный элемент ?
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
#include "pch.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); // подключение русского языка
    int size; // кол-во элементов массива
    cout << "Введите размер массива:" << endl;
    cin >> size; // ввод размера массива
    int* arr = new int[size]; // создание динамического массива
    for (int i = 0; i < size; i++) // цикл по кол-во элементов
    {
        cout << "arr[" << i << "]: ";
        cin >> arr[i];  // ввод элементов массива
    }   
 
int Min = 0;
    int Max = 0;
    int IndexMin = 0, IndexMax = 0;
    for (int i = 0; i < size; i++) // цикл по кол-во элементов
    {
 
        if (Min > arr[i])
        {
            Min = arr[i];
            IndexMin = i;
        }
        else if (arr[i] > Max)
        {
            Max = arr[i];
            IndexMax = i;
        }
    }
 
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2019, 19:33
Ответы с готовыми решениями:

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

Заменить первый максимальный нечетный элемент в заштрихованной области, на первый минимальный четный элемент
#include&lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #include&lt;limits.h&gt;...

Поменять местами первый максимальный четный элемент массива и первый минимальный нечетный элемент
Помогите начало знаю как сделать а дальше нет #include&lt;iostream&gt; #include &lt;stdlib.h&gt; #include...

Функция находит в строке первый символ, который не входит в другую строку
Нужно написать собственную функцию, которая находит в строке первый символ, который не входит в...

Функция находит в строке первый символ, который входит в другую заданную строку
нужно написать собственную функцию, которая находит в строке первый символ, который входит в другую...

21
StudAssistant
Эксперт
34811 / 27003 / 5019
Регистрация: 17.04.2006
Сообщений: 49,622
21.01.2019, 19:33
Закажите контрольную, курсовую, диплом или любую другую студенческую работу здесь.
21
_stanislav
(50 / 50 || 80 / 20) ?
956 / 725 / 295
Регистрация: 16.08.2014
Сообщений: 3,010
Завершенные тесты: 2
21.01.2019, 19:40 2
Цитата Сообщение от noname12345 Посмотреть сообщение
Подскажите почему не входит в первый if, который ищет минимальный элемент ?
все нормально входит
0
CaptanMax
0 / 0 / 0
Регистрация: 21.01.2019
Сообщений: 5
21.01.2019, 19:51 3
Не входить в if может только если условие внутри скобок (условия if) неверно. Следовательно, при прохождении счетчика условие не выполняется, т.е. min не больше того значения, которое вы ввели. Таковым оно может быть, если оно (значение в массиве) больше нуля, ведь min = 0 и идет проверка: Если min(0) больше значения в массиве, то min присваивается значение массива, на котором сейчас счетчик.
К тому же, я подозреваю, что Вы в принципе написали неверное условие для нахождения минимального и максимального значений в массиве. Для нахождения минимального значения min необходимо присвоить 9, а дальше сравнивать его с массивом. Если min меньше значения в массиве, то присваиваем min это значение. Для max все наоборот.
P.S Не забывайте удалять динамически созданный массив.
0
bogdaneyziy
6 / 4 / 2
Регистрация: 01.05.2018
Сообщений: 42
21.01.2019, 19:52 4
Скорее всего под условие не подходит..
0
21.01.2019, 19:52
CaptanMax
0 / 0 / 0
Регистрация: 21.01.2019
Сообщений: 5
21.01.2019, 20:00 5
В общем, проверьте, что Вы вводите, а также научитесь пользоваться отладчиком, он Вам огромное количество времени сэкономит)
P.S Мой пример с 0 и 9 всего лишь пример. Девять можете заменить другим максимальным значением, все зависит от условия.
0
bogdaneyziy
6 / 4 / 2
Регистрация: 01.05.2018
Сообщений: 42
21.01.2019, 20:04 6
CaptanMax, а зачем присваивать именно значение 9 или какое-либо другое конкретное, если можно присвоить как минимуму так и максимуму первый элемент массива и потом уже сравнивать?))
0
_stanislav
(50 / 50 || 80 / 20) ?
956 / 725 / 295
Регистрация: 16.08.2014
Сообщений: 3,010
Завершенные тесты: 2
21.01.2019, 20:06 7
noname12345, можешь так попробовать
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
#include "pch.h"
#include <iostream>
#include <limits>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian"); // подключение русского языка
    int size; // кол-во элементов массива
    cout << "Введите размер массива:" << endl;
    cin >> size; // ввод размера массива
    int* arr = new int[size]; // создание динамического массива
    for (int i = 0; i < size; i++) // цикл по кол-во элементов
    {
        cout << "arr[" << i << "]: ";
        cin >> arr[i];  // ввод элементов массива
    }   
 
int Min = std::numeric_limits<int>::min();
    int Max = std::numeric_limits<int>::max();
    int IndexMin = 0, IndexMax = 0;
    for (int i = 0; i < size; i++) // цикл по кол-во элементов
    {
 
        if (Min > arr[i])
        {
            Min = arr[i];
            IndexMin = i;
        }
        else if (arr[i] > Max)
        {
            Max = arr[i];
            IndexMax = i;
        }
    }
 
}
0
CaptanMax
0 / 0 / 0
Регистрация: 21.01.2019
Сообщений: 5
21.01.2019, 20:14 8
Ну да, можно и так, тут тупанул немного) Просто вспомнил изначально задачку, где давался не массив, а просто какое-то число. А в числе уже, как известно, цифры от 0 до 9 :-)
0
Yetty
2187 / 1547 / 1069
Регистрация: 18.12.2017
Сообщений: 5,159
21.01.2019, 20:40 9
Цитата Сообщение от noname12345 Посмотреть сообщение
Подскажите почему не входит в первый if, который ищет минимальный элемент ?
min инициализирован неправильным значением:
Цитата Сообщение от noname12345 Посмотреть сообщение
int Min = 0;
нужно инициализировать min максимальным значением для используемого типа данных. если у Вас массив типа int min=2147483647; ( можно подключить #include <climits> и тоже самое записать так: int min=INT_MAX; )
также min можно инициализировать значением первого элемента массива:
min=a[0]; (или чтобы не записывать строку min=a[0]; указать это в условии: if (i==0 || a[i]<min)

и уберите слово else - нахождение min и max не связано одно с другим.
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 402
22.01.2019, 00:42 10
Цитата Сообщение от Yetty Посмотреть сообщение
и уберите слово else - нахождение min и max не связано одно с другим.
Ну, это ты погорячился...
Конечно же, связаны, поскольку они оба сравниваются с одним и тем же элементом массива. А этот самый элемент не может быть одновременно меньше min и больше max. Отсюда следует, что если выполнится первый if(...), то второй проверять уже не нужно. Вот здесь-то else и пригодится.

Хотя, можно и так. Просто будет лишняя проверка.
0
Yetty
2187 / 1547 / 1069
Регистрация: 18.12.2017
Сообщений: 5,159
22.01.2019, 01:32 11
Цитата Сообщение от analogov net Посмотреть сообщение
Вот здесь-то else и пригодится.
это не так. наличие else может приводить к неправильному вычислению начального max, например в таких строках:
C++
1
2
if (i==0 || a[i]<min) min=a[i];
if (i==0 || a[i]>max) max=a[i];
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 402
22.01.2019, 08:36 12
Да, но этих строк нет в его коде.
0
Yetty
2187 / 1547 / 1069
Регистрация: 18.12.2017
Сообщений: 5,159
22.01.2019, 15:02 13
Цитата Сообщение от analogov net Посмотреть сообщение
Да, но этих строк нет в его коде.
дело не в строках ТС (свои строки ТС предоставил, чтобы их исправили), а в том, что Ваше утверждение ошибочно.
такие строки Вас устроят ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
#include <climits>
using namespace std;
 
int main()
{
    int n=3, min=INT_MAX, max=INT_MIN; 
    
    int a[] = {500, 400, 200}; 
    for (int i = 0; i < n; i++) 
    {
        
        if (a[i] < min) min=a[i];
        if (a[i] > max) max=a[i];
        cout <<a[i]<<" ";
    }   
 
    cout << "\nmin=" <<min;
    cout << "\nmax=" <<max<< "\n";
system("pause");
return 0;
}
поставьте else как Вы советуете и получите неверный результат.
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 402
22.01.2019, 16:27 14
Цитата Сообщение от Yetty Посмотреть сообщение
такие строки Вас устроят ?
Нет, ну меня вообще всё устраивает, дело не в этом.
Обычно, изначально известно, какими значениями будет заполняться массив( не в числовом смысле, а в плане, откуда они будут 'добываться', эти значения). И в зависимости от этого, нужно выбрать начальную инициализацию этих самых min и max.
В этом твоём примере(конкретно, в этом) видно, что ты сделал это не верно.
Сделай так:
C++
1
min = max = a[0];
и проблем было бы меньше. Но, опять же, я не считаю, что твой вариант ошибочен. Просто, я говорил о коде ТС, а там видно, что убирать else не обязательно.
0
Yetty
2187 / 1547 / 1069
Регистрация: 18.12.2017
Сообщений: 5,159
22.01.2019, 17:30 15
Цитата Сообщение от analogov net Посмотреть сообщение
ты сделал это не верно
что не верно ? я привёл 4 варианта решения задачи и все работают верно без else. а вариант, который Вы предлагаете кроме того что содержит строку min = max = a[0]; потребует дополнительный цикл (значение a[0] нужно где-то брать), т.е. приведёт к увеличению количества строк примерно в 2 раза - и всё это чтобы применить else ?
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 402
22.01.2019, 17:59 16
Цитата Сообщение от Yetty Посмотреть сообщение
что не верно ?
я говорил про твой последний пример.
это не верно:
C++
1
min=INT_MAX, max=INT_MIN;
я имел ввиду так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    int n = 3, min = INT_MAX, max = INT_MIN;
    int a[] = { 200, 400, 500 };
 
    min = max = a[0];
    for( int i = 0; i < n; i++ )
    {
 
        if( a[i] < min ) min = a[i];
        if( a[i] > max ) max = a[i];
        cout << a[i] << " ";
    }
 
    cout << "\nmin=" << min;
    cout << "\nmax=" << max << "\n";
    system( "pause" );
    return 0;
}
Цитата Сообщение от Yetty Посмотреть сообщение
потребует дополнительный цикл
какой цикл?
0
Yetty
2187 / 1547 / 1069
Регистрация: 18.12.2017
Сообщений: 5,159
22.01.2019, 19:10 17
Цитата Сообщение от analogov net Посмотреть сообщение
это не верно:
кто Вам такое сказал ?
Цитата Сообщение от analogov net Посмотреть сообщение
какой цикл?
массив не задан изначально, а заполняется с клавиатуры - для Вашего варианта потребуется 2 цикла. а если инициализировать min=INT_MAX, max=INT_MIN; дополнительный цикл не требуется, т.к. min и max вычисляются в цикле заполнения - надеюсь объяснил понятно.
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 402
22.01.2019, 19:30 18
Цитата Сообщение от Yetty Посмотреть сообщение
кто Вам такое сказал ?
Так ты же и сказал, вернее показал на своём последнем примере.
Цитата Сообщение от Yetty Посмотреть сообщение
массив не задан изначально, а заполняется с клавиатуры
Ну и что? Какая разница? Ну, сделай так:
C++
1
2
3
4
5
cin>> a[0];
min = max = a[0];
for(int i = 1; i < n; i++)
    cin >> a[i];
// ...
Цитата Сообщение от Yetty Посмотреть сообщение
надеюсь объяснил понятно.
Вроде бы, да. А чего там непонятного.
Так я с самого начала всё понял. Кроме дополнительного цикла, правда. Но это не важно.
Ладно, Yetty, я объяснил, как мог. Извини, если что. Лучше не могу.
0
Yetty
2187 / 1547 / 1069
Регистрация: 18.12.2017
Сообщений: 5,159
22.01.2019, 19:46 19
Цитата Сообщение от analogov net Посмотреть сообщение
Так я с самого начала всё понял. Кроме дополнительного цикла, правда.
вот рабочий вариант: (1 цикл)
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
#include <iostream> 
#include <climits>
using namespace std;
 
int main()
{
    int n, min=INT_MAX, max=INT_MIN;
    cout <<"n="; cin >>n;
 
    int*a = new int[n];
 
    cout <<"Enter "<<n<<" elements:\n";    
    for (int i = 0; i < n; i++) 
    {
        cin >>a[i];
        if (a[i] < min) min=a[i];
        if (a[i] > max) max=a[i];        
    }   
 
    cout <<"min=" <<min<<"\nmax="<<max<<"\n";
    delete[]a;
system("pause");
return 0;
}
вот вариант (тоже рабочий), который я так понял Вы предлагаете вместо него (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
#include <iostream>
using namespace std;
 
int main()
{
    int n, min, max;
    cout <<"n="; cin >>n;
 
    int*a = new int[n];
 
    cout <<"Enter "<<n<<" elements:\n";    
    for (int i = 0; i < n; i++) 
    {
        cin >>a[i];
    }
        
    min=max=a[0];    
    for (int i = 0; i < n; i++)
    {        
        if (a[i] < min) min=a[i];
        else if (a[i] > max) max=a[i];        
    }   
 
    cout <<"min=" <<min<<"\nmax="<<max<<"\n";
    delete[]a;
system("pause");
return 0;
}
заводить cin>>a[0] отдельно, как Вы решили сделать в последнем посте, можно. но всё равно 2 лишние строки:
Цитата Сообщение от analogov net Посмотреть сообщение
cin>> a[0];
min = max = a[0];
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 402
22.01.2019, 20:02 20
Цитата Сообщение от Yetty Посмотреть сообщение
вот вариант (тоже рабочий), который я так понял Вы предлагаете вместо него (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
int main()
{
    int n, min, max;
    cout << "n="; cin >> n;
 
    int*a = new int[n];
 
    cout << "Enter " << n << " elements:\n";    
    cin >> a[0];
    min = max = a[0];
    for( int i = 1; i < n; i++ )
    {
        cin >> a[i];
 
        if( a[i] < min ) min = a[i];
        else if( a[i] > max ) max = a[i];
    }
 
    cout << "min=" << min << "\nmax=" << max << "\n";
    delete[]a;
    system( "pause" );
    return 0;
}
Цитата Сообщение от Yetty Посмотреть сообщение
заводить cin>>a[0] отдельно, как Вы решили сделать в последнем посте, можно. но всё равно 2 лишние строки:


могу быть не прав, но мне кажется, что эффективность кода не определяется количеством его строк...
0
22.01.2019, 20:02
StackOverflow
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2019, 20:02

Функция, находящая в строке первый символ, который входит в другую заданную строку
Доброго времени суток! Есть такое задание: написать функцию, которая находит в строке первый...

Строка: Как найти в строке первый символ, который входит во другую заданную строку?
Как найти в строке первый символ, который входит во другую заданную строку используя указатели и...

Деструктор (программа, которая ищет минимальный элемент массива)
Вот написал простенькую программу, которая ищет минимальный элемент массива! С конструктором более...


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

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

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