Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

программирование_занятие_9

.doc
Скачиваний:
10
Добавлен:
14.05.2015
Размер:
251.9 Кб
Скачать

При 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

Завершение

Надеюсь, по окончании нашего урока, вы не будете останавливаться и отбрасывать задачи на составление программ. Как правило, эти задачи сложны лишь на первый взгляд. Для решения таких задач достаточно терпения и внимательности.