Добавлен: 23.04.2023
Просмотров: 325
Скачиваний: 1
СОДЕРЖАНИЕ
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ИЗУЧЕНИЯ ОСНОВ ПРОГРАММИРОВАНИЯ В PASCAL
1.1. Знакомство с системой программирования в Pascal
1.2. Знакомство с элементами языка программирования Pascal
1.3. Особенности организации решения задач на языке Pascal
Сохранить как… – сохранить под новым именем
Выполнить – выполнить программу
Остановить – остановить программу.
ГЛАВА 2. ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ ЦИКЛОВ В ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PASCAL
2.1. Этапы решения задач с использованием циклов
2.2. Методические рекомендации по решению задач с использованием цикла с параметром
Оператор цикла с параметром (перечислением) организует выполнение одного оператора (простого или составного) заранее известное число раз или когда необходимо использовать в теле цикла информацию о номере очередной итерации.
Существует две формы записи этого цикла:
Первая форма
for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик1> будет увеличиваться на 1.
<значение1> — это начальное значение счетчика.
Это может быть переменная или число.
<конечное_значение>: как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.
Если требуется написать несколько операторов в теле цикла, используем begin и end.
И <счетчик1>, и <конечное_значение>, и <значение1> - переменные целого типа.
Чаще всего в качестве счетчика используется переменная i.
Вторая форма
for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик2> будет уменьшатся на 1.
<значение2> — это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.
Два важных примечания:
- Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
- Изменять значение счетчика внутри тела нельзя.
Оператору цикла с параметром соответствует следующая блок – схема:
Для i от m1 до m2
Оператор(ы)
Оператор(ы) после выполнения цикла
Рисунок 5. Блок –схема цикла с параметром
Пример 1.
Задача: Составьте программу, которая считает среднее арифметическое чисел в интервале от 150 до 340.
Решение:
1.Анализ условия задачи.
Если дан ряд величин, то величина, заключённая между наименьшей и наибольшей из данных, называется «средней».
Средняя арифметическая (или среднее арифметическое)- получается от сложения данных величин и деление суммы на число этих величин.
Ср.ар.= a1+a2+…+an
n
где, a1,a2,…….,an – данные величины, а n-их число.
Пусть S-сумма слагаемых, n- их число, S1-среднее арифметическое.
S=150+151+152+…+338+339+340.
150-первое слагаемое.
151-второе слагаемое.
153-третье слагаемое.
………………………
338- (n-2) слагаемое.
339- (n-1) слагаемое.
340- n слагаемое.
S1=S/n.
Так как сумма слагаемых (в интервале только целые чисел) и их общее число имеют значения целых чисел, то и в программе их значения будут такого же типа. Соответственно среднее арифметическое – действительное число.
2.Разработка словесного алгоритма (математической модели).
В начале необходимо найти сумму чисел в интервале, причём точное количество суммирования слагаемых нам известно. Так же можно подсчитать количество таких слагаемых. А затем используя формулу Sl=S/n найдём среднее арифметическое.
3.Графическое изображение решения задачи (блок-схема).
s:=0
n:=0
Для i от 150 до 340
s:=s+i
n:=n+1
s1
Рисунок 6. Решение задачи с помощью блок - схемы
4.Разработка программного кода, трассировка программного кода.
Program Sum1;
Var s, i, n: integer;
s1:real;
Begin
s:=0; n:=0;
For i:=150 to 340 do begin
s:=s+i;
n:=n+1;
end;
s1:=s/n;
Writeln (‘Среднее арифметическое чисел равно ’, s1:5:2);
end.
Трассировка:
s:=0; n:=0;
Для i от 150 до 340
i=150 i=151 i=152 …………… i=340
s=0+150 s=150+151 s=131+152 …………… s= +340
n=o+1 n=1+1 n=2+1 …………... n= +1
s1=/
вывод s1.
5.Набор программы в среде программирования.
Рисунок 7. Набор программы в Pascal
6.Отладка и компиляция.
Осуществляется нажатием клавиши F9.
7.Запуск программы на исполнение.
Выполняется нажатием комбинации клавиш Ctrl-F9.
Просмотр результата выполнения программы Отладка Мой экран. Выход – нажатие любой клавиши.
Пример 2.
Задача: Вывести на экран буквы от Z до A.
Решение:
1.Анализ условия задачи.
Необходимо вывести буквы латинского алфавита в обратной последовательности.
2.Разработка словесного алгоритма (математической модели).
Число общего вывода букв известно. Вывод осуществляется в обратном порядке, поэтому приращение параметра равное -1,и начальное значение больше конечного (т.е. m1>m2).При нахождении каждой буквы вывод на экран осуществляется сразу.
3.Графическое изображение решения задачи (блок-схема).
Для i от Z до A
i
Рисунок 8. Решение задачи с помощью блок - схемы
4.Разработка программного кода, трассировка программного кода.
Program ;
Var i:=char;
Begin
For i:=’Z’ to ‘A’ do
Write (i);
Writeln;
End.
Трассировка:
Для i от Z до A
Вывод Z
Вывод W
Вывод V
……………….
Вывод B
Вывод A
5.Набор программы в среде программирования.
6.Отладка и компиляция.
Осуществляется нажатием клавиши F9.
7.Запуск программы на исполнение.
Выполняется нажатием комбинации клавиш Ctrl-F9.
Просмотр результата выполнения программы Отладка Мой экран. Выход – нажатие любой клавиши.
2.3 Примеры применения регулярных выражений
Рассмотрим следующую задачу: имеется строка, содержащая набор слов, разделенных одним или несколькими пробелами (здесь и далее под словом будем понимать последовательность символов, отличных от пробелов и ограниченных пробелами или началом/концом строки). В начале и конце строки пробелы отсутствуют:
Будем считать, что исходная строка содержится в переменной s типа string.
В классе string имеется специальный метод Split, предназначенный для разбиения строки, однако при его использовании для решения поставленной задачи вы получим сложный для восприятия код:
foreach s0: string in s.Split(new char[1](' '), StringSplitOptions.RemoveEmptyEntries) do
Writeln(s0);
Для того чтобы данный фрагмент откомпилировался, необходимо поместить в начало программы директиву uses System.
Заметим, что если использовать более простой вариант метода Split с единственным символьным параметром - пробелом (s.Split(' ')), то в результирующий массив будут записаны не только «настоящие» слова, но и пустые строки (они считаются «словами», расположенными между соседними пробелами).
Теперь решим эту же задачу с использованием регулярных выражений (в начале программы надо указать директиву uses System.Text.RegularExpressions):
foreach s0: string in Regex.Split(s, ' +') do
Writeln(s0);
В данном случае мы вызвали метод Split класса Regex – основного класса библиотеки .NET, связанной с регулярными выражениями. В этом методе вначале указывается обрабатываемая строка, а затем – регулярное выражение, которое определяет вид разделителя между словами. Метод возвращает массив строк, содержащий слова, на которые была разделена исходная строка. В приведенном фрагменте мы использовали регулярное выражение, состоящее из двух символов: пробела и знака «+». На языке регулярных выражений знак «+» означает, что предшествующий символ может повторяться один или более раз. Именно благодаря знаку «+» (одному из так называемых квантификаторов) несколько подряд расположенных пробелов считаются одним разделителем.
Обратите внимание на то, что метод Split вызывается не для объекта, а для класса Regex, т. е. этот метод является классовым. Все основные методы класса Regex реализованы в двух вариантах: классовом и экземплярном. Классовые методы проще использовать, тогда как экземплярные позволяют добиться большей эффективности, если одно и то же регулярное выражение надо применять к различным строкам (экземплярные методы класса Regex мы рассмотрим в одном из последующих примеров).
Предположим теперь, что нам требуется определить индексы символов строки s, с которых начинается каждое слово. Для такой задачи простое разбиение строки не подходит, так как по результирующему массиву нельзя будет определить, где именно в исходной строке располагались полученные слова. Разумеется, задачу можно решить с помощью посимвольного просмотра строки, однако с помощью метода Matches класса Regex результат получается гораздо быстрее:
foreach m: Match in Regex.Matches(s, '\w+') do
Write(m.Index);
Например, при обработке строки
Каучук барабан алгебра диафрагма
на экран будет выведен следующий текст (символы строки индексируются от 0):
0 9 18 27
Обсудим приведенный фрагмент программы. В нем был использован метод Matches, который позволяет найти все фрагменты исходной строки, удовлетворяющие указанному регулярному выражению. В данном случае в регулярном выражении, кроме уже известного нам квантификатора «+», была использована специальная директива \w, обозначающая любой словообразующий (т. е. алфавитно-цифровой) символ. Найденные вхождения возвращаются в виде коллекции типа MatchCollection, элементы которой можно перебрать с помощью цикла foreach. Каждый элемент коллекции имеет тип Match. Набор свойств этого типа позволяет получить не только строковое значение найденного вхождения (свойство Value), но и дополнительную информацию о нем, в частности, индекс, начиная с которого это вхождение содержится в исходной строке (свойство Index), а также длину найденного вхождения (свойство Length).
В рассмотренных примерах мы использовали квантификатор «+», означающий одно или более вхождений ранее указанного символа (или одного из элементов указанного множества символов). Все квантификаторы по умолчанию являются «жадными», т. е. они «пытаются захватить» как можно больше символов из исходной строки. Квантификатор перестанет захватывать символы только в том случае, если захват очередного символа приведет к тому, что результат не будет удовлетворять регулярному выражению. Так, в последнем примере квантификатор захватит все символы первого слова и попытается захватить следующий за ним пробел, однако при этом результат не будет удовлетворять регулярному выражению, поэтому квантификатор «вернет обратно» захваченный пробел и «удовлетворится» ранее захваченным первым словом.
В классе Regex имеются еще два метода, предназначенных для поиска в строке и имеющих те же параметры, что и метод Matches: это IsMatch и Match. Метод IsMatch проверяет, имеются ли в исходной строке требуемые вхождения, и в зависимости от результата поиска возвращает значение True или False. Метод Match возвращает первое найденное вхождение в виде объекта типа Match (если ни одно вхождение на найдено, то свойство Success возвращенного объекта будет равно False). Заметим, что, имея объект типа Match, мы можем продолжить поиск в текущей строке, используя для этого его метод NextMatch.
Помимо разбиения строки и поиска в ней требуемых подстрок класс Regex позволяет осуществлять замену найденных подстрок. Рассмотрим следующую задачу: в строке, содержащей слова, разделенные одним или несколькими пробелами, требуется заключить в угловые скобки все слова, имеющие длину не более 5 символов. Например, строка
Текст Клавиатура Поле Монитор
должна быть преобразована в следующую:
<Текст> Клавиатура <Поле> Монитор.
Метод класса Regex, предназначенный для замены, имеет имя Replace. Он имеет больше параметров, чем рассмотренные ранее методы, так как, помимо исходной строки и регулярного выражения, определяющего, что надо искать, требуется указать, как именно изменять найденные вхождения. В простых случаях достаточно указать строку - выражение замены, в более сложных ситуациях можно определить функцию, обрабатывающую каждое найденное вхождение и возвращающую строку, которая должна его заменить. В выражениях замены можно указывать, помимо обычных символов, специальные управляющие последовательности (подстановки), соответствующие исходной строке или ее фрагментам. Одной из таких подстановок является $0, означающая текущее найденное вхождение. Метод Replace возвращает строку, в которой выполнены все требуемые замены.
При решении задачи нам надо использовать особый квантификатор, который явно определяет количество повторений требуемых символов. Если допускается ровно N повторений, то подобный квантификатор имеет вид {N}; если число повторений может меняться от M до N, то надо использовать вариант {M,N}.
Используя все уже известные нам сведения о регулярных выражениях, мы можем попытаться решить задачу следующим образом:
Writeln(Regex.Replace(s, '\w{1,5}', '<$0>'));
Однако этот вариант решения будет неверным. Например, при обработке указанной выше строки мы получим следующий результат:
<Текст> <Клави><атура> <Поле> <Монит><ор>