Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] затруднение при тестировании программы с массивами (http://forum.oszone.net/showthread.php?t=345289)

Александр34 23-05-2020 19:05 2922319

затруднение при тестировании программы с массивами
 
Доброго времени суток всем! В работе с массивами возникла проблема - не получается выполнить эти проверки для программы:
Массив упорядочен по возрастанию
Массив упорядочен по убыванию
Массив имеет один глобальный минимум
Массив имеет один глобальный максимум
Массив имеет несколько глобальных максимумов
Имеется "плоский" максимум (т.е. в максимуме 2 одинаковых элемента)
Имеются локальные и глобальные максимумы
Одно и тоже число входит и в "плоский" и в глобальный максимум


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

Код:

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#include <iostream>
#include <conio.h>
#include "testing.h"


int main()
{
    int X;// переменная для выделения памяти
    int v = 0;// переменная для определения рез-тата
    input_printf("Введите кол-во элементов");
    scanf_s("%d", &X);


    int* A;// выделение памяти
    A = (int*)malloc(X * sizeof(int));

    // ввод элементов массива
    for (int N = 0; N < X; N++)
    {
        printf("A[N]=", N);
        scanf_s("%d", &A[N]);
    }
    int f;// переменная-предел массива
    f = -1001;

    // выделение максимумов по условию задания:
    // В массиве A(N) найти и напечатать номера глобальных максимумов.
    // Локальным максимумом считается такой элемент массива A[i],
    // что для него выполняется условие A[i-1] < A[i] > A[i+1].

    // Глобальным считается наибольший из локальных максимумов.
    for (int i = 1; i < X; i++)
    {
        if (A[i] > A[i + 1] && A[i] > A[i - 1])
            f = A[i];
        if (f < A[i])
            f = A[i];
        // случай, при котором максимумы отсутствуют
        if (A[i] == A[i + 1] && A[i] == A[i - 1])
        {
            error_printf("no solution");
            return 1;
        }




    }
    // цикл проверки массива на упорядоченность по возрастанию
      for (int i = 1; i < X; i++)
      {
          int flag1 = 1;// флаг, который должен определять, какой цикл будет запущен, а какой - нет
          // если одна проверка на упорядоченность прошла успешно, этот флаг не даст запустить другую
          // создан только из-за отсутствия видения более аккуратного решения
          int v = 0;// переменная, которая должна определять, какой результат будет напечатан

          // проверка на упорядоченность по возрастанию
          // если каждый следующий элемент больше предыдущего, тогда будет указано, что массив упорядочен по возрастанию
          if (A[i + 1] > A[i])
          {
              v = 1;// если оператор выдает истину, будет выдан положительный рез-тат
              // оператор не продуман - вероятно, необходим цикл, как реализовать - не знаю
          }

          // если переменная v приняла значение 1, то будет напечатано, что массив упорядочен по возрастанию
          if (v == 1)
          {

              printf("массив упорядочен по возрастанию\n\n");
              flag1 = 0;// если массив упорядочен по возрастанию, то флаг изменится, чтобы не выполнялась другая проверка

          }

          // проверка массива на упорядоченность по убыванию
          if (flag1 == 1)
          {
              if (A[i] > A[i + 1])
              {
                  v = 2;// если оператор выдает истину, будет выдан положительный рез-тат
              }

                 
          }

          // если переменная v приняла значение 2, то будет напечатано, что массив упорядочен по убыванию
          if (v == 2)
          {
              printf("Массив упорядочен по убыванию\n\n");
              flag1 = -1;
          }

      }
     


    for (int i = 1; i < X; i++)// выявление максимума
        if (f == A[i])// если элемент является максимумом
            printf("%d", i);// вывод индекса этого элемента
    if (f == -1001)// если произошла ошибка при выделении памяти
        printf("no solution");

   

    return 0;
}


Iska 23-05-2020 20:18 2922324

Цитата:

Цитата Александр34
В чём проблема, подскажите пожалуйста. »

Александр34, это Вы расскажите — в чём именно состоит проблема?

Александр34 24-05-2020 09:39 2922375

Цитата:

Цитата Iska
Александр34, это Вы расскажите — в чём именно состоит проблема? »

Здравствуйте, проблема состоит в том, что закоментированные участки кода не работают, происходит зацикливание программы. Попытка проверить массив на упорядоченности приводит к тому, что в конце программа выдаёт какой-то мусор вместо нужного индекса. Где в моём коде ошибки, подскажите пожалуйста. Все остальные проверки не представляю как выполнить, как их реализовать и буду рад любой идее.

Iska 25-05-2020 05:44 2922508

Александр34, расставьте, пожалуйста, поясняющие комментарии в существующем коде.

lxa85 25-05-2020 08:50 2922523

Цитата:

Цитата Александр34
Код:

int flag1 = 1;
 int v = 0;
if (A[i + 1] > A[i])
 {
 v = 1;
 }
if (v == 1)
 {
printf("массив упорядочен по возрастанию\n\n");
}

»

Вы ставите оценку упорядоченности массива только во сравнению последних элементов.
Т.е. массив может быть каким угодно, но если два последних соответствуют условию, то все нормально.
Цитата:

Цитата Александр34
Код:

if (flag1 == 1)
 {
 do
 {
 if (A[i] > A[i + 1])
 {
 v = 2;
 }
 } while (flag1 == 1);
 }

»

Какую логику вы закладывали в этот код?
По какому признаку должно произойти изменение флага, как условия выхода из цикла?

Второй закомментированный блок непонятен. Почему-то взялась констана в 10, хотя ее раньше не было. И смысл проверки так же не ясен. Как указывал Iska, нужны ваши комментарии к коду.
Ссылки, выделение массива в памяти ... кто вам все это рассказывал? т.е. как бы ... нафига? Не, можно конечно, но зачем?

Александр34 25-05-2020 18:09 2922627

Цитата:

Цитата lxa85
Вы ставите оценку упорядоченности массива только во сравнению последних элементов.
Т.е. массив может быть каким угодно, но если два последних соответствуют условию, то все нормально. »

Я понял свою ошибку. А каким образом можно выполнить эту оценку грамотно и правильно?


Цитата:

Цитата lxa85
Какую логику вы закладывали в этот код?
По какому признаку должно произойти изменение флага, как условия выхода из цикла? »

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

Цитата:

Цитата lxa85
Второй закомментированный блок непонятен. Почему-то взялась констана в 10, хотя ее раньше не было. »

flag1 и v объявил раньше для этой проверки, хотя наверное можно было бы обойтись и без них, но как - не знаю. Про выделение памяти узнал из книги, что с ней работа с массивами проще, это единственная причина. Правда, чем не знаю, но написал.

Цитата:

Цитата Iska
расставьте, пожалуйста, поясняющие комментарии в существующем коде. »

Прошу прощения, исправил.

lxa85 25-05-2020 21:46 2922664

Цитата:

Цитата Александр34
А каким образом можно выполнить эту оценку грамотно и правильно? »

Если я скажу, это будет моим решением, а это (с педагогической точки зрения) не правильно.

Цитата:

Цитата Александр34
Знаю, что это неправильно, но каким образом сделать это иначе пока не знаю. »

Машина -- это бестолковый калькулятор. Своих мозгов у нее ноль. Поэтому по шагам и не торопясь.

Цитата:

Цитата Александр34
Про выделение памяти узнал из книги, что с ней работа с массивами проще, это единственная причина. Правда, чем не знаю, но написал. »

Вот тут я хочу предостеречь вас от использования тех инструментов, работу которых вы не понимаете. Дело в том, что С++ сильный и гибкий язык. Это его плюс и это его минус.
Вторгаясь в область памяти и твердо не зная, что при этом будет, может создать плохую привычку "копаться в памяти неумелыми руками", что может приводить к непредсказуемым последствиям.
Не проще. Вот "ногу отстрелить", это запросто. Поэтому возьмите (http://cppstudio.com/post/389/ и https://code-live.ru/post/cpp-arrays/) и будет вам счастье. Работу с памятью возьмут на себя конструкции языка.
Второе важное замечание.
Пишите полные конструкции условий if и пр.
Код:

if (условие) {
} else {
}

Даже если действие одно и формально фигурных скобок (они же операторные скобки) можно не писать.
Так вот нельзя. Писать строго всегда.

----

Отложите сейчас С++ и решите эту задачу на листе бумаги. Я серьезно.
С++ -- дело десятое. Пока вы не поймете математику задачи, вы будете ходить кругами.
Выпишите для себя 10 случайных массивов, сидите и выполняйте операции сравнения руками.
Если что-то надо -- вводите дополнительные переменные, "флаги" и пр. Пусть будет много, не страшно, за то каждая будет отвечать ровно за свою сущность.

Как поймете алгоритм, напишите его на псевдоязыке.
Проверьте себя еще раз.
И только потом (5ая очередь) приступайте к С++, отдавая предпочтение понятным для вас конструкциям. а книгу ту сожгите

Александр34 26-05-2020 12:06 2922720

Цитата:

Цитата lxa85
Отложите сейчас С++ и решите эту задачу на листе бумаги. Я серьезно.
С++ -- дело десятое. Пока вы не поймете математику задачи, вы будете ходить кругами.
Выпишите для себя 10 случайных массивов, сидите и выполняйте операции сравнения руками.
Если что-то надо -- вводите дополнительные переменные, "флаги" и пр. Пусть будет много, не страшно, за то каждая будет отвечать ровно за свою сущность. »

Спасибо большое, пойду изучать эти лекции. Спасибо за советы большое, постараюсь все сделать правильно.


Время: 00:19.

Время: 00:19.
© OSzone.net 2001-