Помощь - Поиск - Пользователи - Календарь
Полная версия: Пара задач на массивы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Warn
Здравствуйте! Помогите, пожалуйста, исправить 2 задачки.

1. Нужно удалить из массива А(20) первый отрицательный элемент.

Я решил так
Program Mas;
Const Count=20;
Var i, j: Integer; Flag: Boolean;
M: Array [1..Count] Of Integer;
Begin
WriteLn('BB. MACCuB');
Flag:= False;
For i:= 1 to Count Do
Begin
WriteLn('# ',i);
ReadLn(M[i]);
End;
j:=0;
i:=0;
Repeat
i:=i+1;
If M[i]<0 Then
Begin
Flag:= True;
j:= i;
Repeat
M[j]:=M[j+1];
j:= j+1;
Until
j>=Count;
End;
Until Flag Or (i=Count);
If Flag Then M[Count]:= 0;
Write('H MAC:');
For i:= 1 To Count Do Write(' ',M[i]);
Readln;
End.

Препод говорит, что можно обойтись без вложенных циклов. Но как? Не пойму. В общем, как оптимизировать программу? Тут, скорее всего, нужно убрать Flag.

2. Нужно вычислить сумму элементов массива М(15), лежащих в диапазоне [x,y].

Моё решение
Program Sum;
Const count=15;
Var i, x, y, S: Integer; M: Array[1..count] of Byte;
Begin
Writeln('BBeDuTe Ha4aLo Duana3oHa B MaccuBe u3 ',count,' eLeMeHToB');
Readln(x);
Writeln('BBeDuTe KoHeu, Duana3oHa B MaccuBe u3 ',count,' eLeMeHToB');
Readln(y);
For i:=1 To count Do
Begin
WriteLn('BBeDuTe eLeMeHT MaccuBa #', i);
Readln(M[i]);
End;
S:=0;
If x<y Then
For i:=x To y Do
S:=S+M[i]
Else
For i:=y To x Do
S:=S+M[i];
Writeln('CyMMa eLeMeHToB Duana3oHa paBHa ', S);
Readln
End.

Но препод сказал, что задача решена в упор неверно. Похоже, весь алгоритм неправильный. Но ведь я решил по условию! В чем ошибка? Подскажите, пожалуйста.
volvo
Цитата
Препод говорит, что можно обойтись без вложенных циклов. Но как?
Вот так:
const
Count = 20;
Var
m: Array [1 .. Count] Of Integer;
first, i, n: Integer;

Begin
First := -1; n := Count;


WriteLn('BB. MACCuB');

For i:= 1 to Count Do Begin
Write('# ',i:2, ' = '); ReadLn(M[i]);
If (First = -1) and (m[i] < 0) Then First := i;
End;

If First <> -1 Then Begin
For i := First To Count - 1 Do
m[i] := m[i + 1];
n := n - 1;
End;

For i := 1 To n Do Write(M[i]:5);
Readln;
End.


Вторая:
...
S:=0;
For i := 1 To Count Do
If (M[i] >= x) and (M[i] <= y) Then S:=S+M[i]
...
Гость
volvo, спасибо! А как оперативно..! Насчет первой задачи-это как у К. Пруткова: "Зри в корень" smile.gif А насчет второй-в условие не въехал. Теперь все на свои места встало. Еще раз спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.