• Предмет: Информатика
  • Автор: Detlaff
  • Вопрос задан 5 месяцев назад

Помогите найти ошибку в программе
Задача:
Вставить число 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.


asilvejstruk: Фу Паскаль мертвый язык
asilvejstruk: Только в школах такое живет

Ответы

Ответ дал: pupkinll2016
1

Ответ:

В программе содержится несколько ошибок:

В процедуре `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.

Вас заинтересует