Почему в ответе получается 26? var s,i: integer; mas: array[1..10] of integer; begin mas[1]: =14; mas[2]: =10; mas[3]: =-8; mas[4]: =6 ; mas[5]: =12; mas[6]: =4 ; mas[7]: =-16 ; mas[8]: =-7 ; mas[9]: =5; mas[10]: =3; s: =0; for i: =1 to 5 do mas[2*i]: =0; for i: =1 to 10 do if mas[i]> 5 then s: =s+mas[i]; write(s); end.
Сначала заданы элементы, потом все элементы с четным индексом обнуляются (через один). Потом мы считаем сумму элементов больших 5 в получившемся массиве.
N=8 в задании, насколько я понимаю, означает решение для восьмибитного представления данных, т.е. для случай, когда левый бит отводится под знак (0 - плюс, 1 - минус), а семь правых битов используются для представления числа. Отрицательное число представляется в дополнительном коде, т.е. нули заменяются единицами (и единицы - нулями), а потом в младшем разряде к полученному числу прибавляется единица. Вначале перевод. -13(10)=-0001101(2) Инвертируем биты: 1110010 Прибавляем единицу: 1110011 И дописываем слева 1 в качестве знака. 1 1110011 Аналогичным образом поступаем и с числом -7: -7(10)=-0000111(2) Инвертируем биты: 1111000 Прибавляем единицу: 1111001 И дописываем слева 1 в качестве знака. 1 1111001 Теперь сложение. Выполняем его в столбик для всех восьми бит. 11110011 + 11111001
11101100 У нас при сложении появилась единица переноса из левого разряда, но дальше уже разрядов нет и она просто отбрасывается. Результат получился с единичным знаковым разрядом. Поэтому для получения величины результата поступаем в обратном порядке: отделяем семь правых бит, вычитаем единицу и снова инвертируем полученное значение. Вместо единичного знакового разряда приписываем числу знак минус. 1101100 - 1 = 1101011. Инверсия: 0010100, результат -10100(2)=-20(10)
Для перевода чисел в дополнительный код, нужно: 1) перевести в двоичную систему счисления 0000 1101 13 0000 0111 7 2) инвертировать (заменить 0 на 1 и наоборот) 1111 0010 1111 1000 3) и прибавить 1 1111 0011 1111 1001 все) числа в дополнительном коде мы получили
теперь сложение: 1111 0011 1111 1001 + 1 1110 1100 мы получили переполнение и единицу в старшем разряде, это значит, сумма будет со знаком минус теперь переведем сумму в обычный код, не трогаем старший бит 1) _001 0011 инвертируем биты 2) _001 0100 прибавим 1 3) переводим в десятичную систему счисления: 20
вспоминаем, что сумма отрицательная, поэтому ответ будет: -20 ------------ для положительных чисел нужно перевести в двоичную систему Например: 2 + 3 0000 0010 - 2 0000 0011 - 3 и сложить 0000 0101 - = 2 + 4 = 6 у положительных дополнительный код совпадает с прямым кодом
Пошагово:
1) Строки
mas[1]:=14;
. . .
mas[10]:=3;
задают значения элементов массива.
Массив имеет вид:
14 10 -8 6 12 4 -16 -7 5 3
2) переменная s:=0;
3) цикл
for i:=1 to 5 do
mas[2*i]:=0;
все элементы, стоящие на чётных местах, обнуляются.
Массив имеет вид:
14 0 -8 0 12 0 -16 0 5 0
4) цикл
for i:=1 to 10 do
if mas[i]>5 then s:=s+mas[i];
просматриваем массив, и если элемент больше 5, добавляем его в сумму s:
добавится сначала 1-й элемент (так как 14>5), сумма станет 0+14=14
а потом 5-й (12>5), сумма станет 14+12 = 26
5)write(s);
напечатает 26, то есть значание s
Всё!