Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2022, 12:08   #1
Rid775
Новичок
Джуниор
 
Регистрация: 25.11.2022
Сообщений: 2
По умолчанию Помощь в решение задачи на С++

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

1) Необходимо задать массив, без генерации, просто в коде. И если он отсортирован по возрастанию, вывести 1, если по убыванию вывести 2, если все элементы массива одинаковые, то 0, и если массив не упорядочен то -1.

Пример:

1 - Если массив отсортирован по возрастанию.
2 - Если массив отсортирован по убыванию.
0 - Если все элементы массива одинаковые.
-1 - Если массив не упорядочен.

-4 5 10 10 13 56 100 => 1
10 8 8 5 5 2 -10 => 2
8 8 8 8 8 8 8 => 0
3 6 8 8 5 10 34 1 => -1
10 23 45 20 100 120 => -1

2) Нужно среди всех ЧЕТНЫХ чисел массива нужно найти самый максимальный элемент
и количество его повторений в данном массиве.
Пример:
17 25 8 10 11 10 2 -4 57 => max = 10 , repeats 2 times
7 9 11 -10 3 -4 17 -4 95 -4 1 => max = -4, repeats 3 times

3) Самое сложное на мой взгляд, Дан массив.
Элементы массива принадлежат интервалу [0, 20]
Нужно найти самую длинную непрерывную последовательность элементов с шагом 1.
Функция должна вернуть именно ДЛИНУ.
2 4 7 8 10 11 1 3 => 4. [1 2 3 4]
0 10 1 11 2 12 3 16 13 17 8 9 => 6. [ 8 9 10 11 12 13]

P.s. задачи не относятся к одному массиву, это просто три разных задачи)
Rid775 вне форума Ответить с цитированием
Старый 25.11.2022, 17:55   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1) Оцениваете первые два элемента массива и инициализируете значение результата в 0 (первый элемент равен второму), 1 (первый элемент меньше второго) или 2 (первый элемент больше второго). Далее запускаете цикл со счетчиком начинающийся со второго элемента и до предпоследнего, в котором проверяете тоже самое (i-ый элемент сравниваете с (i+1)-м). Если i-ый элемент равен (i+1)-му и значение переменной результата не равно 0, тогда устанавливаете значение в -1 и прерываете цикл (break). Если i-ый элемент меньше (i+1)-го и значение переменной результата не равно 1, тогда устанавливаете значение в -1 и прерываете цикл. Если i-ый элемент больше (i+1)-го и значение переменной результата не равно 2, тогда устанавливаете значение в -1 и прерываете цикл. После цикла выводите значение из переменной результата.

2) Инициализируете 2 переменные: переменная счетчик (устанавливаете в 1) и переменная значение (устанавливаете равной первому элементу массива). Затем запускаете цикл со счетчиком со второго элемента до последнего, в котором проверяете следующее: если i-ый элемент массива кратный двум (a[i] & 1 == 0 или a[i] % 2 == 0) и он же больше значения сохраненного во второй переменной, тогда устанавливаете значение второй переменной в значение i-го элемента, а первую переменную счетчик сбрасываете в 1, иначе если значение второй переменной равно значению i-го элемента, тогда увеличиваете на единицу значение в первой переменной счетчике. После окончания цикла еще раз проверяете значение во второй переменной на четность и выводите сообщение с найденными значением и количеством повторений, иначе выводите сообщение, что в массиве нет четных элементов.

3) 1 этап - сортировка элементов: выбираем алгоритм сортировки - пускай будет сортировка выбором:
Запускаете цикл со счетчиком от первого элемента до предпоследнего. В цикле инициализируете переменную значением счетчика цикла и запускаете еще один сложенный цикл от (i+1)-го элемента и до последнего, в котором сравниваете элемент с сохраненным индексом с элементом с индексом равным счетчику вложенного цикла и если первый элемент больше второго, тогда сохраняете в переменной номер элемента равного индексу вложенного цикла. После завершения вложенного цикла проверяете на равенство индексов сохраненного в переменной и равного счетчику первого цикла и, если они не равны, тогда обмениваете эти два элемента местами.

2 этап. Нахождение последовательности элементов: Для этого достаточно пройти по массиву в цикле со счетчиком и вычитать из (i+1)-го элемента i-ый элемент и, если разница равна 1, тогда увеличивать счетчик на 1, иначе сравниваете значение с переменной с максимальным значением счетчика (обновляете его, если оно больше) и сбрасываете счетчик в 0.
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 01:34   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
a[i] & 1 == 0
Это грабли C++ (унаследованные от C). Приоритет операций такой, что сначала будет ==, а потом &. Надо скобки писать:
Код:
(a[i] & 1) == 0
Вот кстати digitalis правильно написал, со скобками.
Цитата:
Сообщение от macomics Посмотреть сообщение
3) 1 этап - сортировка элементов: выбираем алгоритм сортировки - пускай будет сортировка выбором:
Запускаете цикл со счетчиком от первого элемента до предпоследнего. В цикле инициализируете переменную значением счетчика цикла и запускаете еще один сложенный цикл от (i+1)-го элемента и до последнего, в котором сравниваете элемент с сохраненным индексом с элементом с индексом равным счетчику вложенного цикла и если первый элемент больше второго, тогда сохраняете в переменной номер элемента равного индексу вложенного цикла. После завершения вложенного цикла проверяете на равенство индексов сохраненного в переменной и равного счетчику первого цикла и, если они не равны, тогда обмениваете эти два элемента местами.

2 этап. Нахождение последовательности элементов: Для этого достаточно пройти по массиву в цикле со счетчиком и вычитать из (i+1)-го элемента i-ый элемент и, если разница равна 1, тогда увеличивать счетчик на 1, иначе сравниваете значение с переменной с максимальным значением счетчика (обновляете его, если оно больше) и сбрасываете счетчик в 0.
Зачем так сложно? Хотя спасибо, что на этот раз не на ассемблере . Там не просто так условие, что элементы в небольшом диапазоне (от 0 до 20). Это позволяет обойтись без сортировки:
Код:
#include <assert.h>
#include <algorithm>

using namespace std;

#define LEN(array) (sizeof(array) / sizeof(array[0]))

int max_range_len(const int* elems, int len) {
  const int min_value = 0;
  const int max_value = 20;
  const int values_count = max_value - min_value + 1;
  bool has_value[values_count];
  fill_n(has_value, values_count, false);
  for (int i = 0; i < len; i++) {
    int e = elems[i];
    assert((min_value <= e) && (e <= max_value));
    has_value[e - min_value] = true;
  }

  int max_range_len = 0;
  int pos = 0;
  for (;;) {
    while ((pos < values_count) && !has_value[pos]) {pos++;}
    if (pos == values_count) {break;}
    int range_start = pos;
    pos++;
    while ((pos < values_count) && has_value[pos]) {pos++;}
    int range_len = pos - range_start;
    max_range_len = max(max_range_len, range_len);
  }
  return max_range_len;
}

int main() {
  const int a1[] = {2, 4, 7, 8, 10, 11, 1, 3};
  assert(max_range_len(a1, LEN(a1)) == 4);

  const int a2[] = {0, 10, 1, 11, 2, 12, 3, 16, 13, 17, 8, 9};
  assert(max_range_len(a2, LEN(a2)) == 6);

  return 0;
}
Пётр Седов вне форума Ответить с цитированием
Старый 27.11.2022, 02:37   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
Это грабли C++ (унаследованные от C). Приоритет операций такой, что сначала будет ==, а потом &. Надо скобки писать:
Код:
(a[i] & 1) == 0
Во всех известных мне описаниях операция побитового И (&) имеет больший приоритете чем сравнение/равенство (==).

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
Там не просто так условие, что элементы в небольшом диапазоне (от 0 до 20).
А я и не пытался объяснить как лучше. Я рассказывал как должно работать (общий случай).

Если усложнять, тогда можно просто завести переменную типа int
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 03:36   #5
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Во всех известных мне описаниях операция побитового И (&) имеет больший приоритете чем сравнение/равенство (==).
Нет, у == приоритет больше, чем у &:
Цитата:
C++ Operator Precedence
The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.

Precedence | Operator | Description
1 | :: | Scope resolution
...
10 | == != | For equality operators = and ≠ respectively
11 | a&b | Bitwise AND
...
17 | , | Comma
https://en.cppreference.com/w/cpp/la...tor_precedence
:: -- самый высокий приоритет (в начале списка)
, -- самый низкий приоритет (в конце списка)
Именно поэтому, во всех компиляторах C и C++:
Код:
assert((0 & 1 == 0) == 0);
assert((1 & 1 == 0) == 0);
assert((2 & 1 == 0) == 0);
assert((3 & 1 == 0) == 0);
и т. д.
Пётр Седов вне форума Ответить с цитированием
Старый 27.11.2022, 04:00   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
#include <iostream>

int main(int argc, char *argv[]) {
  int i = 1;
  if (i & 1 == 0) std::cout << "OK";
  std::cout << ((i & 1 == 0) ? 3:5);
  return 0;
}
Вывод: 5.

Странное у вас описание.

https://godbolt.org/z/rrPKn31sq


Бывает. Забываются нюансы. Там глюк с 0 результатами.

Последний раз редактировалось macomics; 27.11.2022 в 04:05.
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 10:52   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
Вот кстати digitalis правильно
Учитывая, что по работе и вообще - я ни строчки не написал на ++, результатом я доволен.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помощь в решение Мальвина_0 Помощь студентам 1 27.08.2020 15:24
Решение задачи на с++ АлександрСаша Помощь студентам 1 27.02.2019 18:35
Решение задачи VBS nap15 Помощь студентам 2 15.10.2016 20:41
Решение задачи zheka21 Помощь студентам 13 08.11.2012 12:06
Решение задачи Raphael Помощь студентам 4 07.10.2010 18:45