Разбор задачи C2 (демо ЕГЭ 2005)
Требуется выяснить состояние массива А по окончании работы программы, а именно:
-
Какое число будет стоять в элементе массива А[1,2] ?
- Сколько всего ненулевых чисел будет в массиве А ?
- Ответить на следующий вопрос:
i:=1;
j:=1;
A[1,1]:=1;
k:=1;
while (i<N) OR (j<N) do
begin
if (i+j) mod 2 = 0 then j:=j+1
else i:=i+1;
k:= -k;
A[i,j]:=k;
end;
На какой более короткий фрагмент программы можно заменить приведенную часть программы, обеспечивая такое же заполнение массива А?
Программа на языке Паскаль | Программа на языке Бейсик |
---|---|
CONST N=5; VAR i, j, k: integer; А: array[1..N,1..N] of integer; BEGIN for i:=1 to N do for j:=1 to N do А[i,j]:=0; i:=1; j:=1; А[1,1]:=1; k:=1; while (i<N) OR (j<N) do begin if (i+j) mod 2 = 0 then j:=j+1 else i:=i+1; k:= -k; А [i,j]:=k; end; END. |
N=5 DIM A(N, N) AS INTEGER DIM I,J,K AS INTEGER FOR I=1 TO N FOR J=1 TO N А(I, J)=0 NEXT J NEXT I I=1 J=1 А(1, 1)=1 K=1 WHILE (I<N) OR (J<N) IF (I+J) MOD 2 = 0 THEN J=J+1 ELSE I=I+1 ENDIF K=-K А(I,J)=K WEND END |
Программа на Алгоритмическом | Программа на языке Си |
алг нач цел N=5 целтаб А[1:N,1:N] цел i, j, k; нц для i от 1 до N нц для j от 1 до N А[i,j]:=0 i:=1 j:=1 А[1,1]:=1; k:=1; нц пока (i<N) или (j<N) если mod(i+j)=0 то j:=j+1 иначе i:=i+1 все k:=-k; А[i,j]:=k кц кон |
#include <stdio.h> #define N 5 void main(void) { int А[N][N]; int i,j,k; for (i=0; i<N; i++) for(j=0; j<N; j++) А[i][j]=0; i=0; j=0; А[0][0]=1; k=1; while( (i<(N-1))||(j<(N-1)) ){ if( ((i+1)+(j+1)) mod 2 = 0) j=j+1; else i=i+1; k=-k; А[i][j]:=k; } } |
В задании розовым выделена часть программы, которую надо изменить. Определим, что происходит с массивом в этой части. В таблице ниже представлен ход выполнения программы для языков: Паскаль, Бейсик и Алгоритмический. Для Си есть некоторая особенность: индексы элементов массива начинаются с нуля, а не ед-цы. Поэтому значения i и j будут на 1 меньше.
Название переменной | Значение переменной после выполнения прохода цикла "пока": | ||||||||
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
i | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 |
j | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 |
А[i,j] (А(i,j) для Бейсик) | 1 | -1 | 1 | -1 | 1 | -1 | 1 | -1 | 1 |
Из таблицы видно, что когда i=j, элемент массива a[i,j]=1. Поэтому главная диагональ матрицы состоит из единиц. Под главной диагональю стоят элементы со значением -1:
i=1 | i=2 | i=3 | i=4 | i=5 | |
---|---|---|---|---|---|
j=1 | 1 | 0 | 0 | 0 | 0 |
j=2 | -1 | 1 | 0 | 0 | 0 |
j=3 | 0 | -1 | 1 | 0 | 0 |
j=4 | 0 | 0 | -1 | 1 | 0 |
j=5 | 0 | 0 | 0 | -1 | 1 |
Ответим на вопросы:
- A[1,2]=−1.
- Посчитаем количество элементов по таблице выше: 5 по главной диагонали + 4 под ней=9.
- Массив А можно заполнить так: элементам главной диагонали присваиваем значение 1, а элементам под данной диагональю (№ столбца > на 1) - значение -1. В таблице ниже представлены программы для 4-х языков программирования. Искомый фрагмент выделен розовым.
Программа на языке Паскаль | Программа на языке Бейсик |
---|---|
CONST N=5; VAR i, j, k: integer; А: array[1..N,1..N] of integer; BEGIN for i:=1 to N do for j:=1 to N do А[i,j]:=0; for i:=1 to N do begin А[i,i]:=1; if i<N then A[i,i]:=-1; end; END. |
N=5 DIM А(N, N) AS INTEGER DIM I,J,K AS INTEGER FOR I=1 TO N FOR J=1 TO N А(I, J)=0 NEXT J NEXT I FOR I=1 TO N А(I, J)=1 IF I<N THEN А(I, J)=-1 NEXT I END |
Программа на Алгоритмическом | Программа на языке СИ |
алг нач цел N=5 целтаб А[1:N,1:N] цел i, j, k; нц для i от 1 до N нц для j от 1 до N А[i,j]:=0 кц кц нц для i от 1 до N А[i,i]:=1 если i<N то А[i,i+1]:=-1 все кц кон |
#include <stdio.h> #define N 5 void main(void) { int А[N][N]; int i,j,k; for (i=0; i<N; i++) for(j=0; j<N; j++) А[i][j]=0; for(i=0;i<N;i+=){ А[i][i]=1; if( i<(N-1) ) А[i][i+1]=-1; } } |