Консультация № 170038
30.06.2009, 19:36
0.00 руб.
0 1 1
Глубокоуважаемые эксперты помогите начинающему программисту пожалуйста решите задачу на Паскале. заранне огромное спасибо.
В одномерно массиве, состоящем из n целочисленных элементов, вычислить:1)минимальный по модулю элемент массива 2)сумму модулей элементов массива, расположенных после первого отрицательного элемента.
Сжать массив удалив из него все элементы, величина которых находится в инвентаре [a,b]. Освободившийся в конце массива элементы заполнить нулями. срок сегодня к 23:00. оплата 300пойдет?

Обсуждение

Неизвестный
30.06.2009, 20:22
общий
это ответ
Здравствуйте, Эрик Насыров.
Вот в приложении код с некоторыми комментариями. Вывод предполагает, что числа не более, чем трехзначные
Вид окна приложения:
Код:
---- Исходный массив ------
-50 -47 36 -30 -23 17 -19 -34 -13 -8 -42 -3 -43 34 -45 -21
41 -14 27 -18 19 34 21 -20 -34 -18 -4 -26 32 -23 -2 -36
37 -22 27 47 -1 38 32 -48

Минимальный по модулю элемент равен -1 имеет индекс 37
Индекс первого отрицательного элемента: 1
Сумма модулей элементов после 1 равна: 1036
Введите первое граничное число a: 48
Введите второе граничное число b: -3
Массив после сжатия:
-50 -47 -30 -23 -19 -34 -13 -8 -42 -43 -45 -21 -14 -18 -20 -34
-18 -4 -26 -23 -36 -22 -48
Весь массив:
-50 -47 -30 -23 -19 -34 -13 -8 -42 -43 -45 -21 -14 -18 -20 -34
-18 -4 -26 -23 -36 -22 -48 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Нажмите любую клавишу


Приложение:
uses CRT;
CONST
N = 40;
Ar_max = 100; {Максимальное значение элемента в массиве}
Ar_max2 = Ar_max div 2;
VAR
ar: Array[1..N] of Integer;
i, j: Integer;
N_temp: Integer; {Размерность сжатого массива}
a, b: Integer;
sum: Longint; {Сумма может оказаться больше числа, которое "вмещается"
в Integer}
min_abs_no: Integer; {Номер минимального по модулю}
first_negative: Integer; {Номер первого отрицательного}
BEGIN
ClrScr;
{Заполнение случайными числами от -Ar_max2 до +(Ar_max2-1)}
for i:=1 to N do
ar[i] := (Random(Ar_max) - Ar_max2);
{Покажем исходный}
WriteLn('---- Исходный массив ------');
for i:=1 to N do Write(Ar[i]:5);
WriteLn;
min_abs_no:=1;
for i:=1 to N do
if abs(ar[i]) < abs(ar[min_abs_no]) then min_abs_no := i;
WriteLn;
Write('Минимальный по модулю элемент равен ', ar[min_abs_no]);
WriteLn(' имеет индекс ', min_abs_no);
first_negative := 0; {нулевого индекса нет,
если останется нулем - нет отрицательных}
for i:= 1 to N do
if ar[i] < 0 then begin
first_negative := i;
Break {Прерывает выполнение цикла}
end;
if first_negative = 0 then
WriteLn('В массиве нет отрицательных чисел')
else begin
sum := 0;
WriteLn('Индекс первого отрицательного элемента: ', first_negative);
for i:= first_negative + 1 to N do
sum := sum + abs(ar[i]);
WriteLn('Сумма модулей элементов после ',first_negative,
' равна: ',sum);
end;
{Защищенный от ошибочного ввод чисел a и b}
{$R+} {Проверка принадлежности диапазону включается}
repeat
Write('Введите первое граничное число a: ');
{$I-} ReadLn(a); {$I+}
i:= IOResult;
if i <> 0 then WriteLn('Ошибка ввода. Попробуйте еще раз');
until i = 0;
repeat
Write('Введите второе граничное число b: ');
{$I-} ReadLn(b); {$I+}
i:= IOResult;
if i <> 0 then WriteLn('Ошибка ввода. Попробуйте еще раз');
until i = 0;
{Если a > b - меняем местами}
if a > b then begin
i:= a;
a:= b;
b:= i
end;
{сжатие массива}
i := 1;
N_temp := N;
repeat
if (ar[i] >= a) and (ar[i] <= b) then begin
for j:=i+1 to N do
ar[j-1] := ar[j];
ar[N_temp] := 0;
N_temp := N_temp - 1
end
else i:= i+ 1;
until i > N_temp;
{Показ}
WriteLn('Массив после сжатия:');
if N_temp = 0 then WriteLn('Массив пуст') else
begin
if N = N_temp then WriteLn('Не было удалено ни одного элемента');
for i:= 1 to N_temp do Write(ar[i]:5);
WriteLn;
end;
WriteLn('Весь массив:');
for i:=1 to N do Write(ar[i]:5);
WriteLn;
WriteLn('Нажмите любую клавишу'); ReadKey
END.
5
Форма ответа