Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] затруднение при тестировании программы с массивами

Ответить
Настройки темы
C/C++ - [решено] затруднение при тестировании программы с массивами

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Александр34
Дата: 25-05-2020
Описание: исправления в коде
Доброго времени суток всем! В работе с массивами возникла проблема - не получается выполнить эти проверки для программы:
Массив упорядочен по возрастанию
Массив упорядочен по убыванию
Массив имеет один глобальный минимум
Массив имеет один глобальный максимум
Массив имеет несколько глобальных максимумов
Имеется "плоский" максимум (т.е. в максимуме 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;
}

Отправлено: 19:05, 23-05-2020

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:18, 23-05-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:39, 24-05-2020 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 05:44, 25-05-2020 | #4


Аватара для lxa85

Необычный


Contributor


Сообщения: 4461
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Александр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, нужны ваши комментарии к коду.
Ссылки, выделение массива в памяти ... кто вам все это рассказывал? т.е. как бы ... нафига? Не, можно конечно, но зачем?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 08:50, 25-05-2020 | #5


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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


Цитата lxa85:
Какую логику вы закладывали в этот код?
По какому признаку должно произойти изменение флага, как условия выхода из цикла? »
Выход должен был осуществляться в случае, когда какая-то из проверок выдаёт результат, что массив упорядочен. Знаю, что это неправильно, но каким образом сделать это иначе пока не знаю.

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

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

Отправлено: 18:09, 25-05-2020 | #6


Аватара для lxa85

Необычный


Contributor


Сообщения: 4461
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Александр34:
А каким образом можно выполнить эту оценку грамотно и правильно? »
Если я скажу, это будет моим решением, а это (с педагогической точки зрения) не правильно.

Цитата Александр34:
Знаю, что это неправильно, но каким образом сделать это иначе пока не знаю. »
Машина -- это бестолковый калькулятор. Своих мозгов у нее ноль. Поэтому по шагам и не торопясь.

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

----

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

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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:46, 25-05-2020 | #7


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:06, 26-05-2020 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] затруднение при тестировании программы с массивами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Отключение компа при тестировании памяти 47rus Материнские платы и память 11 31-10-2013 16:26
Компьютер выключается при тестировании в Furmark. DreDo Видеокарты 6 30-06-2013 21:43
HDD - Красные кластеры при тестировании жесткого диска Diman19 Накопители (SSD, HDD, USB Flash) 11 15-11-2012 18:06
[решено] Непонятная ситуация при тестировании переразогнанного CPU. Oleg_SK Разгон, охлаждение и моддинг 8 03-02-2009 14:58
Ошибка при тестировании оперативной памяти Michael Непонятные проблемы с Железом 16 11-10-2006 08:23




 
Переход