- •Кафедра Естественно-научных дисциплин учебно-методическое пособие по программированию
- •Глава 1. Алгоритмы линейной и разветвляющейся структуры
- •Результаты работы Pascal-программы
- •Система тестов
- •Система тестов
- •Система тестов
- •Результаты работы Pascal-программы:
- •Задачи для самостоятельного решения
- •Глава 2. Алгоритмы, реализуемые с помощью циклов типа для
- •Система тестов
- •Исполнение алгоритма
- •Задачи для самостоятельного решения
- •Глава 3. Алгоритмы, реализуемые с помощью вложенных циклов типа для
- •Пример 3.3. В заданной матрице a(n, m) поменять местами строки с номерами p и
- •Задачи для самостоятельного решения
- •Глава 4. Алгоритмы, реализуемые с помощью циклов типа пока
- •Цикл типа пока с прерыванием
- •Цикл типа пока без прерывания
- •Пример 4.1. Определить, является ли заданная последовательность чисел a1, a2, ..., aN монотонно убывающей. Система тестов
- •Система тестов
- •Результаты работы Pascal-программы
- •Система тестов
- •Задачи для самостоятельного решения
- •Глава 5. Алгоритмы, реализуемые с помощью вложенных циклов типа пока
- •Система тестов
- •Система тестов
- •Система тестов
- •Система тестов
- •Блок-схема (фрагмент)
- •Задачи для самостоятельного решения
- •Глава 6. Алгоритмы, реализуемые с помощью комбинации циклов типа для и пока
- •Система тестов
- •Система тестов
- •Исполнение алгоритма
- •Задачи для самостоятельного решения
- •Глава 7. Алгоритмы обработки символьной информации
- •Типы данных, используемые для обработки символьной информации
- •Функции и команды обработки строк
- •Система тестов
- •Исполнение алгоритма
- •Исполнение алгоритма
- •Система тестов
- •Задачи для самостоятельного решения
Система тестов
Алгоритмический язык
алг Магический квадрат (арг цел 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.