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

Нахождение локального минимума

04.11.2017, 10:36. Просмотров 1038. Ответов 6
Метки нет (Все метки)

Написать программу: дана последовательность вещественных чисел. Найти и вывести на экран все локалные минимумы – числа, меньшие предыдущего и последующего.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2017, 10:36
Ответы с готовыми решениями:

Нахождение локального минимума
Здравствуйте!!!! Напишите программу или алгоритм для нахождения локального...

Нужно найти ошибки в вычислении локального минимума
Как новичку конечно же сложно по-нормальному что-то сделать,но думаю эта штука...

Двумерный массив, поиск локального минимума - доработать код
Написал следующий код, вроде запускается и работает только не всегда корректно...

Элементы, находящиеся левее локального минимума массива, разместить в памяти динамически и распечатать
Дан массив размера N. Найти номер его первого локального минимума (локальный...

Нахождение минимума k в матрице
подскажите пожалуйста какой код будет для нахождения минимума k в матрице

6
evstarylan
19 / 18 / 19
Регистрация: 01.11.2017
Сообщений: 48
Завершенные тесты: 1
04.11.2017, 11:17 2
Лучший ответ Сообщение было отмечено 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
#include<iostream>
 
using namespace std;
double d[3]; // Всегда достаточно поддерживать только три числа
 
int main() {
    int i = 0;
    bool three_read = 0;
    while (cin >> d[i]) { //Считывание, пока есть последовательность. Можно заменить на обычный цикл, если известно количество чисел
        if (three_read) { //Ищем, когда считаны хотя бы три числа
            int nxt = i; //Индекс следующего элемента (тот, который считали)
            int cur = i - 1; //Индекс текущего
            if (cur == -1) //Если стоим в 0
                cur = 2;
            int prev = i - 2; //Индекс предыдущего
            if (prev == -2) //Если стоим в 0
                prev = 1;
            if (prev == -1) //Если стоим в 1
                prev = 2;
 
            if (d[cur] < d[prev] && d[cur] < d[nxt]) //Вывод минимума
                cout << d[cur] << " " << endl;
        }
        i++;
        if (i == 3) { //Считывание по кругу: 0 1 2 0 1 2 ...
            i = 0;
            three_read = 1;
        }
    }
}
Если последовательность небольшая, можно просто считать в массив и проверить все элементы циклом. Но это работает с последовательностью большой длины (не менее трех).
Если важна точность, могу добавить компоратор для вещественных чисел.

Добавлено через 12 минут
C++
1
 cout << d[cur] << " " << endl;
Вот зачем там и пробел, и endl, не знаю
Оставьте, что считаете нужным.
Если есть вопрос про считывание: из файла это всегда работает, из консоли <Ctrl>+<z> для Windows (и нажмите ввод) - признак конца ввода.

Добавлено через 3 минуты
Я забываю проверять второе число! Простите.
Правки:
C++
1
    int three_read = 0;
C++
1
2
3
4
5
6
7
8
9
        if (i == 3) { //Считывание по кругу: 0 1 2 0 1 2 ...
            i = 0;
            three_read++;
            if (three_read == 1) {
                int cur = 1, prev = 0, nxt = 2;
                if (d[cur] < d[prev] && d[cur] < d[nxt]) //Вывод минимума
                    cout << d[cur] << " ";
            }
        }
1
woldemas
444 / 316 / 173
Регистрация: 06.09.2013
Сообщений: 957
04.11.2017, 14:16 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main (){
    int arr[] = {1,3, 4, 3, 6, 5, 7, 8 };
    size_t n = sizeof(arr) / sizeof(arr[0]);
    for(size_t i = 1; i < n - 1;) {
        if(arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) {
            std::cout << arr[i] << " ";
            i += 2;
        } else i++;
    }
    return 0;
}
1
noname12345
0 / 0 / 0
Регистрация: 01.11.2017
Сообщений: 88
05.11.2017, 09:30  [ТС] 4
Цитата Сообщение от evstarylan Посмотреть сообщение
Я забываю проверять второе число! Простите.
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>
 
using namespace std;
double d[3]; // Всегда достаточно поддерживать только три числа
 
int main() {
 
    int i = 0;
    int three_read = 0;
    while (cin >> d[i]) { //Считывание, пока есть последовательность. Можно заменить на обычный цикл, если известно количество чисел
        if (three_read) { //Ищем, когда считаны хотя бы три числа
            int nxt = i; //Индекс следующего элемента (тот, который считали)
            int cur = i - 1; //Индекс текущего
            if (cur == -1) //Если стоим в 0
                cur = 2;
            int prev = i - 2; //Индекс предыдущего
            if (prev == -2) //Если стоим в 0
                prev = 1;
            if (prev == -1) //Если стоим в 1
                prev = 2;
 
            if (d[cur] < d[prev] && d[cur] < d[nxt]) //Вывод минимума
                cout << d[cur] << " " << endl;
        }
        i++;
            if (i == 3) { //Считывание по кругу: 0 1 2 0 1 2 ...
            i = 0;
            three_read++;
            if (three_read == 1) {
                int cur = 1, prev = 0, nxt = 2;
                if (d[cur] < d[prev] && d[cur] < d[nxt]) //Вывод минимума
                    cout << d[cur] << " ";
            }
        }
    }
}
Спасибо большое, то есть полная программа будет выглядеть вот так?
0
evstarylan
19 / 18 / 19
Регистрация: 01.11.2017
Сообщений: 48
Завершенные тесты: 1
05.11.2017, 09:58 5
Цитата Сообщение от noname12345 Посмотреть сообщение
Спасибо большое, то есть полная программа будет выглядеть вот так?
Да, все правильно
1
LVV
120 / 107 / 39
Регистрация: 15.02.2010
Сообщений: 454
05.11.2017, 10:39 6
Цитата Сообщение от evstarylan Посмотреть сообщение
Да, все правильно
Если не считать, что можно сделать в десять раз проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main()
{
    //дан массив
    const int n = 14;
    int M[n] = {1, 2, 5, 5, 4, 3, 6, 5, 4, 1, 2, 7, 9, 3}; 
    
    //определяем локальные минимумы
    for (int i = 1; i < n - 1; i++)
        if (M[i] < M[i - 1] && M[i] < M[i + 1])
            cout << M[i] <<" ";
 
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 3 минуты
Ну, разве что, заменить 6-7 строки, если массив инициализируется пользователем:
C++
1
2
3
4
5
int n;
cin >> n;
   int *M = new int [n];
          for (int i=0; i<n; i++)
                cin >> M[i];
1
evstarylan
19 / 18 / 19
Регистрация: 01.11.2017
Сообщений: 48
Завершенные тесты: 1
06.11.2017, 16:02 7
LVV, да, у вас лаконичнее получилось
0
Ответ Создать тему
Опции темы

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