- •Практикум по Турбо Паскалю
- •Первые занятия Первое знакомство с системой программирования Турбо Паскаль
- •Команды редактора
- •Задания
- •Режим помощи
- •Первая программа
- •Запуск программы
- •Сохранение программы
- •Выход из системы программирования Турбо Паскаль
- •Простейшие линейные программы
- •Арифметический квадрат. Абсолютная величина
- •Целый и логический типы данных Условный оператор
- •Логический тип данных
- •Условный оператор
- •Вложенные операторы условия
- •Целый тип данных. Цикл с параметром
- •Цикл с параметром (разбор на примере)
- •Работа с окнами. Метод пошагового выполнения программ
- •Работа с окнами
- •Решение задач с использованием цикла с параметром
- •Вопросы для обсуждения
- •Трассировка примера
- •Цикл с постусловием
- •Алгоритм Евклида
- •Вложенные циклы
- •Решение задач с использованием циклов с условием
- •Простые типы данных
- •Задания
- •Решение задач
- •Вещественный тип данных
- •Задание
- •Решение задач
- •Ограниченный, перечисляемый типы данных. Оператор варианта
- •Ограниченный тип данных
- •Оператор варианта
- •Перечисляемый тип данных
- •Решение задач
- •Описание переменных, констант и типов Раздел описания констант
- •Раздел описания переменных
- •Раздел описания типов
- •Решение задач
- •Преобразование типов. Совместимость типов
- •Задания
- •Решение задач
- •Решение задач
- •Контрольные работы Контрольная работа №1
- •Контрольная работа №2
- •Основы Паскаля
- •X y22m размер gamma alfa r15
- •Процедуры и функции
- •Описание процедур и функций
- •Файловый тип
- •Описание файлового типа
- •Подпрограммы
- •Процедура Assign
- •Процедура Reset
- •Процедура Rewrite
- •Процедура Write
- •Процедура Close
- •Функция FileSize
- •Функция FilePos
- •Текстовые файлы
- •Описание текстового файла
- •Консоль
- •Устройства
- •Соответствие текстовых файлов и логических устройств
- •Операции над текстовыми файлами
- •Процедура Assign
- •Процедура Reset
- •Процедура Rewrite
- •Процедура Append
- •Процедура Close
- •Функция Eof
- •Функция SeekEof
- •Блочные файлы Описание типа блочного файла
- •Процедура BlockRead
- •Процедура BlockWrite
- •Операции ввода-вывода
- •Регулярные типы данных Одномерные массивы. Работа с элементами
- •Способы задания одномерных массивов
- •Работа с элементами массива (разбор на примерах)
- •Методы работы с элементами одномерного массива Изменение значения некоторых элементов
- •Создание массива
- •Работа с несколькими массивами
- •Удаление элементов из одномерного массива Удаление элемента
- •Вставка элементов в одномерный массив Вставка одного элемента
- •Вставка нескольких элементов
- •Перестановка элементов массива
- •Перестановка части массива
- •Найти сумму элементов
- •Работа с несколькими массивами
- •Двумерный массив. Работа с элементами Изменение значений некоторых элементов, удовлетворяющих заданному свойству
- •Заполнение двумерного массива по правилу.
- •Вставка и удаление элементов двумерного массива
- •Перестановка элементов массива
- •Комбинированный тип данных (записи)
Заполнение двумерного массива по правилу.
Пример 10
Составить программу, запрашивающую координаты ферзя на шахматной доске и указывающую поля доски, находящиеся под боем.
Решение
Заметим, что шахматную доску удобно представить в виде двумерного массива размером 8*8. Координаты ферзя можно вводить двумя числами (номер строки и номер столбца), но в шахматах принято вводить букву и число. Буква отвечает за номер строки, а число - за номер столбца. Поэтому не будем отступать от традиций и введём координаты именно таким образом. В программе сделаем проверку правильности ввода и если всё правильно, то переведём букву в соответствующее ей число ('а'-1, 'b'-2,'c'-3,'d'-4,'e'-5,'f''-6,'g'-7,'h'-8), тогда будет удобнее работать.
Для решения надо ещё знать следующие свойства шахматной доски. Все диагонали делятся на восходящие и нисходящие.
Для любой восходящей диагонали сумма номера строки и номера столбца постоянна и для разных диагоналей - разная, то есть i + j = const1.
Для нисходящих - разность номера строки и номера столбца постоянны и для разных диагоналей - разная, то есть i - j = const2.
Это необходимо для того, чтобы определить номера диагоналей, на которых поставлен ферзь.
Вся программа будет такой:
Program Exampl_47; 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; End; 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=1) Or (j=1) Or (i+j=k+1) Or (i-j=k-1) 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 Writeln('Введи координаты ферзя '); Readln(c, stl); If (c<'a') Or (c>'h') Or (stl<1) Or (stl>n) Then Writeln ('некорректный ввод') Else Begin str:= Place(c); Init(str,stl, A); Print(A); End; Readln; End.
Можно функцию Place составить иначе:
Function Place(ch: Char): Integer; Var k : Integer; Begin Place:=Ord(ch)- Ord('a')+1; End;
В этом случае она будет более рациональна.
Пример 11
Заполнить массив А размером n*m следующим образом, например, n = 6 и m = 8:
01 02 03 04 05 06 07 08
16 15 14 13 12 11 10 09
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
То есть заполняется в виде "змейки".
Решение
Для того, чтобы заполнить, надо вывести правило заполнения, а оно в данном случае будет таким: если ряд нечётный (то есть номер строки - нечётное число), А[i, j] = (i-1)*m + j, иначе (то есть когда строка чётная) А[i, j] = i*m - j + 1. По этому правилу и составляем процедуру заполнения:
Procedure Fill(Var x: dmyarray); Var i, j : Integer; Begin For i:=1 To n Do For j:=1 To m Do If i Mod 2=1 Then x[i,j]:=(i-1)*m+j Else x[i,j]:=i*m-j+1; End;
