Урок 15 Задача 10
Primary tabs
Заполните массив из 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 - то это тоже была бы ситуация для завершения, но элементы в массиве ещё бы остались.Примечание: оформить код сдвига элемента как функцию.
var
m: array[1..5] of integer;
i, x: integer;
q, p: boolean;
function sdvig (a, b: integer): integer; // функция принимает текущий и следующий эл-т массива, возвращает новое значение текущего
begin
a:=b; // присваиваем текущему эл-ту значение след-го, последнему присвоится 0
result:= a; // результат - новый текущий элемент
end;
begin
randomize();
for i:=low(m) to high(m) do // цикл для присваивания случайных значений
begin
m[i] := random(9) + 1;
write(m[i], ' ');
end; // конец цикла
writeln(' -- исходный массив');
while (p = false) do // цикл работает, пока переключатель остается в таком положении, т.е. пока не все эл-ты массива нулевые
begin
write('Введите число от 1 до 5: ');
readln (x); // считываем введенное значение
if (1<=x) and (x<=5) then // проверка, чтобы введенное значение было от 1 до 5
begin
q:= false; // ставим переключатель в исходное положение
p:= true; // ставим второй переключатель в исходное положение
for i:=low(m) to high(m) do // вложенный цикл для обхода массива
begin
if (i = x) then // когда счетчик сравнивается с введенным числом
q:= true; // переключаем переключатель
if q = true then // когда переключатель переключен
m[i]:= sdvig (m[i], m[i+1]); // передаем в функцию текущий и следующий эл-нт массива, получаем от ф-ции новый текущий эл-нт
if not (m[i]=0) then // если встретится ненулевой элемент
p:= false; // переключаем второй переключатель
write (m[i], ' ');
end;
if p = false then
writeln(' -- промежуточный результат')
else
writeln(' -- не осталось ненулевых элементов');
end;
end;
readln ();
end.- Log in to post comments
- 1383 reads
vedro-compota
Sun, 11/27/2022 - 13:16
Permalink
function sdvig
function sdvig
-- на вход получаем массив и позицию сдвига и возвращаем массив итоговом виде
_____________
матфак вгу и остальная классика =)
Patrick
Tue, 11/29/2022 - 18:10
Permalink
Исправил
type massiv = array[1..5] of integer; var m: massiv; n, i, k: integer; function sdvig (ms: massiv; a, h: integer): massiv; // функция, возвращает массив после сдвига var j: integer; // счетчик цикла q: boolean; // переключатель begin q:= false; // ставим переключатель в исходное положение for j:=low(ms) to h do // обходим до переданного значения (кол-во оставшихся элементов) begin if (j = a) then // когда счетчик сравнялся с позицией сдвига q:= true; // переключаем переключатель if q = true then // когда переключатель переключен begin if j = h then // если счетчик дошел до переданного значения ms[j]:= 0 // присваиваем элементу ноль else // если не дошел ms[j]:= ms[j+1]; // присваиваем значение следующего элемента end; end; result:= ms; // результат - массив после сдвига end; begin // начало тела основной программы randomize(); for i:=low(m) to high(m) do // обходим маассив для присвоения случайных значений begin m[i] := random(9) + 1; write(m[i], ' '); // выводим элементы в первоначальном виде end; writeln (' -- исходный массив'); k:= high(m); // количество оставшихся элементов while (k > 0) do // цикл работает, пока остаются не удаленные элементы begin write ('Введите число: '); readln (n); // считываем введенное число if (1<=n) and (n<=5) then // проверяем, чтобы введенное число было от 1 до 5 begin m:= sdvig (m, n, k); // передаем массив, позицию сдвига и кол-во оставшихся эл-тов for i:=low(m) to high(m) do // обходим массив после сдвига для вывода на экран write(m[i], ' '); if n<=k then begin k:=k-1; if k>0 then write (' -- промежуточный результат') else write (' -- все элементы удалены') end; writeln; end else // когда введенное число не от 1 до 5 break; // прерываем цикл end; readln (); end.Вывод в консоли:
vedro-compota
Sun, 12/04/2022 - 13:57
Permalink
аналогично исправить сдвиг
аналогично исправить сдвиг
_____________
матфак вгу и остальная классика =)
math2
Sun, 11/27/2022 - 20:03
Permalink
Для теста
Для теста
var m: array[1..5] of integer; i, x, ov: integer; q, p: boolean; function sdvig (a, b: integer): integer; // функция принимает текущий и следующий эл-т массива, возвращает новое значение текущего begin a:=b; // присваиваем текущему эл-ту значение след-го, последнему присвоится 0 result:= a; // результат - новый текущий элемент end; begin randomize(); for i:=low(m) to high(m) do // цикл для присваивания случайных значений begin m[i] := random(9) + 1; write(m[i], ' '); end; // конец цикла writeln(' -- исходный массив'); while (p = false) do // цикл работает, пока переключатель остается в таком положении, т.е. пока не все эл-ты массива нулевые begin write('Введите число от 1 до 5: '); readln (x); // считываем введенное значение if (1<=x) and (x<=5) then // проверка, чтобы введенное значение было от 1 до 5 begin q:= false; // ставим переключатель в исходное положение p:= true; // ставим второй переключатель в исходное положение for i:=low(m) to high(m) do // вложенный цикл для обхода массива begin if (i = x) then // когда счетчик сравнивается с введенным числом q:= true; // переключаем переключатель if q = true then begin if (i = high(m)) then ov := 0 else ov := m[i+1]; m[i]:= sdvig (m[i], ov); // передаем в функцию текущий и следующий эл-нт массива, получаем от ф-ции новый текущий эл-нт end; if not (m[i]=0) then // если встретится ненулевой элемент p:= false; // переключаем второй переключатель write (m[i], ' '); end; if p = false then writeln(' -- промежуточный результат') else writeln(' -- не осталось ненулевых элементов'); end; end; readln (); end.vedro-compota
Sun, 11/27/2022 - 20:43
Permalink
поправили запуск
поправили запуск
_____________
матфак вгу и остальная классика =)