Задание 9 Урок 15
Primary tabs
Задание 9 Урок 15
Заполните массив из 5 элементов случайными числами из любого диапазона.
Далее пользователь вводит в цикле значения от 1 до 5 -- удаляйте из массива очередной элемент с позиции очередного введенного пользователем числа, сдвигая оставшиеся элементы второго массива влево, заполняя то, что справа нулями. Распечатывайте промежуточной состояние массива, после каждого удаления.Цикл должен работать до тех пор, пока в массиве не останется ненулевых элементов или пока пользователь не введет число большее чем 5 или меньшее чем 1.
Например:
|1|3|7|5|4| // исходный массив
3 // ввод пользователя
|1|3|5|4|0| // промежуточный результат
3 // ввод пользователя
|1|3|4|0|0| // промежуточный результат
2 // ввод пользователя
|1|4|0|0|0| // промежуточный результат
1 // ввод пользователя
|4|0|0|0|0| // промежуточный результат
1 // ввод пользователя
|0|0|0|0|0| // промежуточный результат
// Cообщение о завершении, т.к. все элементы удалены
-- в данном случае программа завершилась, так как удалены все элементы.
Если бы пользователь ввел число 10 или -5 - то это тоже была бы ситуация для завершения, но элементы в массиве ещё бы остались.
type arr = array[0..4] of integer; var i,t,n : integer; completion : boolean; first_array, second_array : arr; label m1,m2; procedure shift(f_array,s_array : arr; u : integer; var change : arr; var b : boolean); var g,p : integer; begin b := true; for g := low(s_array) to high(s_array) do{накладываем первый массив на второй для отображения нулевого значения} begin if g = u then {начало сдвига} break;{останавливаем цикл на интересуещем нас значении для изменения условий перезаписи второго массива} s_array[g] := f_array[g]; end; for g := u to high(s_array) do{запускаем цикл со значения остановки, номер ячейки g-1 обуславливает сдвиг} begin s_array[g-1] := f_array[g]; end; for g := low(change) to high(change) do{перезаписываем первый массив вторым, для сдвига 0 влево} change[g] := s_array[g]; for p := low(change) to high(change) do {проверка на последнее значение, чтобы исключить дальнейший вывод запроса и завершить программу} if change[p] <> 0 then{проверяем все ячейки, начиная с первой. Таким образом исключаем возможность рандомного выпадения 0} begin b := false; break; end else b := true; end; begin completion := false; for i := low(first_array) to high(first_array) do begin first_array[i] := random(10);{инициализируем первый массив случайным числом} second_array[i] := 0; end; for i := low(first_array) to high(first_array) do{выводим исходный массив} write('|', first_array[i], '|'); writeln(' // исходный массив'); for i := low(first_array) to high(first_array) do{запрашиваем значение} begin m1: write('Введите значение от 1 до 5: '); readln(n); if (n < 1) or (n > 5) then{проверка на идиота} begin writeln('Введенное значение не соответствует диапазону!'); goto m1; end else begin shift(first_array, second_array,n,first_array,completion);{переход к сдвигу} if completion = false then begin for t := low(first_array) to high(first_array) do{выводим перезаписанный первый массив} write('|',first_array[t], '|'); end else begin write('Программа завершена, нажмите ENTER!'); goto m2;{Можно использовать break} end; writeln(' // промежуточный результат'); end; end; m2: readln(); end.
- Log in to post comments
- 5011 reads
vedro-compota
Thu, 12/17/2020 - 19:48
Permalink
переделать структуру, чтобы
переделать структуру, чтобы для сдвига и получения нового состояния массива использовалась функция:
_____________
матфак вгу и остальная классика =)
Dobrii_kot
Fri, 01/01/2021 - 11:06
Permalink
Исправлено
Dobrii_kot
Fri, 01/01/2021 - 13:13
Permalink
Нет проверки в 0 диапазоне
Нет проверки в 0 диапазоне массива
Dobrii_kot
Fri, 01/01/2021 - 13:18
Permalink
Исправлено
vedro-compota
Sun, 01/03/2021 - 15:38
Permalink
замечание
момент с:
работает некорректно для числа value_user > 5
_____________
матфак вгу и остальная классика =)
Dobrii_kot
Tue, 01/05/2021 - 13:17
Permalink
Исправлено
консоль
vedro-compota
Sun, 01/17/2021 - 14:21
Permalink
замечание
-- эту проверку можно переместить так, чтобы число проверок (вызовов оператора if в основном цикле while было меньше), или вообще вынести эту проверку из цикла
-- в ряде случае shift(value_user,first_array); - тут будет выполнено в холостую. Переместите вызов этой операции.
_____________
матфак вгу и остальная классика =)
Dobrii_kot
Mon, 01/18/2021 - 09:48
Permalink
Исправлено
Условие:
вынесено из цикла
в строках:
проверка
удалена. Вместо этого проверка if (value_user 5) then
доработана и привязана к счетчику
также инициализация и вывод массива выведены в функцию и процедуру соответственно
vedro-compota
Sat, 01/23/2021 - 16:22
Permalink
if (value_user < 1) or (value
-- не по условию, число=5 по условию проходит нормально (если с ходу непонятно - лучше переделать)
Остальное правильно. решение засчитано.
_____________
матфак вгу и остальная классика =)