- •Оглавление
- •§1. Первое знакомство с системой программирования Турбо Паскаль
- •§2. Основные элементы языка
- •§3. Команды редактора Команды управления движением курсора
- •§4. Первая программа
- •Пояснения к программе
- •Запуск программы
- •Сохранение программы
- •§5. Управление позициями и цветом вывода
- •§6. Арифметический квадрат.Абсолютная величина
- •§7. Типы данных
- •§8. Целый тип данных
- •Пример 6
- •Пример 7
- •Пример 8
- •§9. Вещественный тип данных
- •Пример 7
- •Пример 8
- •§10. Логический тип данных
- •§11. Условный оператор
- •Пример 1
- •Пример 2
- •Решение
- •§12. Оператор безусловного перехода. Раздел описания меток
- •§13. Вложенные условные операторы
- •Решение
- •Задание
- •Решение задач Задача 1
- •Задача 8
- •Задача 9
- •Задача 10
- •§14. Цикл с параметром
- •Пример 1
- •Пример 2
- •Пример 3
- •§15. Работа с окнами. Метод пошагового выполнения программ
- •§16. Решение задач с использованием цикла с параметром Задача 1
- •Решение
- •Задача 2.
- •§17. Цикл с предусловием
- •Оператор цикла с предусловием
- •Пример 1
- •Решение
- •Пример 2
- •Решение
- •Пример 3
- •Решение
- •§18. Цикл с постусловием
- •Пример 1
- •Решение
- •Пример 2
- •§19. Алгоритм Евклида
- •§20. Вложенные циклы Пример 1
- •Решение
- •Пример 2
- •Решение
- •Пример 3
- •Решение
- •Пример 4
- •Решение
- •Пример 5
- •§21. Решение задач с использованием циклов с условием Задача 1
- •Решение
- •Задача 2
- •§22. Символьный тип данных
- •Пример 1
- •Решение
- •Пример 2
- •Решение
- •§23. Ограниченный тип данных
- •Var b:3..8; а не просто Vаг b:Integer;
- •Решение
- •§24. Оператор варианта (выбора)
- •Пример 1
- •Решение
- •Пример 2
- •Решение
- •Пример 3
- •Решение
- •Пример 4
- •§25. Перечисляемый тип данных
- •§26. Описание переменных, констант и типов. Раздел описания констант
- •Раздел описания типов
- •§27. Преобразование типов. Совместимость типов
- •Пример 1
- •Решение
- •Пример 2
- •Решение
- •Пример 3
- •Решение.
- •§28. Процедуры
- •Описание процедуры
- •Решение
- •Begin {основная программа}
- •Пример 2
- •Решение
- •Пример 3
- •§29. Функции
- •Пример 1
- •Пример 2
- •Решение
- •Пример 3
- •Решение
- •§30. Примеры рекурсивного программирования
- •Задачи с рекурсивной формулировкой
- •Пример 3
- •Задачи, которые можно решить как частный случай обобщенной
- •Задание
- •Задачи, в которых можно использовать характеристику или свойство функции Пример
- •Решение
- •§31. Файловый тип данных Операции для работы с файлами последовательного доступа
- •§32. Обработка файлов Связь переменной файлового типа с файлом на диске
- •Чтение из файла
- •Закрытие файла
- •Признак конца файла
- •Запись в файл
- •§33. Прямой доступ к элементам файла
- •Удаление файлов. Процедура
- •Переименование файлов. Процедура
- •Пример 2
- •§34. Текстовые файлы
- •Обработка текстовых файлов
- •Пример 1
- •Решение
- •Пример 2
- •Нетипизированные файлы
- •§35. Одномерные массивы. Работа с элементами(разбор на примерах) Пример 1
- •Решение
- •Пример 2
- •Решение
- •Пример 3
- •Решение
- •Begin {Считываем очередную строку}
- •§36. Работа с элементами массива (разбор на примерах)
- •Пример 2
- •§37. Методы работы с элементами одномерного массива
- •Создание массива
- •Пример 1
- •Решение
- •Пример 2
- •Решение
- •Работа с несколькими массивами Пример
- •Решение
- •§38. Удаление элементов из одномерного массива Пример 1
- •Решение
- •Begin {Сдвиг элементов на один влево}
- •Пример 2
- •Решение
- •§39. Вставка элементов в одномерный массив
- •Вставка нескольких элементов
- •Решение
- •§40. Перестановки элементов массива
- •§41. Двухмерные массивы Описание. Работа с элементами
- •§42. Найти сумму элементов
- •Решение
- •§43.Нахождение количества элементов с данным свойством
- •Пример 1
- •Решение
- •Пример 2
- •Решение
- •§44. Работа с несколькими массивами Пример
- •Решение
- •§45. Определить, отвечает ли заданный массив некоторым требованиям Пример 1
- •Решение
- •Пример 2
- •Решение
- •§46. Изменение значений некоторых элементов, обладающих заданным
- •§47. Заполнение двухмерного массива по правилу
- •Пример 2
- •Решение
- •§48. Вставка и удаление элементов Вставка строки
- •Решение
- •Примечания
- •Удаление строки Пример
- •Решение
- •Примечания
- •§49. Перестановка элементов массива Перестановка двух элементов Пример 1
- •Решение
- •Пример 2
- •§50. Строковый тип данных
- •Операции со строками
- •Склеивание
- •Сравнение
- •Примеры
- •Пример 8
- •Пример 9
- •Пример 10
- •§51. Множественный тип данных
- •Операции над множествами
- •Примеры
- •Сравнение множеств
- •Пример 1
- •Пример 2
- •Вопросы для обсуждения
- •Пример 3
- •Вопросы для обсуждения
- •Пример 4
- •Решение
- •Пример 5
- •Решение
- •§52. Комбинированный тип данных (записи)
- •Пример 1
- •Пример 2
- •Пример 3
- •Решение
§47. Заполнение двухмерного массива по правилу
Пример
Составить программу, запрашивающую координаты ферзя на шахматной доске и показывающую поля доски, находящиеся под боем (на доске нет других фигур).
Решение
Заметим, что шахматную доску удобно представить в виде двумерного массива размером 8х8. Координаты ферзя можно задать двумя числами (номером строки и номером столбца), но в шахматах принято указывать букву и число. Буква указывает номер строки, а число − номер столбца. Поэтому не будем отступать от традиций и введем координаты именно таким образом. В программе сделаем проверку правильности ввода, и если все правильно, то переведем букву в соответствующее ей число (a-1, b-2, c-3, d-4, е-5, f-6, g-7, h-8), тогда будет удобнее работать.
Для решения задачи полезно знать следующие свойства шахматной доски. Все диагонали делятся на восходящие и нисходящие:
Каждая диагональ обладает следующими свойствами:
-
для элементов любой восходящей диагонали сумма номеров строки и столбца постоянна, причем для разных диагоналей − разная, то есть i+j=const1;
-
для элементов нисходящих диагоналей разность номеров строки и столбца тоже постоянна и для разных диагоналей разная, то есть i-j=const2.
Это необходимо знать для того, чтобы определить номера диагоналей, на которых находится ферзь. Вся программа будет такой:
Program Example_120;
Const n=8;
Type dmyarray=Array[1..n,1..n] Of Integer;
Var A: dmyarray;
c: Char;
str, stl: Integer;
{str - номер строки, stl - номер столбца}
Function Place(ch: Char): Integer;
Var k: Integer;
Begin
Case ch Of
'a': k:=1; 'b': k:=2; 'c': k:=3;
'd': k:=4; 'e': k:=5; 'f: k:=6;
'g': k:=7; 'h': k:=8;
Place:=k;
End;
Procedure Init(k, l: Integer;
Var x: dmyarray);
{k - номер строки, l - номер столбца, где стоит ферзь}
Var i, j: Integer;
Begin
For i:=1 To n Do
For j:=1 To n Do {Под боем клетки,
находящиеся с клеткой, на которой стоит
ферзь, на одной вертикали, горизонтали,
восходящей или нисходящей диагонали.
Клетки, находящиеся под боем, мы
помечаем 1, остальные помечаем 0.}
If (i=k) Or (j=1) Or (i+j=k+1)
Or (i-j=k-l)
Then x[i, j]:=1 Else x[i, j]:=0;
x[k, l]:=2;
{На этой клетке стоит ферзь}
End;
Procedure Print(x: dmyarray);
Var i, j: Integer;
Begin
For i:=1 To n Do
Begin
For j:=1 To n Do
Case x[i, j] Of
0: Write (' ':3);
1: Write ('*':3);
2: Write ('F':3);
End;
Writeln;
End;
Begin
Writeln('Введите координаты ферзя');
Readln(с, stl);
If (c<'a') Or (c>'h') Or (stl<1)
Or (stl>n) Then
Writeln('Некорректный ввод')
Else
Begin
str:=Place(с);
Init(str, stl, A);
Print(A);
End;
Readln;
End.
Можно функцию Place составить иначе:
Function Place(ch: Char): Integer;
Var k: Integer;
Begin
Place:=0rd(ch)-Ord('a')+1;
End;
В этом случае она будет более рациональна.
Пример 2
Заполнить массив А размером n×m следующим образом (по "змейке");
Например, при n=6 и m=8:
1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
33 34 35 36 37 38 39 40
48 47 46 45 44 43 42 41