программирование_занятие_9
.doc
При j=7, выделяются i=2 i=7
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
8 |
6 7 |
6 6 |
6 6 |
6 6 |
6 6 |
6 6 |
6 6 |
7 6 |
7 |
5 7 |
5 6 |
5 5 |
5 5 |
5 5 |
5 5 |
6 5 |
7 5 |
6 |
4 7 |
4 6 |
4 5 |
4 4 |
4 4 |
5 4 |
6 4 |
7 4 |
5 |
3 7 |
3 6 |
3 5 |
3 4 |
4 3 |
5 3 |
6 3 |
7 3 |
4 |
2 7 |
2 6 |
2 5 |
3 4 |
4 3 |
5 2 |
6 2 |
7 2 |
3 |
1 7 |
1 6 |
2 5 |
3 4 |
4 3 |
5 2 |
6 1 |
7 1 |
2 |
7 |
1 6 |
2 5 |
3 4 |
4 3 |
5 2 |
6 1 |
7 |
1 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
При j=8, выделяются i=1 i=8
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
7 7 |
8 |
6 7 |
6 6 |
6 6 |
6 6 |
6 6 |
6 6 |
6 6 |
7 6 |
7 |
5 7 |
5 6 |
5 5 |
5 5 |
5 5 |
5 5 |
6 5 |
7 5 |
6 |
4 7 |
4 6 |
4 5 |
4 4 |
4 4 |
5 4 |
6 4 |
7 4 |
5 |
3 7 |
3 6 |
3 5 |
3 4 |
4 3 |
5 3 |
6 3 |
7 3 |
4 |
2 7 |
2 6 |
2 5 |
3 4 |
4 3 |
5 2 |
6 2 |
7 2 |
3 |
1 7 |
1 6 |
2 5 |
3 4 |
4 3 |
5 2 |
6 1 |
7 1 |
2 |
7 |
1 6 |
2 5 |
3 4 |
4 3 |
5 2 |
6 1 |
7 |
1 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
Выявленные при исполнении программы клетки лишь окаймляют требуемый ответ. Для получения полного ответа нужно заменить условие (i=9-j) OR (i=j), определяющее дискретные значения на условие (i>=9-j) and (i<=j), определяющее интервал.
Можем ответить на вопросы заданмя:
1) Выдаст ли программа, написанная программистом, поле, для которого i=4, j=5 ?
Да.
2) Указать все из перечисленных ниже полей, которые удовлетворяют постановке задачи, т.е. для таких полей должно быть выполнено P(i,j) = V(i,j)
(i=1, j=8) |
(i=2, j=8) |
(i=1, j=7) |
(i=5, j=5) |
(i=8, j=6) |
Да |
Да |
Нет |
Да |
Нет |
Решение может дать представленная исправленная программа.
В ней используется вложенный цикл, то есть программа выполняет некоторые шаги 4*8=32 раза.
Назначение ветвления – выбор ряда значений счетчика i.
Но мы можем сразу устанавливать требуемые значения счетчика и необходимость в ветвлении отпадает.
Программа на языке Паскаль |
Программа на языке Бейсик |
VAR i,j: integer; BEGIN writeln(‘искомые поля’); for j:=5 to 8 do for i:=1 to 8 do begin if (i>=9-j) AND (i<=j) then writeln(‘i=’,i, ‘j=’,j); end; END. |
PRINT “Искомые поля” FOR J=5 TO 8 FOR I=1 TO 8 IF (I>=9-J) OR (I<=J) THEN PRINT “I=”; I PRINT “J=”; J ENDIF NEXT I NEXT J END |
Кроме того, что сократился текст программы, шаги выполняются 2+4+6+8 = 20 раз (против 32 в предыдущем варианте). То есть и исполняться эта программа будет примерно на 1/3 быстрее.
Программа на языке Паскаль |
Программа на языке Бейсик |
VAR i,j: integer; BEGIN writeln(‘искомые поля’); for j:=5 to 8 do for i:= 9-j 1 to о do begin writeln(‘i=’,i, ‘j=’,j); end; END. |
PRINT “Искомые поля” FOR J=5 TO 8 FOR I=9-J TO J PRINT “I=”; I PRINT “J=”; J NEXT I NEXT J END |
Задачи на упрощение программы |
Квадратный массив А размера NxN (где N=5) в программе сначала обнуляется, а затем производится некоторая дальнейшая обработка в соответствии с программой. Текст программы приведен ниже.
Требуется выяснить состояние массива А по окончании работы программы, а именно:
1) Какое число будет стоять в элементе массива А[1,2] ?
2) Сколько всего ненулевых чисел будет в массиве А ?
а также ответить на следующий вопрос:
3) В программе после начального обнуления массив А заполняется с помощью следующих операторов
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: integer;{i - строка j - столбец} k: integer; A: array[1..N,1..N] of integer; BEGIN for i:=1 to N do for j:=1 to N do A[i,j]:=0; 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; END.
|
N=5 DIM A(N, N) AS INTEGER FOR I=1 TO N FOR J=1 TO N A (I, J) = 0 NEXT J NEXT I I=1 J=1 A(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 A(I,J)=K WEND END |
Попробуем выполнить программу. Изначально элементы массива 5х5 обнулены (вложенный цикл в начале программы).
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Согласно программе, элемент (1,1) делаем единицей, в переменные i,j,k так же единицы.
Приступаем к выполнению цикла «пока».
Если сумма значений переменных i и j четная (как сейчас), то увеличиваем на 1 значение в j (к следующей колонке), иначе – в i (к следующей строке).
Переменная k служит для смены знака вносимого в массив числа.
1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
По окончании программы на главной диагонали таблицы будут стоять значения 1, а чуть выше – значения -1.
1 |
-1 |
0 |
0 |
0 |
0 |
1 |
-1 |
0 |
0 |
0 |
0 |
1 |
-1 |
0 |
0 |
0 |
0 |
1 |
-1 |
0 |
0 |
0 |
0 |
1 |
Можем выяснить состояние массива А по окончании работы программы, а именно:
1) Какое число будет стоять в элементе массива А[1,2] ?
-1.
2) Сколько всего ненулевых чисел будет в массиве А ?
9.
Для ответа на 3 задание, зная что требуется, можем заменить цикл «пока» на цикл со счетчиком. При этом из программы исчезают лишняя переменная k и ветвление.
Программа на языке Паскаль |
Программа на языке Бейсик |
CONST N=5; VAR i, j: integer;{i - строка j - столбец} A: array[1..N,1..N] of integer; BEGIN for i:=1 to N do for j:=1 to N do A[i,j]:=0; A[1,1]:=1; for i=2 to N do begin A[i,i]:=1; A[i-1,i]:=-1 end; END.
|
N=5 DIM A(N, N) AS INTEGER FOR I=1 TO N FOR J=1 TO N A (I, J) = 0 NEXT J NEXT I A(1, 1)=1 FOR I=2 TO N A(I,I)=1 A(I-1,I)=-1 NEXT I END |
Завершение |
Надеюсь, по окончании нашего урока, вы не будете останавливаться и отбрасывать задачи на составление программ. Как правило, эти задачи сложны лишь на первый взгляд. Для решения таких задач достаточно терпения и внимательности.