Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 10.07.2018
Сообщений: 20

Удаление элементов массива и "особые случаи"

26.02.2020, 07:56. Показов 1754. Ответов 19

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
В моем РГЗ по Технологиям Программирования есть следующая задача:

"Дан одномерный числовой массив. Удалить в массиве первую группу из двух
подряд идущих одинаковых чисел. Если удаление элементов невозможно,
выдать об этом сообщение. Удаление элементов из массива оформить в
виде подпрограммы."


Задачу я выполнил и даже усовершенствовал программу: можно искать не 2 идущих подряд одинаковых элемента, а сколько угодно.

Казалось-бы, в чем тогда проблема?
Проблема в том единственном случае, когда в массиве НЕТ одинаковых элементов, идущих подряд. В этом случае программа выдает некорректный результат (все так же удаляет элементы из массива). Вот код:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{Дан одномерный числовой массив. Удалить в массиве первую группу из двух 
подряд идущих одинаковых чисел. Если удаление элементов невозможно, 
выдать об этом сообщение. Удаление элементов из массива оформить в 
виде подпрограммы.}
program exercise1;
var
  i,arrLength, someVar, coincidence : integer;
  a : array of integer; 
  
begin
writeln('Длинна массива:...');
readln(arrLength);
writeln('кол-во совпадающих символов:...');
readln(someVar);
 
setLength(a, arrLength);
writeln('Укажите значение элементов массива:...');
for i:=0 to a.Length-1 do
  read(a[i]);
writeln(a);
{тут что-то про завершение цикла после нахождения первой пары }
for i:=0 to a.Length-2 do
  if a[i] = a[i+1] then
    begin
      coincidence := a.IndexOf(i);
      break;
    end;
{тут этот кусок кода заканчивается}
    for i:=coincidence+1 to a.Length-1-someVar do
    a[i] := a[i+someVar];
    setLength(a, a.Length-someVar);
    writeln(a);
end.
Сообщения об ошибке нет, т.к. сама ошибка не происходит. Хотелось-бы узнать, в чем тут все-таки дело и почему так происходит.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2020, 07:56
Ответы с готовыми решениями:

Особые случаи в защищённом режиме
Какие особые случаи и при каких условиях могут возникнуть при выполнении команды FAR JMP dword ptr в защищённом режиме

Особые случаи при выполнении инструкции DIV в защищённом режиме
Какие особые случаи (и при каких условиях) могут возникнуть при выполнении команды DIV word ptr в защищенном режиме МП Intel x86?

Какие особые случаи могут возникнуть при выполнении MOV DS,AX в защищенном режиме?
Какие особые случаи могут возникнуть при выполнение команды MOV DS,AX в защищенном режиме?

19
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.02.2020, 08:58
Лучший ответ Сообщение было отмечено Marchuk как решение

Решение

Если хотите понять в что в вашем коде не так - используйте отладку (F8).

Но вообще он написан на суржике старого и нового стилей, я лучше с 0 перепишу, чем буду в таком разбираться.

Для 2 элементов:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
begin
  var a := ReadArrInteger(
    'Введите элементы массива, через пробел:',
    ReadInteger('Введите длину массива:')
  ).ToList;
  
  var ind := a.AdjacentFind;
  
  if ind=-1 then
    Writeln($'Нет 2 повторяющихся элементов') else
  begin
    a.RemoveRange(ind, 2);
    a.Println;
  end;
  
end.
Ввод кол-ва повторяющихся:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
begin
  var a := ReadArrInteger(
    'Введите элементы массива, через пробел:',
    ReadInteger('Введите длину массива:')
  ).ToList;
  var n := ReadInteger('Кол-во повторяющихся:');
  
  var last := a[0];
  var c := 1;
  var ind := -1;
  for var i := 1 to a.Count-1 do
    if a[i]=last then
    begin
      c += 1;
      if c<>n then continue;
      ind := i-с+1;
      break;
    end else
    begin
      last := a[i];
      c := 1;
    end;
  
  if ind=-1 then
    Writeln($'Нет {n} повторяющихся элементов') else
  begin
    a.RemoveRange(ind, n);
    a.Println;
  end;
  
end.
1
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2020, 09:08
Это зачем?
Pascal
5
program exercise1;
~~~~~~~~~~
Вот это:
Pascal
11
12
writeln('Длинна массива:...');
readln(arrLength);
Гораздо красивее и проще записать вот так:
Pascal
11
  var arrLength := ReadLnInteger('Длинна массива:');
~~~~~~~~~~
А вот это, кроме некрасивого ввода, несёт в себе ещё и заблуждение для пользователей:
Pascal
13
14
writeln('кол-во совпадающих символов:...');
readln(someVar);
Нужно про повторяющиеся числа, а у вас?
Да и если не озвучено в задании, то зачем?
~~~~~~~~~~
А массив не проще ли вот так вводить:
Pascal
1
  var a := ReadArrInteger('Введите значения элементов массива:', arrLength);
Всё сразу: задать размер, вывести подсказку и ввести значения.
К стати, „введите значения“, а не „укажите значение“… Укажите — это синоним покажите. Нужна однозначность в определениях!
~~~~~~~~~~
Короче (но со всеми сообщениями):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
begin
  var arrLength := ReadLnInteger('Длинна массива:');
  var a := ReadArrInteger('Введите значения элементов массива:', arrLength);
  'Введён массив:'.Print; a.Println;
  var пары := a.Pairwise.Numerate.Where(пара->пара[1][0]-пара[1][1]=0);
  if пары.Count = 0 then
    'Пар нет!'.Println
  else
    begin
      var позицияПервойПары := пары.First[0];
      a := a.Where((n,i)->Not i.inRange(позицияПервойПары, позицияПервойПары+1)).ToArray;
      ' Новый массив:'.Print; a.Println;
    end;
end.
0
26.02.2020, 09:08

Не по теме:

P.S. coincidence значит совпадение в плане "так уж совпало, что сегодня дождь". Оно не применимо к кол-ву совпадений.

0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2020, 09:09
и альтернативным способом нахождения пар:
0
2 / 2 / 1
Регистрация: 10.07.2018
Сообщений: 20
26.02.2020, 09:15  [ТС]
Спасибо за ответ. А что такое "суржик"?
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.02.2020, 09:17
Смесь, обычно применяется к языкам (просто языкам или языкам программирования). Старый и новый стили паскаля - это практически полностью разные языки, поэтому к ним я это слово тоже применяю.
1
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
26.02.2020, 09:18
Цитата Сообщение от Marchuk Посмотреть сообщение
А что такое "суржик"?
В данном случае смесь языков.
https://ru.wikipedia.org/wiki/... 0%B8%D0%BA
1
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
26.02.2020, 10:04
JuriiMW,

Pascal
1
2
var arrLength := ReadLnInteger('Длинна массива:');
var a := ReadArrInteger('Введите значения элементов массива:', arrLength);
Думаю если переменная более не где не используется лучше так написать:
Pascal
1
var a := ReadArrInteger('Введите значения элементов массива:', ReadLnInteger('Длинна массива:'));
и еще вопрос по использованию кириллицы в PascalABC.NET это приветствуется или имена лучше создавать на англ.
Pascal
1
 var позицияПервойПары := пары.First[0];
или лучше так:
Pascal
1
var positionOfTheFirstPair := ...
Я это к чему, просто часто, на собеседовании в компании к этому есть особое мнение(перейдя на другой язык часто привычка остается )

По мне так кириллица глаз аж режет...
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2020, 10:13
Vigi, по первому пункту: см.выше в моём ответе попытка упростить код ТС… так же как и у вас относительно моего ;–)

по второму: а названия переменных TC глаза не режут?
Вы бы 1с-овский код почитали, где не только переменные русские…
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
26.02.2020, 10:27
Цитата Сообщение от JuriiMW Посмотреть сообщение
Вы бы 1с-овский код почитали
Вы бы еще про "Кумир" сказали
Увольте, мне Python и c# хватает.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2020, 10:29
Цитата Сообщение от Vigi Посмотреть сообщение
Вы бы еще про "Кумир" сказали
Не знаю. Никогда не видел.
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
26.02.2020, 10:52
Цитата Сообщение от JuriiMW Посмотреть сообщение
Не знаю. Никогда не видел.
как-то так (из оф док):


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Это вступление
цел длина, ширина
длина := 10
ширина := 15
| Это - основной алгоритм.
| У него может не быть имени
алг
нач
  вывод "Площадь равна ", площадь
кон
| Это - вспомогательный алгоритм.
| При выполнении он вызывается из основного.
| У вспомогательного алгоритма обязательно
| должно быть имя и могут быть параметры.
алг цел площадь
нач
  знач := длина*ширина
кон
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2020, 11:19
Vigi, я имел в виду, что самого Кумира не видел!
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.02.2020, 12:18
Цитата Сообщение от Vigi Посмотреть сообщение
это приветствуется или имена лучше создавать на англ.
Это как нравиться вам. Мне не нравиться постоянно переключать раскладку, поэтому я, обычно, использую только англ. буквы.

Не приветствуется только писать что то типа nachalo_programmi, а то глаза если не выпадут - так выколют.
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
26.02.2020, 12:48
Sun Serega,
Цитата Сообщение от Sun Serega Посмотреть сообщение
Это как нравиться вам.
Ясно.
А вот для начинающих я бы рекомендовал не использовать кириллицу для именования. "Вдруг" ваш проект читать будут иностранцы
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2020, 13:08
Цитата Сообщение от Vigi Посмотреть сообщение
"Вдруг" ваш проект читать будут иностранцы
На PascalABC.NET ? Иностранцы?
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.02.2020, 13:39
Ну, чтоб проект увидели - его надо для начала куда то выложить. А большинство файлов с кодом которые пишут новички - так и сдыхают у этих новичков (или, тем более, на компе в школе).

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

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

Конечно, это не касается совместной работы над общими файлами кода, но там не только переменные и комментарии работают по другим законам.
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
26.02.2020, 15:35
Цитата Сообщение от Sun Serega Посмотреть сообщение
Конечно, это не касается совместной работы над общими файлами кода, но там не только переменные и комментарии работают по другим законам.
Ну так вот я к этому и веду. Если человек собирается заняться программированием серьезно (работать в компании тд) думаю лучше сразу писать в правильном стиле, не зависимо какой инструмент для обучения он выбрал Pascal, Java, Js, Python или С# ++ и тд. И не зависимо позволяет ли писать язык в юникоде.
И в обще нужно приучать себя с "молоду" к хорошему стилю кодинга. Так как в % отношении чтение кода, даже собственного всегда превосходит % написания его. По этому Python как инструмент не позволяет писать не правильный код (я имею виду отступы - операторные блоки). ИМХО

Добавлено через 12 минут
Цитата Сообщение от JuriiMW Посмотреть сообщение
На PascalABC.NET ? Иностранцы?
JuriiMW, Ну тут нужно задать вопрос разработчикам. Какое будущие они видят в своем творении (какую нишу он займет) будет ли он массовым со своим комьюнити или ...
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
26.02.2020, 15:39
Что я могу сказать, так это то, что он сейчас в основном в нише образования - у нас на всех компьютерах стоит PABC.NET. Правда версия 2012 года - но это уже другая история
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2020, 15:39
Помогаю со студенческими работами здесь

Какие особые случаи могут возникнуть при выполнении команды BOUND SI, dword ptr [BX] в защищенном режиме?
Какие особые случаи (при каких условиях) могут возникнуть при выполнении команды BOUND SI, dword ptr в защищенном режиме МП Intel x86

Рассмотрите все особые случаи, которые могут возникнуть в арифметическом сопроцессоре при выполнении команды FDIV mem
Рассмотрите все особые случаи, которые могут возникнуть в арифметическом сопроцессоре при выполнении команды FDIV mem.

Одномерные массивы. Вставка, удаление элементов массива. Перестановка элементов массива. Сортировка массива методом пузырька
Помогите пожалуйста! Дан массив, состоящий из N букв латинского алфавита а) Заполнить массив датчиком случайных чисел б)...

Произведение положительных элементов массива, сумма элементов массива, удаление четных элементов
в одномерном массиве состоящим из n элементов вычислить: произведение положительных элементов массива; сумму элементов массива,...

Удаление четных элементов массива,больших среднего арифметического всех элементов массива
Доброго времени суток! Помогите пожалуйста) Вот задание:Из массива удалить четные элементы, имеющие значение больше среднего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru