Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
задачник по программированию.doc
Скачиваний:
25
Добавлен:
03.11.2018
Размер:
1.94 Mб
Скачать

Система тестов

Алгоритмический язык

алг Магический квадрат (арг цел N, арг цел таб A[1:N, 1:N], рез лит Otvet)

дано | N>0

нач цел i, j, St, S, лит Flag

St:=0 | вычисление суммы элементов главной диагонали

нц для i от 1 до N | в качестве эталонной суммы St

St:=St+A[i, i]

кц

Flag:="Да"; i:=1

нц пока (i<=N) и (Flag="Да") | вычисление сумм элементов строк

S:=0

нц для j от 1 до N

S:=S+A[i, j]

кц

если S<>St | сравнение суммы элементов текущей строки с эталонной

то Flag:="Нет"

иначе i:=i+1

все

кц

j:=1

нц пока (j<=N) и (Flag="Да") | вычисление сумм элементов столбцов

S:=0

нц для i от 1 до N

S:=S+A[i, j]

кц

если S<>St |сравнение суммы элементов текущего

то Flag:="Нет" |столбца с эталонной суммой

иначе j:=j+1

все

кц

если Flag="Да"

то S:=0 | вычисление суммы элементов побочной диагонали

нц для i от 1 до N

S:=S+A[i, N+1-i]

кц

если S<>St | сравнение суммы с эталонной

то Flag:="Нет"

все

все

если Flag="Да"

то Otvet := "Это магический квадрат."

иначе Otvet := "Это не магический квадрат."

все

кон

Исполнение алгоритма

(в таблице отражен только конечный результат работы циклов типа для, в которых

вычисляются суммы)

Обозначения проверяемых условий:

(i<=N) и (Flag = "ДА" )=> (1)

(j<=N) и (Flag = "ДА" )=> (2)

Flag = "ДА" =>(3)

Turbo Pascal

Program MagicSquare;

Uses Crt;

Var A : Array [1..20, 1..20] of Integer;

i, j, N : Integer;

Standard, S : Integer; {Standard - сумма-эталон, S – текущая сумма}

Flag : Boolean;

{-------------------------------------}

Procedure InputOutput; {описание процедуры ввода-вывода матрицы}

Begin ClrScr;

Write('Количество строк и столбцов - ');

ReadLn(N);

For i := 1 to N do

For j := 1 to N do

begin Write('A[' , i , ', ' , j , '] = ');

ReadLn(A[i, j]);

end;

ClrScr;

WriteLn('Исходная матрица :'); WriteLn;

For i := 1 to N do

begin

For j := 1 to N do Write(A[i, j] : 5);

WriteLn;

end; WriteLn;

End; { of InputOutput }

{-------------------------------------------}

Procedure MagicOrNot(Var Flag : Boolean); {описание процедуры, в которой выясняется, является ли квадрат "магическим"}

Begin {вычисление суммы элементов главной диагонали}

{в качестве эталонной суммы}

Standard:=0;

For i := 1 to N do Standard := Standard + A[i,i];

Flag:=TRUE; i:=1;

While (i<=N) and Flag do {вычисление сумм элементов строк}

begin

S:=0;

For j := 1 to N do S := S+A[i, j];

If S<>Standard then Flag := FALSE else i:=i+1;

end;

j:=1;

While (j<=N) and Flag do {вычисление сумм элементов столбцов}

begin

S:=0;

For i := 1 to N do S:=S+A[i, j];

If S<>Standard then Flag := FALSE else j := j+1;

end;

If Flag then

begin

S:=0; {вычисление суммы элементов побочной диагонали}

For i := 1 to N do S := S+A[i, N+1-i];

If S<>Standard then Flag := FALSE;

end;

End;

{--------------------------------------------------------}

BEGIN

InputOutput; {Вызов процедуры ввода-вывода }

MagicOrNot(Flag); {Вызов процедуры решения задачи }

If Flag then WriteLn('Это магический квадрат.')

else WriteLn('Это не магический квадрат.');

ReadLn;

END.

Пример 6.4. Дана матрица A(N, N). Если хотя бы один элемент строки матрицы

отрицателен, то все элементы этой строки заменить нулями.

Тест

Данные

Результат

N

Матрица А

Матрица А

3

Алгоритмический язык

(в этом алгоритме отражены процессы ввода исходных данных и вывода результатов )

алг Модификация(арг цел N, арг рез вещ таб A[1:N, 1:N])

дано | N>0

надо | элементы строк, содержащих отрицательные числа, заменены на нули

нач цел i, j, лит Flag

ввод N Блок-схема (фрагмент)

нц для i от 1 до N

нц для j от 1 до N

ввод A[i,j]

кц

кц

нц для i от 1 до N | цикл по строкам

j := 1; Flag := "Нет"

нц пока (j<=N) и (Flag ="Нет") |цикл до первого отрицат. элемента строки

если A[i, j]<0 то Flag := "Да"

иначе j:=j+1

все

кц

если Flag = "Да" |обнуление строки

то нц для j от 1 до N

A[i, j]:=0

кц

все

кц

нц для i от 1 до N

нц для j от 1 до N

вывод A[i,j]

кц

кц

кон

Исполнение алгоритма

Обозначение проверяемого условия:

(j<=N) и (Flag = "Нет")=> (1)

i

Flag

j

(1)

A[i,j]<0

Flag="Да"

A[i,j]

1

"Нет"

"Да"

1

2

1

2

3

+

+

-(кц)

-

+

+

A[1,1]=0

A[1,2]=0

A[1,3]=0

2

"Нет"

1

2

3

4

+

+

+

-(кц)

-

-

-

-

3

"Нет"

"Да"

1

1

2

3

+

-(кц)

+

+

A[3,1]=0

A[3,2]=0

A[3,3]=0

Turbo Pascal

Program Modify;

Uses Crt;

Var A : Array[1..10, 1..10] of Real;

N, i, j : Integer;

{-------------------------------------}

Procedure InputOutput; {описание процедуры ввода-вывода матрицы}

Begin ClrScr;

Write(’Количество строк и столбцов – ’); ReadLn(N);

For i := 1 to N do

For j := 1 to N do

begin Write(’A[’ , i , ’, ’ , j , ’] = ’);

ReadLn(A[i, j]);

end; ClrScr;

WriteLn(’ Исходная матрица :’); WriteLn;

For i := 1 to N do

begin

For j := 1 to N do Write(A[i, j] : 5 : 1);

WriteLn;

end; WriteLn;

End; { of InputOutput }

{-------------------------------------------}

Procedure Line(Var i : Integer); {описание процедуры обработки}

Var Flag : Boolean; {строки матрицы }

Begin

j := 1; Flag := FALSE;

While (j<=N) and not Flag do {цикл до первого отрицательного элемента строки }

If A[i, j]<0 then Flag:=TRUE else j:=j+1;

If Flag then {обнуление строки, содержашей отрицательные элементы }

For j := 1 to N do A[i, j] := 0;

End;

{-------------------------------------------}

Procedure OutRes; {описание процедуры вывода матрицы-результата}

Begin

WriteLn(’ Матрица-результат :’); WriteLn;

For i := 1 to N do

begin

For j := 1 to N do Write(A[i, j]:5:1);

WriteLn;

end; ReadLn;

End; { of OutRes }

{-------------------------------------------}

BEGIN

InputOutput; {вызов процедуры ввода-вывода матрицы}

For i := 1 to N do Line(i);{циклический вызов процедуры обработки строк}

OutRes; {вызов процедуры вывода матрицы-результата}

END.