Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Способы описания синтаксиса языка программирования↑ Стр 1 из 8Следующая ⇒ Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Алгоритмы Определение. Алгоритм - описание последовательности действий для решения поставленной задачи. Близкие по смыслу слова: рецепт, метод, способ, процедура. Свойства алгоритма
Для алгоритма необходимо задать исполнителя, который умел бы выполнять некоторое множество элементарных действий. Все действия в алгоритме должны быть из этого множества. В качестве исполнителя может выступать человек, компьютер, робот и т.д. Для одной задачи может быть несколько алгоритмов. Пример. Найти max из чисел x, y, z. Алгоритм 1. (Словесное описание) Если x>=y и x>=z, то положить max:=x и завершить алгоритм Алгоритм 2. (Описание на псевдокоде) max:=x Определение. Два алгоритма называются эквивалентными, если множества допустимых исходных данных для них совпадают и применение этих алгоритмов к одинаковым исходным данным дает одинаковые результаты. Способы описания алгоритмов 1. Словесный. 2. Псевдокод. 3. C помощью блок-схем. Пример. (алгоритм 2, представленный блок-схемой) Альтернативная современная нотация - диаграмма деятельности (Activity Diagram) в языке UML (Universal Modelling Language). 4. C помощью языка программирования. Язык программирования Язык программирования (ЯП) характеризуется используемым алфавитом, синтаксисом и семантикой. Элементарные действия в языке программирования называют инструкциями, операторами или командами. Синтаксис ЯП определяет правила записи основных конструкций ЯП и устанавливает, какие фрагменты текста программы следует считать неделимыми (например,:=, <=, for, 3.14, 'abc'). Такие фрагменты называют лексемами или терминальными символами (терминалами). Семантика ЯП определяет смысловое значение синтаксических конструкций. Множество всех лексем образует словарь языка. Способы описания синтаксиса языка программирования При описании синтаксиса используются БНФ, РБНФ (разработаны в 1960 году для описания Алгола-60 Джоном Бэкусом и Петером Науром) и синтаксические диаграммы (разработаны Н. Виртом). 1. БНФ (Бэкуса-Наура форма) Примеры. условный оператор::= if логическое условие then оператор цифра::= 0 | 1 | 2 |... | 9 имя::= буква | имя буква | имя цифра В формах Бэкуса-Наура, помимо терминальных, присутствуют так называемые нетерминальные символы или нетерминалы (будем записывать нетерминалы наклонным шрифтом Arial, а терминалы - шрифтом Courier), а также значки::= (есть по определению) и | (или). Нетерминалы определяются через терминалы и другие нетерминалы. В последнем примере нетерминал имя определяется через самого себя. Такое определение называется рекурсивным. РБНФ (Расширенная БНФ) Помимо значков::= и |, используются значки: [ ] - необязательная часть (0 или 1 повторение) { } - 0 или более повторений Примеры. условный оператор::= if логическое выражение then оператор [ else оператор ] вызов процедуры::= имя [(параметр {, параметр })] список::= элемент [, список ] Синтаксическая диаграмма Примеры. Архитектура и принцип работы компьютера Принцип работы компьютера cформулирован Джоном фон Нейманом в 1946 году и используется в современных компьютерах с небольшими изменениями. Язык программирования Паскаль Комментарии в программе { } и (* *) – могут быть вложенными // – до конца строки. Комментарии игнорируются компилятором и предназначены для пояснения текста программы. Общая структура программы program имя; // заголовок программы (не обязателен) Выделенные слова называются зарезервированными. Они используются для описания конструкций языка и не могут использоваться в качестве имен. То есть нельзя описать, скажем, переменную с именем begin, но можно - с именем integer. Правила записи программ
Лексемы языка Pascal 1) Специальные символы знаки операций::= >= = 2) Идентификаторы (используются в качестве имен объектов программы). Определение. Идентификатор - последовательность латинских букв или цифр, начинающаяся с буквы. К буквам также относят символ _ (подчеркивания). _a1 - идентификатор 3) Константные значения 3.14 4) Комментарии. Раздел описаний Любой объект в программе (переменная, константа, именованный тип, подпрограмма, метка) перед использованием должен быть описан в разделе описаний. Он состоит из разделов описания переменных, констант, типов, меток, подпрограмм, чередующихся в произвольном порядке. Раздел описания переменных var i,j: integer; Раздел описания типов type int = integer; Оператор присваивания Оператор присваивания имеет вид: имя переменной:= выражение Пример 1. Вычислить x16. x:=x*x; // x^2 Пример 2. Вычислить x15=(x5)3. y:=x*x; // x^2 Присваивание переменной некоторого начального значения называется инициализацией этой переменной. Если переменной можно присвоить выражение, то говорят, что они совместимы по присваиванию. Переменная и выражение совместимы по присваиванию:
Во всех случаях, кроме первого, происходит неявное преобразование типов, в процессе которого может меняться внутреннее представление данных. Заметим также, что при присваивании типа integer типу byte может произойти выход за границы диапазона меньшего типа byte. Пример. var i: integer; Для преобразования вещественного в целое следует использовать функции round и trunc. i:=round(2.0); Операторы ввода/вывода Оператор вызова процедуры ввода имеет одну из следующих форм: read(список переменных); Оператор вызова процедуры вывода имеет одну из следующих форм: write(список выражений); Для перехода на новую строку в процессе вывода можно использовать следующий прием: const newline = #10; или writeln('Hello'+newline+'world'); Форматы вывода Для любых типов: write(x:а); // а - ширина поля вывода Если число не помещается в указанные позиции, то формат игнорируется. Вещественные числа в этом формате выводятся в экспоненциальной форме. Для вещественного типа: write(x:а:b); // a - ширина поля вывода, b - количество цифр в дробной части Вещественные числа в этом формате выводятся в виде с фиксированной точкой. Неправильный формат вывода игнорируется. Например, если x=14.457, то после write(x:0:2) будет выведено 14.46. Выражения и операции Выражения Выражения - конструкции, задающие правила вычисления. Выражения состоят из операндов и операций. Для группировки в выражениях могут использоваться круглые скобки. В качестве операндов могут выступать также вызовы функций. Каждое выражение имеет тип, зависящий от типов входящих в него операндов. Выражение называют арифметическим, если его значением является число. Выражение называют логическим, если его значение имеет логический тип. Логическое выражение всегда имеет тип boolean. Тип арифметического выражения определяется типом операнда "старшего" типа: если в выражении есть хотя бы один операнд типа real, то выражение имеет тип real, если нет операндов типа real, но есть операнды типа integer, то выражение имеет тип integer. Исключение составляет операция деления: результатом деления целого на целое является вещественное. Не все типы совместимы в выражении: к примеру, нельзя сложить целое и строку, нельзя из строки вычесть символ. При вычислениях выражений со смешанными типами также происходит неявное преобразование типов. Например, если i имеет тип integer, а bt - тип byte, то при вычислении выражения i+bt происходит вначале преобразование значения bt к "старшему" типу integer и только после этого выполняется операция сложения. Операции Операции в выражении вычисляются в порядке приоритетов: вначале операции с большим приоритетом, затем - с меньшим. Операции с одинаковым приоритетом вычисляются слева направо. Операции в скобках выполняются в первую очередь. Таблица приоритетов операций языка Pascal
Примеры. 2-1+3=(2-1)+3 Логические операции Простые: x>0 или 2*2=4 Составные: состоят из простых + логические операции (and, or, not, xor) (x>=3) and (x<=5) Таблица истинности
Пример. A находится между B и С. или Решение. (A>B) and (A<C) or (A>C) and (A<B) Пример. Написать условие, при котором точка с координатами (х, у) лежит внутри, вне, на границе прямоугольника с вершинами (x1,y1) и (x2,y2) и сторонами, параллельными осям координат. var Inside, Outside, OnTheBoundary: boolean; Стандартные функции
Пример. sqr(x+y-1) Стандартные функции в Dephi Требуется подключение модуля Math: uses Math;
В модуле Math определены также константы const Явление переполнения Пример. var x: real; Для избежания ошибки переполнения можно воспользоваться директивами процессора {$Q-}, {$Q+}: var i: integer; Условный оператор if логическое выражение then оператор1 [ else оператор2 ] Семантика оператора if задается следующей блок-схемой: Пример. Hайти min из a, b. if b>a then Пример. Упорядочить значения в a, b по возрастанию. if a>b then Составной оператор begin Необходимость составного оператора: составной оператор объединяет несколько операторов в один: Пример. if a>b then Пример. case Month of Циклы while, repeat и for Оператор цикла с предусловием (цикл ПОКА) while B do где оператор образует тело цикла, B является логическим выражением. Семантика оператора while задается следующей блок-схемой: Сравнение while и repeat
Оператор цикла с параметром for x:=x1 to x2 do или for x:=x2 downto x1 do где переменная x называется параметром цикла, x1 и x2 – выражения совместимого с x типа. Важно! Выражения x1 и x2 вычисляются один раз до цикла. Замечания.
for i:=1 to n do for i:=1 to n do for i:=1 to n do Определение. Инвариант цикла – это предикат, который истинен перед выполнением цикла и после каждой его итерации. Например, если находится сумма чисел, то инвариант цикла – сумма уже введенных чисел. Если находится минимум, то инвариант цикла: в min – минимальные из уже введенных. Инвариант цикла служит для доказательства правильности алгоритма. Зацикливание repeat или while True do Примеры использования циклов Пример 1. Сумма n чисел. s:=0; Пример 2. Произведение n чисел. p:=1; Пример 3. n!!=n*(n-2)*(n-4)*...*2 (или 1) p:=1; Пример 4. Сколько нечетных среди 10 введенных. c:=0; Пример 5. Защита от неверного ввода. repeat Пример 6. Табулирование функции f(x) на отрезке [a,b] в точках, разбивающих [a,b] на N частей. assert(N>0); Пример 7. Вывод 10 первых степеней двойки. x:=10; Пример 8. Вывод всех двузначных чисел, кратных 5. x:=1; Пример 9. Вывести n первых чисел Фибоначчи. Числа Фибоначчи определяются следующим образом: a:=1; Пример 10. Найти сумму цифр целого положительного числа. read(m); Пример 11. Найти НОД (А,В), где А,В - целые положительные. Алгоритм Евклида: НОД (А,В) = НОД (В, А mod B); НОД (А,0)=А read(A,B); Замечание. Доказательство того, что цикл завершится: С уменьшается на каждом шаге, оставаясь >=0. Пример 12. Найти max из N введенных чисел. Алгоритм 1. max:= первое введенное read(x); Алгоритм 2. max:= самое маленькое число (-MaxInt или -MaxDouble) for i:=1 to N do Пример 13. Разложение числа на простые множители. Алгоритм на псевдокоде цикл Алгоритм на Паскале read(x); Пример 14. Даны a0,..., an, x Вычислить значение многочлена f(x)=a0xn+a1xn-1+...+an в точке x. Схема Горнера: f(x)=(...((a0x+a1)x+a2)x+a3...)x+an read(x); n+1 операций "+" и n+1 операций "* " Примеры на суммирование рядов Если xi = f(xi-1), то x:=x0; Пример 15. Вычислить сумму x:=1; Если существует предел суммы Пример 16. Знакопеременный ряд z:=1; Пример 17. Вычислить сумму xi=xi-1*y*(i-1)/i - неэффективно. Лучше pi=yi, pi=pi-1*y Код программы. for i:=0 to n do Пример 18. Метод половинного деления Задача. Дана непрерывная на [a,b] функция f(x),имеющая на [a,b] ровно один корень (т.е. f(a)*f(b)<=0). Найти его с точностью eps. Алгоритм. fa:=f(a); Процедуры break и continue Задача. Есть ли среди введенных 10 чисел число К? Решение. Способ 1. flag:=false; Недостаток: после того как flag получит значение True, он уже не поменяется, поэтому дальнейшее выполнение цикла бесполезно. Для решения подобных проблем используются специальные процедуры, меняющие порядок выполнения операторов: break и continue. Вызов процедуры break завершает цикл досрочно. Вызов процедуры continue досрочно завершает текущую итерацию цикла. Процедуры break и continue могут вызываться только в цикле. Мнение автора. Позволю себе заметить, что решение назвать break и continue процедурами мне не нравится. В C, Java это - операторы, как и goto. И правильно: обычная процедура не может менять порядок выполнения операторов: это удел синтаксических конструкций (операторов). Решение. Способ 2. flag:=false; Приведем другие примеры использования процедур break и continue. Пример 1. Является ли число N простым? IsSimple:=True; Пример 2. Вводятся ненулевые числа, конец ввода - 0. Найти сумму и произведение положительных. S:=0; Всегда можно обойтись без break или continue, введя дополнительные логические переменные. while B do Так выглядит программа без break: B1:=false; Вложенные циклы Цикл, вызываемый в другом цикле, называется вложенным. Задача. Вывести таблицу значений Аk, где А=2..10. Метод окаймления "Заморозим" А и составим алгоритм при фиксированном А. for A:=2 to 10 do Разморозим А и окаймим данный участок цикла по А от 2 до 10. Задача. Вывести все простые числа от 100 до 999. Переборные задачи Задача. Вывести все тройки целых положительных a, b, c <100: a2+b2=c2 for a:=1 to 99 do Решение 1а. for a:=1 to 99 do Решение 1б. for a:=1 to 99 do Но! Нельзя заниматься преждевременной оптимизацией! Процедуры Пример. Составить процедуру вычисления среднего арифметического и среднего геометрического А и В. С ее помощью найти среднее арифметическое и среднее геометрическое пар A,B; A,C; B,C. procedure Mean(A,B: real; var MA,MG: real); var A,B,C: real; begin Оператор вызова процедуры имя [(список фактических параметров)] Количество и типы фактических параметров при вызове процедуры должны соответствовать количеству и типам формальных параметров. Функции Функция - это подпрограмма, возвращающая одно значение особым образом так, что это значение может быть непосредственно использовано в выражении. Пример. Функция function sign(x: real): integer; Для того, чтобы функция вернула значение необходимо в её теле имени функции присвоить некоторое значение. Имя функции в этом контексте ведет себя как обычная переменная, но имя функции нельзя использовать в правой части оператора присваивания в качестве значения этой переменной. var s,a: real; Для сравнения реализуем вычисление sign в виде процедуры. procedure CalcSign(x: real; var sign: integer); var a: real; begin Переменная Result В Delphi и FreePascal неявно определена переменная Result, присваивание которой равносильно и хранит результат функции. function Sum(n: integer): integer; Локальные переменные подпрограмм не инициализируются (место на программном стеке под них отводится при выделении памяти под запись активации), поэтому их явная инициализация обязательна. Способы передачи параметров Перегрузка имен подпрограмм Перегрузка имен подпрограмм имеется в Delphi, FreePascal и отсутствует в Turbo Pascal. В одном пространстве имен процедуры (функции) могут иметь одинаковые имена, если они имеют различные списки параметров. procedure swap(var a,b: integer); overload; Это явление называется полиморфизмом. Полиморфизм – использование одного имени (одного знака операции) для выполнения родственных действий. Примеры. writeln(a,b) – полиморфная процедура: параметры различных типов. a+b – операция «+» используется для различных типов. Тонкости перегрузки Пример 1. procedure A(i: integer); overload; var b: byte; Пример 2. function f: integer; overload; Правило: тип возвращаемого значения не участвует в разрешении перегрузки. Параметры по умолчанию Параметры по умолчанию имеются в Delphi, FreePascal и отсутствуют в Turbo Pascal. procedure DoOperation(a,b: real; var res: real; op: char=’+’); Правило. Параметры по умолчанию всегда должны идти последними. Предварительное объявление подпрограмм procedure p(i: integer); forward; // Предварительное объявление. p будет определена далее procedure q; procedure p(i: integer); Методы разработки программ Шаг. x:=2; 2 шаг. Детализируем IsPrime. Возможно, потребуется несколько этапов детализации. Метод эффективен, когда задача четко поставлена и имеется четкий алгоритм ее решения. Модули Модуль - это файл, в котором находится специальным образом оформленная группа взаимосвязанных процедур (функций), констант, типов. 1. Объединить группу взаимосвязанных подпрограмм в единое целое, отделив от остального кода. Структура модуля Модуль имеет два больших раздела - раздел интерфейса и раздел реализации. unit имя; // имя модуля должно совпадать с именем файла Раздел инициализации модуля вызывается до начала работы основной программы. В разделе интерфейса описываются все экспортируемые модулем объекты (подпрограммы, типы, переменные, константы). Пример. Модуль unit MyUtils; Interface const Author = 'Иванов'; var n: integer; procedure MinMax(a,b: integer; var mn,mx: integer); Implementation uses Math; procedure MinMax(a,b: integer; var mn,mx: integer); function IsPrime(x: integer): boolean; initialization Основная программа uses MyUtils; Перечислимый тип Перечислимый тип задается списком значений, представляющих собой имена. var d: (Mon,Tue,Wed,Thu,Fri,Sat,Sun); Succ для последнего и Pred для первого элементов не определены. Пример. type DayOfWeek = (Mon,Tue,Wed,Thu,Fri,Sat,Sun); var d1,d2: DayOfWeek; function ToString(d: DayOfWeek): string; Перечислимый тип может использоваться в качестве переключателя в операторе case, а также параметр цикла for может иметь перечислимый тип: for d:=Mon to Fri do Диапазонный тип type Диапазонный тип совместим по присваиванию только с типом, на базе которого он построен (перечислимый, целый, символьный) Массивы Структурированный тип данных объединяет совокупность значений в единое целое. К структурированному типу данных в Pascal относятся: массив, запись, множество, строка, файл. Массив - совокупность элементов одного типа, каждый из которых имеет номер, называемый индексом (индексов может быть несколько). Описание массивов var Присваивание массивов Массивы одного типа можно присваивать друг другу и использовать при передаче параметров. var A,B: array [1..10] of integer; Однако, var Инициализация массивов var A: IArr = (2,1,3,7,4,8,...); // нельзя для локальных переменных Замечание. Элементами массива могут быть другие массивы: var AA1: array [1..3] of integer; Хранение массивов в памяти !!!Не сделано!!! Открытые массивы Используются в качестве параметров (Delphi, Free Pascal) procedure WriteArr (A: array of integer); Для открытые массивов них недопустимы присваивания массивов, индексом всегда служит целое Динамические массивы (Delphi, Free Pascal); var A: array of integer; // всегда индексируется с 0 Контроль выхода за границы диапазона - {$R±} (Range Check) Записи Запись - множество значений разных типов, объединенных в единое целое. Каждое значение имеет имя и называется полем записи. Описание record Пример. type Student = record Обращение к полям записи var s1,s2,s3: Student; with - оператор присоединения Инициализаторы записей var s: Student = {name: 'Иванов'; course: 5; group: 2}; Сортировка массивов записей Для сортировки массива записей по различным критериям в процедуру сортировки передают функцию сравнения, которая является бинарным предикатом. Например, для сортировки массива студентов функция сравнения имеет следующий вид: cmp(a[j+1],a[j]) Эта функция имеет смысл операции "меньше". BubbleSortStudent(gr1_11,36,LessName); Индексная сортировка При сортировке массивов больших объектов эффективность теряется из-за многочисленных копирований больших объектов в памяти. Чтобы этого избежать, переставляют не сами объекты, а их индексы, для этого вводится специальный индексный массив, который отображает виртуальные индексы в реальные i (виртуальный индекс) → Index[i] (реальный индекс) В начальный момент времени виртуальный индекс совпадает с реальным, т.е. Index[i]=i. При сортировке мы сравниваем элементы массивов используются виртуальные индексы, а меняем местами элементы индексного массива. procedure BubbleIndexStudentSort(var a: StArr; var Index: I
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-09-20; просмотров: 1432; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.172.190 (0.013 с.) |