30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
1

Найти значение lg (x) от каждого элемента и переставить на 1 место элемент, значение функции от которого максимально

02.03.2021, 21:11. Показов 4472. Ответов 24
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Есть такое задание:
Дан массив целых чисел. Решить заданную согласно варианта задачу и
переставить найденный элемент обоими методами поиска (линейным и
бинарным) в начало списка. Для упорядочивания массива использовать
пузырьковую сортировку.

Найти значение lg (x) от каждого элемента и переставить на 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
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
69
70
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main()
{
    int i;
    float arr[256];
    float max;
    float b;
 
    setlocale(LC_ALL, "RUSSIAN");
 
    int n;
    cout << "Введите размерность массива: ";
    cin >> n;
 
    for (int i = 0; i < n; i++)
    {
       
        cin >> arr[i];
        max = log10(arr[0]);
    }
    
    for (int i = 0; i < n; i++)
    {
        if (arr[i] <= 0)
        {
            cout << "Отрицательное, логарифм неопределён!" << " \n";
        }
        else
        {
 
            cout << "Логарифм от положительного числа" << log10(arr[i]) << ", " << "\n";
            max = arr[0];
            for (int i = 0; i < n; ++i) 
            {
               if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
            }
        }
        cout << "\n";
    } 
    cout << "Элемент с максимальным логарифмом  " << max;
     //сортировка пузырьком
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-1; j++)
        {
            if (arr[j] < arr[j + 1])
            {   b = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = b;
            }
        }
    }
    cout << endl << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 29 минут
Добавила ещё линейный поиск в программу, чтобы находил позицию введённого числа, но по заданию нужно, чтобы он автоматом находил максимальное, попробовала поиграться с max, но что-то не выходит
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main()
{
    int i;
    float arr[256];
    float arr2[256];
    float max;
    float b;
    int k;
    int h = 0;
 
    setlocale(LC_ALL, "RUSSIAN");
 
    int n;
    cout << "Введите размерность массива: ";
    cin >> n;
 
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
        max = log10(arr[0]);
    }
 
    cout << "Введите ключ: ";
    cin >> k;
 
    for (int i = 0; i < n; i++)
    {
        if (arr[i] == k)
        {
            arr2[h++] = i;
        }
    }
 
    if (h != 0)
    {
        for (int i = 0; i < h; i++)
        {
            cout << "Ключ " << k << " находится в ячейке: " << arr2[i] << endl;
        }
    }
    else
    {
        cout << "Не нашли ключ " << k << " в массиве" << endl;
    }
    
    for (int i = 0; i < n; i++)
    {
        if (arr[i] <= 0)
        {
            cout << "Отрицательное, логарифм неопределён!" << " \n";
        }
        else
        {
 
            cout << "Логарифм от положительного числа" << log10(arr[i]) << ", " << "\n";
            
            for (int i = 0; i < n; ++i) 
            {
               if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
            }
        }
        cout << "\n";
    } 
    cout << "Элемент с максимальным логарифмом  " << max;
     //сортировка пузырьком
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-1; j++)
        {
            if (arr[j] < arr[j + 1])
            {   
                b = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = b;
            }
        }
    }
    cout << endl << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2021, 21:11
Ответы с готовыми решениями:

Для каждого столбца заданной матрицы Т(5,3) найти и напечатать элемент, значение которого максимально
Составить программу в системе Mathcad для заданной матрицы. Для каждого столбца заданной матрицы...

Найти максимальный элемент массива среди каждого третьего, значение которого превышает значение m
Всем привет. Нужно сдать индивидуальную работу на Си. У меня постоянно находят в ней ошибки. Уже...

Вставить в массив на первое место элемент, значение которого меньше минимального элемента
Вставить в массив на первое место элемент, значение которого меньше минимального элемента...

В каждом столбце матрицы найти элемент, значение которого максимально отличается от среднего арифметического
Дана матрица действительных чисел размером 8х10. В каждом столбце определить значение и номер...

24
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 11:40  [ТС] 2
В принципе, с отрицательным значениями можно работать, но при вводе первым числом отрицательного или нуля, то дальше он не ищет максимальное, нужно как-то бы сделать так, чтобы, если ввод происходил первого отрицательного, то максимальное число вычислялось со второго, если и второе отрицательное, то с третьего, но у меня не получается реализовать
0
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 19:00  [ТС] 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main()
{
    int i;
    float arr[256];
    float arr2[256];
    float max;
    float b;
    int k;
    int h = 0;
    int bin;
 
    setlocale(LC_ALL, "RUSSIAN");
 
    int n;
    cout << "Введите размерность массива: ";
    cin >> n;
 
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
        max = log10(arr[0]);
    }
 
    cout << "Введите число для поиска: ";
    cin >> k;
 
    for (int i = 0; i < n; i++)
    {
        if (arr[i] == k)
        {
            arr2[h++] = i;
        }
    }
 
    if (h != 0)
    {
        for (int i = 0; i < h; i++)
        {
            cout << "Индекс элемента " << k << " в массиве, осуществлённый путём линейного поиска равен: " << arr2[i] << endl;
        }
    }
    else
    {
        cout << "Не нашли ключ " << k << " в массиве!" << endl;
    }
    
    for (int i = 0; i < n; i++)
    {
        if (arr[i] <= 0)
        {
            cout << "Отрицательное, логарифм неопределён!" << " \n";
        }
        else
        {
 
            cout << "Логарифм от положительного числа: " << log10(arr[i]) << "\n";
            
            for (int i = 0; i < n; ++i) 
            {
               if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
            }
        }
        cout << "\n";
    } 
    cout << "Элемент с максимальным логарифмом: " << max << endl;
     //сортировка пузырьком
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-1; j++)
        {
            if (arr[j] < arr[j + 1])
            {   
                b = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = b;
            }
        }
    }
 
    cout << endl << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << "\n";
 
    bool flag = false;
    int l = 0;
    int r = n - 1;
    int mid;
 
    cout << "Введите ключ для бинарного поиска: ";
    cin >> bin;
 
    while ((l <= r) && (flag != true))
    {
        mid = (l + r) / 2;
 
        if (arr[mid] == bin)
        {
            flag = true;
        }
        if (arr[mid] > bin)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    if (flag)
    {
        cout << "Индекс элемента " << bin << " в массиве равен: " << mid;
    }
    else
    {
        cout << "Элемент не найден!";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 19:47 4
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
В общем-то, столкнулась с такой проблемой, не знаю, что делать с отрицательными числами. Десятичный логарифм от отрицательного числа не берётся, не совсем понимаю, как осуществить это с отрицательными числами.
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
Дан массив целых чисел. Решить заданную согласно варианта задачу и
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
float arr[256];
    float arr2[256];

C++
1
unsigned int arr[256];
И проблемы с отрицательными числами не будет.
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 20:24  [ТС] 5
oleg-m1973, Ввод починился, но вся загвоздка в том, что, когда "float" использовала, при вводе отрицательного числа логарифм просто не считается, только положительные считает, а сейчас, он считает и отрицательные, но там какие-то огромные цифры выводит, а с поиском всё равно проблема, линейный выполняется без проблем, а вот бинарный не хочет

Добавлено через 3 минуты
oleg-m1973, Просто логарифма от отрицательного числа не существует, поэтому я и не знаю, как к этому подступиться
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 20:29 6
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Просто логарифма от отрицательного числа не существует, поэтому я и не знаю, как к этому подступиться
Поэтому я тебе и сказал использовать unsigned int, в нём не бывает отрицательных чисел
Второе - а логарифм, он разве не монотонно возрастает, т.е. максимальное значение логарифма будет у максимального элемента массива? (я математикой уже лет 20 не занимался)
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 20:33  [ТС] 7
oleg-m1973, Да, правильно, чем больше значение, тем больше логарифм, положительные он считает правильно, но если я ввожу в консоль отрицательное число, то при подсчёте отрицательного числа он выводит огромное положительное, которое непонятно откуда берётся и, соответственно, выводит его как максимальный элемент

Добавлено через 2 минуты
oleg-m1973, А введённое отрицательное число (логарифм) он выводит как 9.63296, любое введённое, пусть то -10 или -40, а максимальное 4294967286
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 20:42 8
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
но если я ввожу в консоль отрицательное число, то при подсчёте отрицательного числа он выводит огромное положительное, которое непонятно откуда берётся и, соответственно, выводит его как максимальный элемент
Это нормально, так представляются отрицательные числа в положительном типе. Сделай тип int и просто проверь после ввода, что число положительное.
C++
1
2
3
4
5
6
7
8
9
10
        int n;
        for (;;)
        {
            std::cout << "Enter n: ";
            std::cin >> n;
            if (n > 0)
                break;
 
            std::cout << "Must be positive!" << std::endl;
        }
Добавлено через 1 минуту
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, А введённое отрицательное число (логарифм) он выводит как 9.63296, любое введённое, пусть то -10 или -40, а максимальное 4294967286
Логарифм он, вроде, только в начале быстро изменяется, а на больших числах - практически прямая.
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 20:51  [ТС] 9
oleg-m1973, Немного не понимаю, просто, получается, что он это отрицательное (которое стало положительным) выводит и показывает, что оно является максимальным элементом в массиве, но это же не так. Я вот сделала, что при вводе отрицательного он выводит , что не может посчитать логарифм просто, положительные считает, находит среди них максимальный элемент, у которого максимальный логарифм, т.е. находит просто максимальный элемент, сортирует изначальный массив. Проблема вот в том, что при вводе первым числом отрицательного элемента, он его не считает и, получается, не вбивает его значение, из-за этого поиск максимума ломается, но если первое будет положительным, а дальше уже как угодно, то всё работает, может что-то с этим сделать можно?

Добавлено через 43 секунды
oleg-m1973, Я пыталась как-то через условие сделать проверку, чтобы, если первое число отрицательное, то при подсчёте максимального он его пропускал пока не найдёт положительное, или что-то вроде того
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 20:59 10
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
Немного не понимаю, просто, получается, что он это отрицательное (которое стало положительным) выводит и показывает,
Оно не отрицательное, а положительное. Я просто не знал, что std::cin не умеет толком работать с беззнаковыми целыми. Сделай проверку

Добавлено через 56 секунд
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Я пыталась как-то через условие сделать проверку, чтобы, если первое число отрицательное, то при подсчёте максимального он его пропускал пока не найдёт положительное, или что-то вроде того
Проверяй при вводе, чтоб вводились только положительные, как я показал. И покажи, как сделала

Добавлено через 1 минуту
Или тупо пропускай отрицательные при вводе, заполняй массив только положительными числами

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
for (int i = 0; i < n; )
    {
int x;
std::cin >> x;
if (x > 0)
        arr[i++] = x;
    }
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 21:02  [ТС] 11
oleg-m1973, Почему-то условие он не выполняет, всё равно позволяет вводить отрицательные
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main()
{
    int i;
    unsigned int arr[256];
    unsigned int arr2[256];
    float max;
    float b;
    int k;
    int h = 0;
    int bin;
 
    setlocale(LC_ALL, "RUSSIAN");
 
    int n;
    cout << "Введите размерность массива: ";
    cin >> n;
 
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
 
        if (arr[i] > 0)
        {
            max = log10(arr[0]);
        }
        else
        {
            cout << "Ввод отрицательного числа невозможен, повторите попытку!";
        }
    }
 
    cout << "Введите число для поиска: ";
    cin >> k;
 
    for (int i = 0; i < n; i++)
    {
        if (arr[i] == k)
        {
            arr2[h++] = i;
        }
    }
 
    if (h != 0)
    {
        for (int i = 0; i < h; i++)
        {
            cout << "Индекс элемента " << k << " в массиве, осуществлённый путём линейного поиска равен: " << arr2[i] << endl;
        }
    }
    else
    {
        cout << "Не нашли ключ " << k << " в массиве!" << endl;
    }
    
    for (int i = 0; i < n; i++)
    {
        if (arr[i] <= 0)
        {
            cout << "Отрицательное, логарифм неопределён!" << " \n";
        }
        else
        {
 
            cout << "Логарифм от положительного числа: " << log10(arr[i]) << "\n";
            
            for (int i = 0; i < n; ++i) 
            {
               if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
            }
        }
        cout << "\n";
    } 
    cout << "Элемент с максимальным логарифмом: " << max << endl;
     //сортировка пузырьком
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-1; j++)
        {
            if (arr[j] < arr[j + 1])
            {   
                b = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = b;
            }
        }
    }
 
    cout << endl << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << "\n";
 
    bool flag = false;
    int l = 0;
    int r = n - 1;
    int mid;
 
    cout << "Введите ключ для бинарного поиска: ";
    cin >> bin;
 
    while ((l <= r) && (flag != true))
    {
        mid = (l + r) / 2;
 
        if (arr[mid] == bin)
        {
            flag = true;
        }
        if (arr[mid] > bin)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    if (flag)
    {
        cout << "Индекс элемента " << bin << " в массиве равен: " << mid;
    }
    else
    {
        cout << "Элемент не найден!";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 21:07 12
Лучший ответ Сообщение было отмечено ANGELin04ka как решение

Решение

Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Почему-то условие он не выполняет, всё равно позволяет вводить отрицательные
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
if (arr[i] > 0)
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
for (int i = 0; i < n; )
    {
int x;
std::cin >> x;
if (x > 0)
        arr[i++] = x;
    }
Ну а зачем я по-твоему через переменную сделал?

Добавлено через 3 минуты
Либо
C++
1
2
3
4
5
6
7
8
for (int i = 0; i < n; )
    {
std::cin >> arr[i];
if (arr[i] > 0)
        ++i;
else
    cout << "Ввод отрицательного числа невозможен, повторите попытку!" << std::endl;
    }
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 21:13  [ТС] 13
oleg-m1973, Спасибо, всё работает, классно, теперь нельзя ввести отрицательные. Но что теперь делать с бинарным поиском, элемента? Их вообще можно вместе совмещать, вот линейный работает отлично, всё верно находит, а вот бинарный с косяками?
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main()
{
    int i;
    float arr[256];
    float arr2[256];
    float max;
    float b;
    int k;
    int h = 0;
    int bin;
 
    setlocale(LC_ALL, "RUSSIAN");
 
    int n;
    cout << "Введите размерность массива: ";
    cin >> n;
 
    for (int i = 0; i < n; )
    {
        cin >> arr[i];
        if (arr[i] > 0)
            i++;
        else
            cout << "Ввод отрицательного числа невозможен, повторите попытку!" << std::endl;
        max = log10(arr[0]);
    }
 
    cout << "Введите число для поиска: ";
    cin >> k;
 
    for (int i = 0; i < n; i++)
    {
        if (arr[i] == k)
        {
            arr2[h++] = i;
        }
    }
 
    if (h != 0)
    {
        for (int i = 0; i < h; i++)
        {
            cout << "Индекс элемента " << k << " в массиве, осуществлённый путём линейного поиска равен: " << arr2[i] << endl;
        }
    }
    else
    {
        cout << "Не нашли ключ " << k << " в массиве!" << endl;
    }
    
    for (int i = 0; i < n; i++)
    {
        if (arr[i] <= 0)
        {
            cout << "Отрицательное, логарифм неопределён!" << " \n";
        }
        else
        {
 
            cout << "Логарифм от положительного числа: " << log10(arr[i]) << "\n";
            
            for (int i = 0; i < n; ++i) 
            {
               if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
            }
        }
        cout << "\n";
    } 
    cout << "Элемент с максимальным логарифмом: " << max << endl;
     //сортировка пузырьком
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-1; j++)
        {
            if (arr[j] < arr[j + 1])
            {   
                b = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = b;
            }
        }
    }
 
    cout << endl << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << "\n";
 
    bool flag = false;
    int l = 0;
    int r = n - 1;
    int mid;
 
    cout << "Введите ключ для бинарного поиска: ";
    cin >> bin;
 
    while ((l <= r) && (flag != true))
    {
        mid = (l + r) / 2;
 
        if (arr[mid] == bin)
        {
            flag = true;
        }
        if (arr[mid] > bin)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    if (flag)
    {
        cout << "Индекс элемента " << bin << " в массиве равен: " << mid;
    }
    else
    {
        cout << "Элемент не найден!";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
03.03.2021, 21:15 14
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
unsigned int arr[256];
И проблемы с отрицательными числами не будет.
как и соответствия написанного условию задачи:
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
Дан массив целых чисел
целые это отрицательные, ноль и положительные
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
как осуществить это с отрицательными числами
для неположительных вывести "функция не определена"

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

есть подозрение что нужно найти максимальное положительных чисел. но это не точно. я бы такую задачу вернул тому кто её Вам её дал.

Цитата Сообщение от ANGELin04ka Посмотреть сообщение
float
точно неправильно. для целых тип int
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 21:17  [ТС] 15
Yetty, Это точно, я и не знала, что с логарифмом делать отрицательным. При вводе отрицательного я сделала вывод ошибки, он пишет, что логарифм не определён, т.к. отрицательное введено, но косяк, что нельзя его ввести первым, если первым ввести отрицательное, то ломается поиск максимального элемента
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 21:24 16
Лучший ответ Сообщение было отмечено ANGELin04ka как решение

Решение

Цитата Сообщение от ANGELin04ka Посмотреть сообщение
max = log10(arr[0]);
Это можно не делать на каждой итерации, просто вынеси за цикл
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
Но что теперь делать с бинарным поиском, элемента? Их вообще можно вместе совмещать, вот линейный работает отлично, всё верно находит, а вот бинарный с косяками?
C++
1
2
3
4
5
cout << "Введите число для поиска: ";
cin >> k;
for (int i = 0; i < n; i++)
    if (arr[i] == k)
        cout << "Индекс элемента " << k << " в массиве, осуществлённый путём линейного поиска равен: " << i << endl
Добавлено через 5 минут
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
что нельзя его ввести первым, если первым ввести отрицательное, то ломается поиск максимального элемента
Что-то до меня не сразу дошло, что значит "если первым ввести отрицательное, то ломается поиск максимального элемента"
C++
1
2
3
4
5
6
7
8
9
10
    for (int i = 0; i < n; )
    {
        cin >> arr[i];
        if (arr[i] > 0)
            i++;
        else
            cout << "Ввод отрицательного числа невозможен, повторите попытку!" << std::endl;
    }
 
       max = log10(arr[0]);
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 21:36  [ТС] 17
oleg-m1973, Линейный поиск поменяла, а что на счёт бинарного, а то он через раз показывает, и, получается, если я в линейном поиске ввела, например, 50, то в бинарном я уже не могу ввести это число?

Добавлено через 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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
int main()
{
    int i;
    int arr[256];
    int arr2[256];
    float max;
    float b;
    int k;
    int h = 0;
    int bin;
 
    setlocale(LC_ALL, "RUSSIAN");
 
    int n;
    cout << "Введите размерность массива: ";
    cin >> n;
 
    for (int i = 0; i < n; )
    {
        cin >> arr[i];
        if (arr[i] > 0)
            i++;
        else
            cout << "Ввод отрицательного числа невозможен, повторите попытку!" << std::endl;
    }
    max = log10(arr[0]);
    cout << "Введите число для поиска: ";
    cin >> k;
 
    for (int i = 0; i < n; i++)
    {
        if (arr[i] == k)
        {
            cout << "Индекс элемента " << k << " в массиве, осуществлённый путём линейного поиска равен: " << i << endl;
        }
    }
 
    
    for (int i = 0; i < n; i++)
    {
        if (arr[i] <= 0)
        {
            cout << "Отрицательное, логарифм неопределён!" << " \n";
        }
        else
        {
 
            cout << "Логарифм от положительного числа: " << log10(arr[i]) << "\n";
            
            for (int i = 0; i < n; ++i) 
            {
               if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
            }
        }
        cout << "\n";
    } 
    cout << "Элемент с максимальным логарифмом: " << max << endl;
     //сортировка пузырьком
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n-1; j++)
        {
            if (arr[j] < arr[j + 1])
            {   
                b = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = b;
            }
        }
    }
 
    cout << endl << "Отсортированный массив: ";
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << "\n";
 
    bool flag = false;
    int l = 0;
    int r = n - 1;
    int mid;
 
    cout << "Введите ключ для бинарного поиска: ";
    cin >> bin;
 
    while ((l <= r) && (flag != true))
    {
        mid = (l + r) / 2;
 
        if (arr[mid] == bin)
        {
            flag = true;
        }
        if (arr[mid] > bin)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }
    if (flag)
    {
        cout << "Индекс элемента " << bin << " в массиве равен: " << mid;
    }
    else
    {
        cout << "Элемент не найден!";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 21:37 18
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Линейный поиск поменяла, а что на счёт бинарного, а то он через раз показывает, и, получается, если я в линейном поиске ввела, например, 50, то в бинарном я уже не могу ввести это число?
Можешь, как разница. Сортировка работает нормально?
1
30 / 24 / 6
Регистрация: 24.11.2020
Сообщений: 214
03.03.2021, 21:38  [ТС] 19
oleg-m1973, Сортирует пузырьком хорошо, я сделала по убыванию сортировку, потому что в задании написано, что переставить максимальный на первое место, не знаю, правильно оно или нет
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
03.03.2021, 21:40 20
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
if ((log10(arr[i]) > log10(max)))
               {
                  max = arr[i];
               }
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
max = log10(arr[0]);
Что-то здесь лишнее
C++
1
max = arr[0];
Добавлено через 1 минуту
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
oleg-m1973, Сортирует пузырьком хорошо, я сделала по убыванию сортировку, потому что в задании написано, что переставить максимальный на первое место, не знаю, правильно оно или нет
Тогда и в бинарном поиске надо поменять условия на противоположные
Цитата Сообщение от ANGELin04ka Посмотреть сообщение
if (arr[mid] > bin)
        {
            r = mid - 1;
        }
if (arr[mid] < bin)
1
03.03.2021, 21:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2021, 21:40
Помогаю со студенческими работами здесь

Вывести значение каждого третьего элемента последовательности, значение которого кратно трем
Входные данные: Во входном потоке в первой строке через пробел перечислены значения элементов...

Найти значение максимального элемента и номер последнего элемента, значение которого равно максимальному
Помогите

Найти среднее арифметическое из каждого столбца и поставить это значение на место элемента находящегося на главной диагонали в новом массиве
Задача:Дана квадратная матрица.Найти среднее арифметическое из каждого столбца и поставить это...

Найти значение t, при котором значение функции максимально
Момент времени t, в который будет достигнута максимальная скорость точки, если уравнение движения...

В одномерный массив после каждого элемента, номер которого или значение которого кратно трём, вставить цифру 3
В одномерный массив после каждого элемента, номер которого или значение которого кратно трём,...

Есть ли отрицательные элементы ниже и правее элемента, для которого значение f(Xij]) максимально.
Для матрицы проверить, есть ли отрицательные элементы среди элементов, находящихся ниже и правее...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru