Помогите найти ошибку в программе
Задача:
Вставить число k (число вводится с клавиатуры) после всех элементов, больших заданного числа, а число t – перед всеми элементами, кратными 3.
Программа:
Const n=10;
Type myarray = Array[1.. 30] Of Integer;
Var m : myarray;
x, k, i,d,c,w :Integer;
Procedure Init2(Var m: myarray);
Var i : Integer;
Begin
For i:=1 To n Do
begin
m[i]:=random(100);
write(m[i],' ')
end;
writeln;
End;
Procedure Insert2(k1, x1: Integer; Var m: myarray);
Var i : Integer;
Begin
For i:= n+k Downto k1+1 Do
m[i+1]:= m[i];
m[k1+1]:=k;
End;
Procedure Insert3(k1, x1: Integer; Var m: myarray);
Var i,c: Integer;
Begin
c:=10;
For i:= k1+k to c Do
m[i+1]:= m[i];
m[k1-1]:=w;
c:=c+1;
End;
Procedure Print(n1: Integer; m: myarray);
Var i : Integer;
Begin
For i:=1 To n Do
Write(m[i]:3);
Writeln;
End;
Begin
Init2 (M);
Writeln(' Введите число для вставки: ');
Readln(k);
Writeln(' Введите заданное число: ');
Readln(d);
For i:= n Downto 1 Do
If M[i]>d Then
Insert2(i,x,M);
Writeln(' Введите второе заданное число: ');
Readln(w);
For i:= 1 to n Do
If M[i]mod 3=0 Then
Insert3(i,x,M);
Print(n+k,M); {вывод массива после вставки всех элементов}
End.
Ответы
Ответ:
В программе содержится несколько ошибок:
В процедуре `Insert3` неправильно определена граница цикла `For`. Вместо `For i:= k1+k to c Do` нужно написать `For i:= k1-1 downto 1 do`, чтобы вставить число `x1` перед элементами, кратными 3.
В процедуре `Insert3` значение `c` увеличивается после цикла, но это не имеет никакого эффекта на массив `m`. Значение `c` нужно увеличить до вставки элемента `x1`, иначе этот элемент не будет учтен при выводе массива.
В процедуре `Insert3` переменная `x1` не используется, вместо нее нужно использовать `w`, которое введено с клавиатуры.
Исправленный код:
Объяснение:
Const n = 10;
Type myarray = Array[1..30] Of Integer;
Var m: myarray;
x, k, i, d, c, w: Integer;
Procedure Init2(Var m: myarray);
Var i: Integer;
Begin
For i := 1 To n Do
begin
m[i] := random(100);
write(m[i],' ');
end;
writeln;
End;
Procedure Insert2(k1, x1: Integer; Var m: myarray);
Var i: Integer;
Begin
For i := n + x Downto k1 + 1 Do
m[i + 1] := m[i];
m[k1 + 1] := x1;
End;
Procedure Insert3(k1, w1: Integer; Var m: myarray);
Var i, c: Integer;
Begin
c := n + 1;
For i := k1 - 1 downto 1 do
m[i + 1] := m[i];
m[k1] := w1;
End;
Procedure Print(n1: Integer; m: myarray);
Var i: Integer;
Begin
For i := 1 To n Do
Write(m[i]:3);
Writeln;
End;
Begin
Init2(m);
Writeln('Введите число для вставки:');
Readln(x);
Writeln('Введите заданное число:');
Readln(d);
For i := n Downto 1 Do
If m[i] > d Then
Insert2(i, x, m);
Writeln('Введите число для вставки перед элементами, кратными 3:');
Readln(w);
For i := n DownTo 1 Do
If m[i] mod 3 = 0 Then
Insert3(i, w, m);
Print(n, m); {вывод массива после вставки всех элементов}
End.
Кроме того, в переменную c можно заранее записать значение n + 1, чтобы избежать лишнего вычисления в цикле Insert3.