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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2022, 15:01   #1
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию Одномерные массивы

Не могу решить простую задачу.
Не проходит решение.
Подскажите пожалуйста, что не так?

Напишите программу, которая запрашивает натуральное число N (не более 100), далее последовательность из N целых чисел, и выводит "YES", если элементы в массиве расположены симметрично, и "NO", если иначе.
Sample Input 1:

7
3 6 8 1 8 6 3
Sample Output 1:

YES
Sample Input 2:

8
4 13 9 3 5 9 13 4
Sample Output 2:

NO

#include <iostream>
using namespace std;
int main() {

int i,a[100], n, j, m=0, p=0;
cin>>n;
for (int i=0; i<n; i++){cin>>a[i];}

for (i=0; i<n; i++) {p++;}

for (j=n-1; j>=0; j--) {m--;}

if(p==m) {cout<<"YES";}

else {cout<<"NO";}




return 0;

}
Ladoga вне форума Ответить с цитированием
Старый 14.02.2022, 15:21   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Попробуй реализовать такой алгоритм.
Код:
1. Определил массив, например, A и внёс данные, например N штук.
2. Определил флаг: flag = true; // Полагаем, что массив симметричный
3. В цикле, например, по k просматриваешь массив с головы и "хвоста". 
    Конечное значение для k = N / 2; // До середины массива
4.      Если A[k] == A[N - 1 - k]   // k = 0, 1, ..., N - 1: Счёт с нуля
              Continue;
5.      Иначе
              flag = false;
              break;
7. Конец цикла
6. Если флаг true, то печатаем YES, а иначе - NO
Как-то так, ...

Последний раз редактировалось ViktorR; 14.02.2022 в 15:39.
ViktorR вне форума Ответить с цитированием
Старый 14.02.2022, 16:12   #3
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

спасибо
Ladoga вне форума Ответить с цитированием
Старый 14.02.2022, 17:00   #4
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

с флагом не получилось.
А этот код не проходит,
хотя показывает все правильно.
#include <iostream>
using namespace std;

int main() {
// put your code here
int a[100], i, k, n;
cin>>n;
for (i=0; i<n; i++){ cin>>a[i]; }
for (i=0; i<n/2; i++){k=n/2;}
if (a[k]==a[n-1-k])
{
cout<<"YES"<<'\n';
return 0;
}
cout<<"NO"<<'\n';

return 0;
}
Ladoga вне форума Ответить с цитированием
Старый 14.02.2022, 17:20   #5
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от Ladoga Посмотреть сообщение
for (i=0; i<n/2; i++){k=n/2;}
Смысл кучу раз переприсваивать k?

Цитата:
Сообщение от Ladoga Посмотреть сообщение
if (a[k]==a[n-1-k])
Вам же не два элемента надо сравнить...
ForenLi вне форума Ответить с цитированием
Старый 14.02.2022, 17:58   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Вот фрагмент вашего кода:
Код:
for (i=0; i<n/2; i++){k=n/2;}
if (a[k]==a[n-1-k])
{
cout<<"YES"<<'\n';
return 0;
}
cout<<"NO"<<'\n';

return 0;
Мне с трудом верится, что вы понимаете то что написали.
Код:
for (i=0; i<n/2; i++){k=n/2;}
Как это работает:
1. i присваивается начальное значение равное нулю.
Если i < n/2, то k присваивается значение n/2.
Иначе Завершаем

2. Следующий шаг цикла:
i увеличивается на 1: i++
Если i < n/2, то k = n/2
Иначе Завершаем

3. Переходим к п.2.

И что в этом разумного?

Код:
if (a[k]==a[n-1-k])
{
cout<<"YES"<<'\n';
return 0;
}
Как это работает:
В цикле k многократно получило значение n / 2. Это середина последовательности.
Вышли из цикла и:
Сравниваем элемент слева от середины с элементом справа от середины.
Если эти два элемента равны, то выводим YES.
Т.е. последовательность 1 2 3 4 4 5 6 7 симметрична.
И что значит не получилось с флагом:
Код:
flag = true; // Перед циклом
Внутри цикла, если нарушена симметрия,
Код:
flag = false;
Вне цикла:
Код:
if (flag) {
<что-то>
}
PS: Посмотрите на свой предыдущий вопрос "Условный оператор в цикле". Там есть решение с флагом.
Разберитесь с этим. А так получается, что "Спасибо", а в голову не вошло.
Как-то так, ...

Последний раз редактировалось ViktorR; 14.02.2022 в 18:02.
ViktorR вне форума Ответить с цитированием
Старый 14.02.2022, 18:21   #7
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

Не все сразу. Разберусь
Всё равно за объяснение спасибо.
Ladoga вне форума Ответить с цитированием
Старый 15.02.2022, 09:28   #8
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

#include <iostream>
using namespace std;
int main() {

int a[100], i, n, j, k=0;
cin>>n;

for (i=0; i<n; i++){cin>>a[i];}

for (i=0; i<n/2; i++)
{
if (a[i]==a[n-1-i])
{
k++;
}
}

if (n/2 == k){
cout<<"YES";
}
else
cout<<"NO";
return 0;

}
Ladoga вне форума Ответить с цитированием
Старый 15.02.2022, 12:27   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Это подходящее решение.
Одно замечание:
Цикл, в котором просматриваются элементы всегда выполняется до конца.
Т.е., если первый элемент не равен последнему, то массив всё равно будет просмотрен, хотя в этом нет необходимости.
Ситуацию можно изменить, если в условном операторе внутри цикла добавить ветку Else с командой break:
Код:
if (a[i]==a[n-1-i])
{
   k++;
}
else
{
   break;
}
PS:
1. Введи / вставь код.
2. Выдели код и нажми кнопку [CODE], которая есть над окном ввода.
Это позволит форматировать код и код будет лучше восприниматься.
Не ленись при форматировании кода. Это очень полезная вещь.
В Python выделение блока операторов делается только пробелами.
В Си есть фигурный скобки, а в Паскале begin ... end.
Такие скобки "балуют" начинающих.
Не форматировать текст - это очень Плохо.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.02.2022, 13:15   #10
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

Хорошо.
Скопировала текст в заметки.
Спасибо
Ladoga вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МАССИВЫ одномерные КИРИТО Фриланс 1 17.12.2018 17:56
Одномерные массивы mixaM Общие вопросы C/C++ 1 11.10.2017 15:15
Одномерные массивы Maxpaen Паскаль, Turbo Pascal, PascalABC.NET 2 24.05.2015 10:42
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12