Войти

Показать полную графическую версию : [решено] затруднение при тестировании программы с массивами


Александр34
23-05-2020, 19:05
Доброго времени суток всем! В работе с массивами возникла проблема - не получается выполнить эти проверки для программы:
Массив упорядочен по возрастанию
Массив упорядочен по убыванию
Массив имеет один глобальный минимум
Массив имеет один глобальный максимум
Массив имеет несколько глобальных максимумов
Имеется "плоский" максимум (т.е. в максимуме 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
В чём проблема, подскажите пожалуйста. »
Александр34, это Вы расскажите — в чём именно состоит проблема?

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

Iska
25-05-2020, 05:44
Александр34, расставьте, пожалуйста, поясняющие комментарии в существующем коде.

lxa85
25-05-2020, 08:50
int flag1 = 1;
int v = 0;
if (A[i + 1] > A[i])
{
v = 1;
}
if (v == 1)
{
printf("массив упорядочен по возрастанию\n\n");
} »
Вы ставите оценку упорядоченности массива только во сравнению последних элементов.
Т.е. массив может быть каким угодно, но если два последних соответствуют условию, то все нормально.if (flag1 == 1)
{
do
{
if (A[i] > A[i + 1])
{
v = 2;
}
} while (flag1 == 1);
} »
Какую логику вы закладывали в этот код?
По какому признаку должно произойти изменение флага, как условия выхода из цикла?

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

Александр34
25-05-2020, 18:09
Вы ставите оценку упорядоченности массива только во сравнению последних элементов.
Т.е. массив может быть каким угодно, но если два последних соответствуют условию, то все нормально. »

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


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

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

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

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

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

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

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

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

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

----

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

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

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

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




© OSzone.net 2001-2012