На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Проверка упорядоченности чисел
    Пожалуйста, подайте идею как проверить упорядоченна ли последовательность чисел по возрастанию или убыванию.

    Хочу сделать это функцией, чтобы она возвращала определенное значение, в случае упорядоченности последовательности чисел тем или иным образом.
      Что мешает последовательно перебрать все пары соседних чисел и их сравнить?
        Проблема в том, что мне нужно проверить строчку из матрицы. Не могу сообразить, как урвать строчку в отдельную функцию.
          А кусок кода, как я понимаю, секретен?
            Куска кода нет. Хочу прокрутить решение в голове, и всё сразу написать.

            Собственно дана матрица, и нужно выполнить определенное действие с упорядоченными строками. Я хочу вынести проверку на упорядоченность в отдельную функцию.
              что сложного? Пробегаем коллекцию, если встречаем число, которое больше или меньше предыдущего, запоминаем. И затем каждое следующее число проверяем, соответствует ли критерию
                Hsilgos
                а как в отдельной функции обратиться к строке из двумерной матрицы?
                  Цитата
                  а как в отдельной функции обратиться к строке из двумерной матрицы?

                  А как у тебя матрицы хранятся?

                  Добавлено
                  В самом простом варианте функция будет выглядеть примерно вот так:
                  ExpandedWrap disabled
                    enum SortedType
                    {
                      NoSorted,
                      SortedAsc,
                      SortedDesc
                    };
                     
                     
                    template<class It>
                    SortedType checkSorted(const It &aBegin, const It &aEnd)
                    {
                      SortedType type = NoSorted;
                      if( aBegin == aEnd )
                        return NoSorted;
                     
                      It it = aBegin;
                      It itPrev = it++;
                      for( ; it != aEnd; ++it )
                      {
                        if( NoSorted != type )
                        {
                          if( (SortedAsc == type && *it < *itPrev) ||
                              (SortedDesc == type && *it > *itPrev))
                              return NoSorted;
                        }
                        else
                        {
                          if( *it < *itPrev )
                            type = SortedDesc;
                          else if( *it > *itPrev )
                            type = SortedAsc;
                        }
                        
                       itPrev = it;
                      }
                     
                      return type;
                    }
                    ээ.. как то сложно всё. Матрица хранится в двумерном массиве.
                    Так он заполняется:
                    ExpandedWrap disabled
                          const int N = 3, M = 4;
                          int massive[N][M], i, j;
                       
                          for (i=0; i < N; i++)
                          {
                              for (j=0; j < M; j++)
                              {
                                  printf("Введите massive[%d][%d]:\n",i,j);
                                  while (scanf("%d",&massive[i][j]) != 1)
                                  {
                                      printf("Введено некорректное значение. Повторите ввод:\n");
                                      fflush(stdin);
                                  }
                              }
                          }

                    Я на первом курсе, и мы только начали проходить массивы. Так что до классов видимо далеко ещё.
                      И что в этом случае мешает перебирать элементы по первому (или второму) индексу и сравнивать их?
                        Спасибо. Такой вот код вышел:
                        ExpandedWrap disabled
                          // Условие задачи:
                          // Найти максимальный среди всех элементов тех строк заданной матрицы nXm (где n,m - константы),
                          // которые упорядочены (либо по возрастанию, либо по убыванию)
                           
                          #include <stdio.h>
                          #include <conio.h>
                          #include <locale.h>
                          #include <stdlib.h>
                           
                          void main()
                          {
                              setlocale(LC_ALL, "");
                           
                              // объявляем массив и нужные нам переменные
                              // i и j - флажки
                              // sortedType - флажок, показывающий отсортированность массива
                              // max - максимальное (искомое) значение
                           
                              const int N = 3, M = 3;
                              int massive[N][M], i = 0, j = 0, sortedType = 0, max = 0;
                           
                              // заполняем массив
                           
                              for (i=0; i < N; i++)
                              {
                                  for (j=0; j < M; j++)
                                  {
                                      printf("Введите massive[%d][%d]:\n",i,j);
                                      while (scanf("%d",&massive[i][j]) != 1)
                                      {
                                          printf("Введено некорректное значение. Повторите ввод:\n");
                                          fflush(stdin);
                                      }
                                  }
                              }
                           
                              // начинаем находить отсортированные строки
                           
                              for (i=0; i < N; i++)
                              {
                                  // если строка отсортированна по возрастанию, то сравниваем max с последним элементом
                           
                                  for (j=0, sortedType = 0; j < M-1; j++)
                                  {
                                      if (massive[i][j]>massive[i][j+1])
                                      {
                                          sortedType=1; break;
                                      }
                                  }
                                  if ((sortedType == 0) && (massive[i][M-1] > max))
                                  {
                                      max = massive[i][M-1];
                                  }
                           
                                  // если числа в строке убывают, то сравниваем max с первым
                           
                                  for (j=0, sortedType = 0; j < M-1; j++)
                                  {
                                      if (massive[i][j]<massive[i][j+1])
                                      {
                                          sortedType=1; break;
                                      }
                                  }
                                  if ((sortedType == 0) && (massive[i][0] > max))
                                  {
                                      max = massive[i][0];
                                  }
                              }
                           
                              // выводим max
                              
                              printf("Максимальное значение элемента в упорядоченных строках = %d",max);
                           
                           
                              _getch();
                          }


                        Уверен, что это явно не оптимальный вариант решения данной задачи. Можно ли как-нибудь две проверки в одну уместить?
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,1100 ]   [ 15 queries used ]   [ Generated: 18.07.25, 02:04 GMT ]