// PascalABC.NET 3.2, сборка 1509 от 27.07.2017 // Внимание! Если программа не работает, обновите версию!
begin var a:=ArrRandom(ReadInteger('n='),-10,10); a.Println; var s:=a.Where(x->x<0).Sum; // сумма отрицательных элементов var b:=a.Select(x->x=0?s:x).ToArray; b.Println end.
Const n=10; var A: array[1..n] of integer; B:array[1..n] of integer; i: integer; sum: integer; begin {Заполнение массивов случайными числами} randomize; for i:=1 to n do begin A[i]:=random(100)-50; B[i]:=random(100)-50; {или B[i]=A[i];, если значения массива B должны совпадать со значениями массива A } end; {Поиск суммы отрицательных элементов} sum:=0; for i:=1 to n do if A[i]<0 then sum:=sum+A[i]; {Замена нулевых элементов массива B на полученную сумму} for i:=1 to n do if B[i]=0 then B[i]:=sum; {Вывод значений массива A} writeln('массив A'); for i:=1 to n do write(A[i],','); writeln(''); writeln('Массив B'); {Вывод значений массива B} for i:=1 to n do write(B[i],',');
{Ожидание нажатия клавиши return от пользователя.} readln; end.
Сначала числа преобразуются в двоичный код. А=-5(10)=-101(2) В=-8,25(10)=-1000,01(2) Числа в формате с фиксированной запятой в памяти хранятся таким образом, что позиция запятой известна и неизменна для всех чисел (отсюда и название с фиксированной точкой) . Для этого число А должно быть представлено в виде -101,00(2) Пусть для хранения используется 8 разрядов. Тогда числа в прямом коде будут представлены в виде А: 1.00101,00 В: 1.01000,01 - здесь отделённый точкой старший разряд знаковый, 1 - означает минус. Обратный код получается инверсией всех разрядов, кроме знаковых. А: 1.11010,11 В: 1.10111,10 Теперь нужно получить дополнительный код. Но перед этим нужно иметь в виду, что ни запятые, ни точки в памяти не хранятся, но всегда известно, где знаковый разряд и сколько разрядов в дробной части. Поэтому А: 11101011 + 1 = 11101100 В: 11011110 + 1 = 11011111 Это и есть внутреннее представление заданных чисел в дополнительном коде. Сложение и вычитание чисел с фиксированной точкой производится так же, как и для целых чисел. 11101100 + 11011111
111001011 - старший разряд (№8) будет выдавлен из разрядной сетки и в данном случае просто отброшен. Результат операции сложения 11001011. Теперь можно преобразовать получившееся число в привычный десятичный вид и проверить результат. 1.1001011 1.0110100 - обратный код 1.0110100 + 1 = 1.0110101 - прямой код. Возвращаем запятую на место 1.01101,01 -> -(8+4+1+1/4) В десятичном виде это число -13,25 Сложение было выполнено правильно.
// Внимание! Если программа не работает, обновите версию!
begin
var a:=ArrRandom(ReadInteger('n='),-10,10); a.Println;
var s:=a.Where(x->x<0).Sum; // сумма отрицательных элементов
var b:=a.Select(x->x=0?s:x).ToArray; b.Println
end.
Пример
n= 20
1 6 2 4 2 3 5 -8 2 -6 0 1 -7 0 -7 8 -4 -8 -1 -8
1 6 2 4 2 3 5 -8 2 -6 -49 1 -7 -49 -7 8 -4 -8 -1 -8