ЯП презентация по курсу.pptx
- Количество слайдов: 170
Языки программирования Номер семестра II Занятия Аудиторные Общий объем Всего Лекции 153 72 36 Заборовский Андрей Николаевич Лабораторн Практиче ые ские 36 СРС 81 Число курсовых Форма проектов итоговой (работ), аттестац расчетны ии х заданий экзамен
Литература
Литература
Литература
http: //progbook. ru/
Этапы решения задач на ЭВМ Решение любой задачи на ЭВМ представляет собой процесс обработки данных с помощью программы. Создание такой программы предполагает выполнение ряда последовательных этапов: • постановка задачи; • математическое описание и выбор метода (математическое моделирование); • разработка алгоритма решения; • составление программы (кодирование); • тестирование и отладка программы; • эксплуатация программы.
Этапы решения задач на ЭВМ формулируется цель задачи, определяется взаимосвязь с другими задачами, раскрывается состав и форма представления входной, Постановка промежуточной и результативной информации, задачи характеризуются формы и методы контроля достоверности информации на ключевых этапах решения задачи, определяются формы взаимодействия пользователя с ЭВМ в ходе решения задачи и т. п.
Этапы решения задач на ЭВМ Моделирование выполняется формализованное описание программы, т. е. устанавливаются и формулируются средства языка математики, логико-математические зависимости между исходными и результатными данными. Для задач, допускающих возможность математического описания, необходимо выбрать численный метод решения, а для нечисловых задач – принципиальную схему решения в виде однозначно понимаемой последовательности выполнения элементарных математических и логических операций.
Этапы решения задач на ЭВМ Алгоритмизация разработку оригинального или адаптацию известного алгоритма Кодирование перевод описания алгоритма на один из доступных для ЭВМ языков программирования
Этапы решения задач на ЭВМ Тестирование Отладка представляет собой совокупность действий, предназначенных для демонстрации правильной работы программы. Цель тестирования заключается в выявлении возможных ошибок в разработанных программах путем их проверки на наборе заранее подготовленных контрольных примеров. подразумевает совокупность действий, направленных на устранение ошибок в программе. Действия по отладке начинаются с момента обнаружения фактов ошибочной работы программы и завершаются устранением причин, порождающих ошибки
Этапы решения задач на ЭВМ Эксплуатация выполнение программы в заданных условиях в интересах пользователя
Понятие алгоритма Интуитивное (бытовое) понятие алгоритма - порядок выполнения действий для получения желаемого результата Определение 1 Алгоритм - это заданное на некотором языке конечное предписание, задающее конечную последовательность выполнимых элементарных операций для решения задачи, общее для класса возможных исходных данных. Определение 2 (Колмогоров): Алгоритм – это всякая система вычислений, выполняемых по строго определенным правилам, которая после какоголибо числа шагов заведомо приводит к решению поставленной задачи. Определение 3 (Марков): Алгоритм – это точное предписание, определяющее вычислительный процесс, идущий от варьируемых исходных данных к искомому результату.
Понятие алгоритма Исполнитель алгоритма - это некоторая абстрактная или реальная (техническая, биологическая или биотехническая) система, способная выполнить действия, предписываемые алгоритмом. Исполнитель алгоритма характеризуется: - средой; - элементарными действиями; - системой команд; - отказами.
Понятие алгоритма Сpеда (или обстановка) - это "место обитания" исполнителя. Напpимеp, для условного исполнителя на клеточном поле сpеда - это бесконечное клеточное поле. Стены и закpашенные клетки тоже часть сpеды. А их pасположение и положение самого исполнителя задают конкpетное состояние среды. Система команд - Каждый исполнитель может выполнять команды только из некотоpого стpого заданного списка - системы команд исполнителя. Для каждой команды должны быть заданы условия пpименимости - в каких состояниях сpеды может быть выполнена команда, и описаны pезультаты выполнения команды. Напpимеp, команда "ввеpх" может быть выполнена, если выше исполнителя нет стены. Ее pезультат - смещение исполнителя на одну клетку ввеpх. После вызова команды исполнитель совеpшает соответствующее элементаpное действие. Отказы - ситуации сбоя работы исполнителя, которые возникают, если команда вызывается пpи недопустимом для нее состоянии сpеды. Обычно исполнитель ничего не знает о цели алгоpитма. Он выполняет все полученные команды, не задавая вопросов "почему" и "зачем".
Понятие алгоритма Свойства алгоритмов 1. Реализуемость для исполнителя — исполнитель алгоритма должен "понимать", как его выполнять. Иными словами, имея алгоритм и произвольный вариант исходных данных, исполнитель должен знать, как надо действовать для выполнения этого алгоритма. 2. Дискретность (прерывность, раздельность) — алгоритм должен представлять процесс решения задачи как последовательное выполнение простых (или ранее определенных) шагов. 3. Определенность (детерминированность) — каждое правило алгоритма должно быть четким, однозначным и не оставлять места для произвола. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче. 4. Результативность (конечность) состоит в том, что за конечное число шагов алгоритм либо должен приводить к решению задачи, либо после конечного числа шагов останавливаться изза невозможности получить решение с выдачей соответствующего сообщения. 5. Массовость означает, что алгоритм должен быть применим для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из некоторой области, которая называется областью применимости алгоритма.
Понятие алгоритма Формы записи алгоритмов На практике наиболее распространены следующие формы представления алгоритмов: 1. словесная или вербальная(запись на естественном языке); 2. псевдокоды (полуформализованные описания алгоритмов на условном алгоритмическом языке, включающие в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и др. ); 3. схематическая: a. структурограммы (схемы Насси-Шнайдермана) b. графическая (блок-схемы , выполняются в соответствии с требованиями стандарта); 4. программная (тексты на языках программирования).
Словесная форма записи алгоритмов Словесный способ записи алгоритмов представляет собой описание последовательных этапов Словесный способ записи алгоритмов представляет собой описание обработки данных. последовательных этапов обработки данных. Алгоритм задается в произвольном изложении на естественном языке. Например. Записать алгоритм нахождения наибольшего общего делителя (НОД) двух натуральных чисел (алгоритм Эвклида). Алгоритм может быть следующим: 1. задать два числа; 2. если числа равны, то взять любое из них в качестве ответа и остановиться, в противном случае продолжить выполнение алгоритма; 3. определить большее из чисел; 4. заменить большее из чисел разностью большего и меньшего из чисел; 5. повторить алгоритм с шага 2. Описанный алгоритм применим к любым натуральным числам и должен приводить к решению поставленной задачи. Словесный способ не имеет широкого распространения, так как словесные описания: 1. строго не формализуемы; 2. страдают громоздкостью, то есть многословностью записей; 3. допускают неоднозначность толкования отдельных предписаний.
Псевдокод - компактный (зачастую неформальный) язык описания алгоритмов, использующий ключевые слова императивных языков программирования, но опускающий несущественные подробности и специфический синтаксис. Псевдокод обычно опускает детали, несущественные для понимания алгоритма человеком. Такими несущественными деталями могут быть описания переменных, системно-зависимый код и подпрограммы. Главная цель использования псевдокода - обеспечить понимание алгоритма человеком, сделать описание более воспринимаемым, чем исходный код на языке программирования.
Псевдокод. Примеры Школьный алгоритмический язык алг (алгоритм) сим (символьный) дано для да арг (аргумент) лит (литерный) надо от нет рез (результат) лог (логический) если до при нач (начало) таб(таблица) то знач выбор кон (конец) нц (начало цикла) иначе и ввод цел (целый) кц (конец цикла) все или вывод вещ (вещественный) длин (длина) пока не утв
Псевдокод. Примеры. алг Сумма квадратов (арг цел n, рез цел S) дано | n > 0 надо | S = 1*1 + 2*2 + 3*3 +. . . + n*n нач цел i ввод n; S: =0 нц для i от 1 до n S: =S+i*i кц вывод "S = ", S кон
Графическая форма записи алгоритмов При графическом представлении алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Такое графическое представление называется схемой алгоритма или блок-схемой. В блок-схеме каждому типу действий (вводу исходных данных, вычислению значений выражений, проверке условий, управлению повторением действий, окончанию обработки и т. п. ) соответствует геометрическая фигура, представленная в виде блочного символа. Блочные символы соединяются линиями переходов, определяющими очередность выполнения действий.
Схе ма — графическое представление определения, анализа или метода решения задачи, в котором используются символы для отображения операций, данных, потока, оборудования и т. д. (ГОСТ 19. 701 -90). Блок-схема — распространенный тип схем (графических моделей), описывающих алгоритмы или процессы, в которых отдельные шаги изображаются в виде блоков различной формы, соединенных между собой линиями. Правила выполнения схем определяются следующими документами: ГОСТ 19. 701 -90. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. Для программной документации (устарели, заменяются ГОСТ 19. 701 -90): ГОСТ 19. 002 -80. Схемы алгоритмов и программ. Правила выполнения. ГОСТ 19. 003 -80. Схемы алгоритмов и программ. Обозначения условные графические.
Основные элементы схем алгоритма
Схема алгоритма определения суммы 10 чисел, не превышающих 50.
Редактор блок-схем алгоритмов. В репозитории Mandriva Linux
Языки программирования это формальная знаковая система, предназначенная для описания алгоритмов в форме, которая удобна для исполнителя. Языки программирования – это искусственные языки записи алгоритмов для исполнения их на ЭВМ. Программирование (кодирование) - составление программы по заданному алгоритму.
Классификация языков программирования 1. Машинные языки Машинный код (собственный код, или платформенно-ориентированный код, или нативный код -native code) - система команд конкретной вычислительной машины, которая интерпретируется непосредственно микропроцессором или микропрограммами данной вычислительной машины. Каждая модель процессора имеет свой собственный набор команд (хотя во многих моделях эти наборы команд сильно перекрываются). Слова машинного кода называются машинными инструкциями. Каждая из них описывает элементарное действие, выполняемое процессором, такое как «переслать байт из памяти в регистр» . Программа - это просто длинный список инструкций, выполняемых процессором. Прямой поток выполнения команд может быть изменён инструкцией перехода, которая переносит выполнение на инструкцию с заданным адресом. Инструкция перехода может быть условной, выполняющей переход только при соблюдении некоторого условия.
Пример машинного кода (шестнадцатеричный вид)
Классификация языков программирования 2. Машинно-зависимые языки а) Языки ассемблера (мнемокоды) - язык программирования низкого уровня, мнемонические команды которого (за редким исключением) соответствуют инструкциям процессора вычислительной системы. Трансляция программы в исполняемый машинный код производится ассемблером (от англ. assembler - сборщик) - программой-транслятором, которая и дала языку ассемблера его название. Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи - мнемокоды - команд и их аргументов. Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на вычисляемые ассемблером или компоновщиком абсолютные или относительные адреса, а также так называемые директивы (команды ассемблера, не переводимые в машинные команды процессора, а выполняемые самим ассемблером).
Классификация языков программирования 2. Машинно-зависимые языки б) Язык Макроассемблера – является расширением языка Ассемблера за счет включения макросредств, т. е. представляет средство определения и использования новых, более мощных команд, как последовательностей базовых инструкций, что несколько повышает его уровень.
Классификация языков программирования 2. Машинно-зависимые языки Характерные черты машинно–зависимых языков: - высокое качество создаваемых программ (компактность и скорость выполнения); - возможность использования конкретных аппаратных ресурсов; - предсказуемость объектного кода и заказов памяти; - для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ; - трудоемкость процесса составления программ, плохо защищенного от появления ошибок; - низкая скорость программирования; - невозможность непосредственного использования программ, составленных на этих языках, на ЭВМ других типов.
Классификация языков программирования 3. Машинно-независимые языки ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам, – языком низкого уровня.
Сегодня абсолютное большинство программ создается именно на основе языков высокого уровня. Эти языки имеют следующие достоинства. 1. Машинная независимость. Программа с одинаковым исходным текстом может быть подготовлена для выполнения на процессорах с разной системой команд. Транслятор языка программирования высокого уровня — это машинно-зависимая система, предназначенная для подготовки программы к выполнению в рамках конкретной платформы. 2. Использование естественных обозначений (например, привычных математических знаков). 3. Эффективное представление этапов обработки данных средствами языка. Набор допустимых операций определен соображениями удобства, а не системой команд конкретного процессора. 4. Расширенный набор поддерживаемых типов данных. 5. Готовые библиотеки стандартных подпрограмм для выполнения часто встречающихся действий.
Программу, написанную на языке программирования высокого уровня, ЭВМ не понимает, поскольку ей доступен только машинный язык. Поэтому для перевода программы с языка программирования на язык машинных кодов используют специальные программы – трансляторы. Существует три вида транслятора: интерпретатор (interpreter)- это транслятор, который производит пооператорную обработку и выполнение исходного кода программы; компилятор (compiler )-преобразует всю программу в модуль на машинном языке, после чего программа записывается в память компьютера и лишь потом исполняется; ассемблеры - переводят программу, записанную на языке ассемблера, в программу на машинном языке
Интерпретатор
Интерпретатор берёт очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет (обычно после анализа оператор транслируется в некоторое промежуточное представление или даже машинный код для более эффективного дальнейшего исполнения). Только после того как текущий оператор успешно выполнен, интерпретатор перейдёт к следующему. При этом если один и тот же оператор будет выполняться в программе многократно, интерпретатор будет выполнять его так как, как будто встретил впервые. Вследствие этого, программы, в которых требуется осуществить большой объём вычислений, будут выполняться медленно. Кроме того, для выполнения программы на другом компьютере там тоже должен стоять интерпретатор - ведь без него текст является просто набором символов.
Компилятор переводит программы с одного языка на другой. Входом компилятора служит цепочка символов, составляющая исходную программу на языке программирования L 1. Выход компилятора (объектная программа) также представляет собой цепочку символов, но принадлежащую другому языку L 2, например, языку некоторого компьютера.
Компиляторы полностью обрабатывают весь текст программы (он иногда называется исходный код). Они просматривают его в поиске синтаксических ошибок (иногда несколько раз), производят определенный смысловой анализ, а затем автоматически переводят (транслируют) на машинный язык - генерируют машинный код. Нередко при этом выполняется оптимизация с помощью набора методов позволяющих повысить быстродействие программы (например, с помощью инструкций, ориентированных на конкретный процессор, путём исключения ненужных команд, промежуточных вычислений и т. д. ). В результате законченная программа получается законченной и эффективной, работает в сотни раз быстрее программы, выполняемой с помощью интерпретатора, может быть перенесена на другие компьютеры с процессором, поддерживающим соответствующий машинный код.
Объектная программа может быть: 1. последовательностью абсолютных машинных команд 2. последовательностью перемещаемых машинных команд 3. программой на языке ассемблера 4. программой на некотором другом языке
Интерпретаторы Плюсы Минусы упрощается отладка (можно, например, прервать медленная работа программ обработку интерпретаторной программы, отобразить содержимое определенных переменных, бегло просмотреть программу, а затем продолжить исполнение) возможность получения быстрого ответа (нет необходимости в компилировании, так как интерпретатор всегда готов для вмешательства в вашу программу) копию интерпретатора необходимо всегда держать в памяти
Рассмотрим программу: на интерпретаторном Бэйсике 10 FOR N=1 TO 1000 20 PRINT N, SQR(N) 30 NEXT N при первом переходе по этой программе Бейсик-Интерпретатор должен разгадать что означает строка 20: 1. преобразовать числовую переменную N в строку 2. послать строку на экран 3. переместить в следующую зону печати 4. вычислить квадратный корень из N 5. преобразовать результат в строку 6. послать строку на экран При втором проходе цикла все это разгадывание повторяется снова, так как абсолютно забыты все результаты изучения этой строки какую-то миллисекунду тому назад. И так во всех следующих 998 проходах. Совершенно очевидно, что если вам удалось каким-то образом отделить фазу сканирования/понимания от фазы исполнения вы имели бы более быструю программу. И это как раз то, для чего существуют компиляторы
В некоторых языках, вместо машинного кода генерируется интерпретируемый двоичный код " виртуальной машины ", также называемый байт-кодом ( byte-code ). Такой подход применяется в Forth, Lisp, Java , Perl, Python, а также в языках платформы Microsoft. NET. Например: Программы на Java выполняются в два этапа. Сначала исходный текст компилятором переводится на промежуточный аппаратно-независимый язык. В таком виде полуфабрикат программы (байт-код) хранится на интернет-сервере, откуда по запросу клиента пересылается ему по сети. У клиента байт-код исполняется специальным интерпретатором, этот интерпретатор называется виртуальной Java-машиной, он встроен во все современные браузеры.
Что лучше интерпретация или компиляция, четкого ответа нет. На многих машинах начального уровня стояли бейсик интерпретаторы, затем С и Pascal которые были компилируемыми, современные, особенно специализированные языки Python, Perl, SQL – интерпретируемые. Специализированные языки чаще интерпретируемые (например СУБД-100%) Курс по компиляторам на Intuit http: //www. intuit. ru/department/sa/compilersdev/
Языки программирования также можно разделять на поколения: – языки первого поколения: машинно–ориентированные с ручным управлением памяти на компьютерах первого поколения. – языки второго поколения: с мнемоническим представлением команд, так называемые автокоды. – языки третьего поколения: общего назначения, используемые для создания прикладных программ любого типа. Например, Бейсик, Кобол, Си и Паскаль. – языки четвертого поколения: усовершенствованные, разработанные для создания специальных прикладных программ, для управления базами данных. – языки программирования пятого поколения: языки декларативные, объектно–ориентированные и визуальные. Например, Пролог, ЛИСП (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi.
Синтаксис и семантика языков Каждый язык программирование обладает своими лексическими, синтаксическими и семантическими правилами, которые необходимо соблюдать при составлении компьютерной программы. Синтаксис - описывает структуру программ как наборов символов (обычно говорят - безотносительно к содержанию). Синтаксические ошибки распознаются встроенным синтаксическим анализатором. Синтаксису языка противопоставляется его семантика. Синтаксис языка описывает «чистый» язык, в то же время семантика приписывает значения (действия) различным синтаксическим конструкциям. Семантика - определяет смысловое значение предложений алгоритмического языка.
Императивное программирование - это парадигма программирования, которая описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивная программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер. Императивное программирование ориентировано на классическую фон Неймановскую модель, остававшуюся долгое время единственной аппаратной архитектурой. Методология императивного программирования характеризуется принципом последовательного изменения состояния вычислителя пошаговым образом. При этом управление изменениями полностью определено и полностью контролируемо. Поскольку эта парадигма естественна для человеческого понимания и непосредственно реализована на аппаратном уровне, большинство языков программирования придерживаются именно ее.
Архитектура фон Неймана Вычислительным системам, основанным на архитектуре, предложенной Джоном фон Нейманом (John von Neumann) в 40 -х годах ХХ века присущи следующие характеристики: · Принцип программного управления. Из него следует, что программа состоит из набора команд, которые выполняются процессором автоматически друг за другом в определенной последовательности. Последовательность выполнения команд определяется алгоритмом работы и связанной с ним программой на языке программирования. · Принцип однородности памяти. Программы и данные хранятся в одной и той же памяти. Поэтому компьютер не различает, что хранится в данной ячейке памяти - число, текст или команда. · Принцип адресности. Структурно основная память состоит из перенумерованных ячеек; процессору в произвольный момент времени доступна любая ячейка. Отсюда следует возможность давать имена областям памяти, так, чтобы к запомненным в них значениям можно было впоследствии обращаться или менять их в процессе выполнения программ с использованием присвоенных имен.
Декларативное программирование описывает не способ решения проблемы, а описание результата, который необходимо получить Есть еще одно определение декларативного программирования: декларативная программа - такая, которая написана на чистом функциональном языке программирования, логическом языке программирования, либо на constraint ("ограничительном") языке. Иногда словосочетание "декларативный язык" используется для всех таких языков как единой группы, чтобы противопоставить их императивному программированию. Например HTML описывает то, что содержит страница (текст, картинки), а не то, как браузер должен отобразить данную страницу. Этот подход противоположен императивному программированию, где программист должен написать алгоритм, который должен быть исполнен. Кратко: ИП явно указывает алгоритм, который должен быть исполнен, а ДП явно указывает цель и оставляет реализацию нижележащему ПО. Например в SQL запрос SELECT указывает, какие данные должны быть извлечены, но не описывает процесс их извлечения.
Примеры Декларативное программирование Select * from Sotrudnik. dbf Where FIO=‘Иванов И. И. ’ Императивное программирование First; While not EOF do If FIO = ‘Иванович’ then SAY … SKIP FIO Data. R Dolchn Андреев А. А. 01. 1970 директор Иванов И. И. 01. 1972 бухгалтер Петров П. П. 05. 10. 1975 сторож
Программа процедурного языка программирования состоит из последовательности операторов и предложений, управляющих последовательностью их выполнения. Типичными операторами являются операторы присваивания и передачи управления, операторы ввода/вывода и специальные предложения для организации циклов. Из них можно составлять фрагменты программ и подпрограммы. В основе такого программирования лежат взятие значение какой-то переменной, совершение над ним действия и сохранение нового значения с помощью оператора присваивания, и так до тех пор пока не будет получено (и, возможно, напечатано) желаемое окончательное значение. Объектно-ориентированный язык программирования (ОО-язык) - язык, построенный на принципах объектно-ориентированного программирования. В основе концепции объектно-ориентированного программирования лежит понятие объекта - некоей субстанции, которая объединяет в себе поля (данные) и методы (выполняемые объектом действия). Например, объект человек может иметь поля имя, фамилия и методы есть и спать. Соответственно, в программе можем использовать операторы Человек. Имя: ="Иван" и Человек. Есть(пища).
Программа функционального ЯП состоит из совокупности определений функций. Функции, в свою очередь, представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. Вычисления начинаются с вызова некоторой функции, которая в свою очередь вызывает функции, входящие в ее определение и т. д. в соответствии с иерархией определений и структурой условных предложений. Функции часто либо прямо, либо опосредованно вызывают сами себя. Примеры Императивный язык Си int i, total; for (total=0, i=1; i<=10; ++i) total += i; Императивный язык Pascal Total: =0; For i: =1 to 10 do total: =total+I; Функциональный язык SML let fun sum a b = if a=b then a else a + sum(a+1) b in sum 1 10 end
Логическое программирование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций.
Парадигма программирования - это система идей и понятий, определяющих стиль написания компьютерных программ, а также образ мышления программиста. Важно отметить, что парадигма программирования не определяется однозначно языком программирования; практически все современные языки программирования в той или иной мере допускают использование различных парадигм. Так на языке Си, который не является объектноориентированным, можно работать в соответствии с принципами объектноориентированного программирования, хотя это и сопряжено с определёнными сложностями; функциональное программирование можно применять при работе на любом императивном языке, в котором имеются функции (для этого достаточно не применять присваивание), и т. д.
TIOBE Programming Community Index for January 2012 Компания TIOBE составляет рейтинг популярности языков программирования, основываясь на данных о количестве программистов пишущих на рассматриваемом языке, интересе к языку на популярных сайтах Google, MSN, Yahoo, Wikipedia и You. Tube и других показателях. Стоит отметить что это не рейтинг лучших языков программирования, это просто сводная таблица наиболее популярных и используемых языков. Этот рейтинг может быть использован для проверки того, какие из Ваших навыков программирования сейчас востребованы. Это позволит повлиять на стратегическое решение о том, какой язык использовать в будущих проектах. http: //www. tiobe. com/index. php/content/paperinfo/tpci/index. html
Основные алгоритмические структуры Основные виды алгоритмов (алгоритмических структур): 1. Линейный алгоритм (еще называют следование); 2. Циклический алгоритм; 3. Разветвляющийся алгоритм; 4. Вспомогательный алгоритм.
Линейный алгоритм – описание действий, которые выполняются однократно в заданном порядке. Исполнитель выполняет действия последовательно, одно за другим в том порядке в котором они следуют.
Пример из лаб. работы № 1 begin x: =Str. To. Float(Edit 1. Text); y: =Str. To. Float(Edit 2. Text); z: =Str. To. Float(Edit 3. Text); a: =Sqr(Sin(x+y)/Cos(x+y)); b: =Exp(y-z); c: =Sqrt(Cos(Sqr(x))+Sin(Sqr(z))); u: =a-b*c; end;
Разветвляющий алгоритм – это алгоритм, в котором в зависимости от условия выполняется либо одна, либо другая последовательность действий.
Пример из лаб. работы № 2 Вычислить m Значения переменных a, b и с поменять местами так, чтобы оказалось a<=b<=c.
Циклический алгоритм - обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла. Цикл типа пока. Предписывает выполнять тело цикла до тех пор, пока выполняется условие, записанное после слова пока. (цикл с предусловием) While <условие> do begin <операторы> end;
Циклический алгоритм - обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла. (цикл с постусловием) repeat <операторы> until <условие>;
Цикл типа для. Предписывает выполнять тело цикла для всех значений некоторой переменной (параметра цикла) в заданном диапазоне. for i: =i 1 to i 2 do begin <операторы> end; for i: =i 1 downto i 2 do begin <операторы> end;
Примеры циклов i: =0; repeat i: =i+1; Until i>0; i: =1; repeat i: =i*2; Until i<0; i: =1; repeat i: =i*2; Until false;
Примеры циклов a: =10; i: =3; While i>0 do begin a: =10; i: =3; While i<0 do begin end; a: =a+10; i: =i-1;
Примеры циклов j: =1; for i: =1 to 10 do begin j: =j+1; end; j: =1; for i: =1 to 10 do begin i: =i+1; j: =j+1; end;
Примеры циклов j: =1; for i: =11 downto 10 do begin j: =1; for i: =10 downto 1 do begin j: =j+1; end; j: =1; for i: =1 downto 10 do begin j: =j+1; end;
Особенности разных языков программирования. Чувствительность к регистру. Если язык чувствителен к регистру, то слова языка (это касается как команд языка, так и имен переменных, классов и функций, задаваемых программистом) Return, return или r. Et. Ur. N имеют каждый свое значение, а если язык нечувствителен к регистру, то все эти слова имеют одно значение и можно использовать любое написание. При этом особой разницы чувствителен или нечувствителен к регистру для программирования нет, но обычно перейти с нечувствительного к чувствительному к регистру языку сложнее, чем наоборот (и преобразовать программу тоже). Языки чувствительные к С++, С#, Java. Script, Perl, регистру PHP Языки не чувствительные Delphi, VFP, Basic, VBA, VBScript к регистру
Величины: константы, переменные, типы величин. Всякий алгоритм составляется для конкретного исполнителя. Сейчас в качестве исполнителя мы будем рассматривать компьютер, оснащенный системой программирования на определенном языке. Компьютер-исполнитель работает с определенными данными по определенной программе. Программа – это алгоритм записанный на каком-либо языке программирования. Данные – это множество величин. Компьютер работает с информацией, хранящейся в его памяти. Отдельный информационный объект (число, символ, строка, таблица и пр. ) называется величиной. Величины в программировании (как и в математике) делятся на переменные и константы. Значение константы остается неизменной в течении всей программы, значение переменной величины может изменяться.
Величины: константы, переменные, типы величин. У каждой переменной есть имя, тип и текущее значение. Имена переменных называют идентификаторами (от глагола «идентифицировать» , что значит «обозначать» , «символизировать» ). Существуют три основных типа величин, с которыми работает компьютер: числовой, символьный и логический. Тип данных характеризует внутреннее представление, множество допустимых значений для этих данных, а также совокупность операций над ними. В зависимости от типа переменной в памяти компьютера будет выделена определенная область.
Величины: константы, переменные, типы величин. Тип данных характеризует внутреннее представление, множество допустимых значений для этих данных, а также совокупность операций над ними. В зависимости от типа переменной в памяти компьютера будет выделена определенная область. Наглядно переменную можно представить как коробочку, в которую можно положить на хранение что-либо. Имя переменной – это надпись на коробочке, значение – это то, что хранится в ней в данный момент, а тип переменной говорит о том, что допустимо класть в эту коробочку.
Особенности разных языков программирования. Идентификаторы. Идентификаторами называют любые имена, заданные программистом или разработчиками языка. Такие имена даются типам, функциям, переменным, классам, таблицам, полям и т. д. Основное назначение идентификаторов - упростить обращение и использование подобных объектов Использование имени 4 ar'l$ приведет к ошибке в любом языке программирования. Вы всегда можете использовать без колебания заглавные и строчные буквы латинского алфавита(a. . z, A. . Z), арабские цифры (0 -9) и знак подчеркивания (_), однако первой буквой не может быть цифра или знак подчеркивания. Так же в каждом языке, есть список ключевых (зарезервированных) слов, с которыми не должны совпадать создаваемые программистом имена, так как эти слова используются в самом языке.
Особенности разных языков программирования. Идентификаторы. Кроме понятных ограничений на символы имен и не использование имен не совпадающих с ключевыми словами, рекомендуется придерживаться следующих правил: 1) Использовать общую систему наименований, основная популярная система наименования, так называемая венгерская, заключается в том, что имя, состоит из двух частей: первая часть - префикс (сокращения, показывающие тип данных, видимость переменной), вторая часть именно имя, характеризующее смысл объекта 2) Стараться не использовать в именах часто используемых английских слов, даже если их нет в списке ключевых слов, так как, например, при SQL-запросе к клиент-серверу может оказаться, что имя есть в списке ключевых слов сервера. 3) Старайтесь, не использовать только одно написание имен (в языках не чувствительных к регистру)
В целом, иерархия типов в языке Pascal следующая:
Объявления служат для компилятора источником информации о свойствах величин, используемых в программе, и установления связи между этими величинами и их идентификаторами, фиксируя тем самым конкретный смысл, предписанный различным идентификаторам в программе. Согласно объявленным переменным и их количеству компилятор резервирует необходимый объем памяти для хранения значений величин, над которыми выполняются требуемые операции. Описание переменной: var идентификатор переменной: тип; Пример описания: Var D, C, n Log. Per A, B k : Integer; : Boolean; : Real; : Char;
Тип переменной определяет диапазон допустимых значений, принимаемых величинами этого типа; набор операций, допустимых над данной величиной; объем памяти, отводимой под эту переменную; способ представления величин в памяти компьютера.
Каждый тип имеет свой идентификатор (Turbo Pascal) Идентификатор integer byte word shortint longint Диапазон (множество) Операции значений Целые типы 2 – 32768. . 32767 1 0. . 255 2 0. . 65535 +, –, /, *, Div, Mod, >=, 1 – 128. . 127 <=, =, <>, <, > – 4 2147483648. . 21474836 47 Вещественные типы Количество байт real 6 2, 9× 10– 39 — 1, 7× 1038 single 4 1, 5× 10– 45 — 3, 4× 1038 double 8 5× 10– 324 — 1, 7× 10308 extended 10 Boolean 1 char +, –, /, *, >=, <=, =, <>, <, > 3, 4× 10– 4932 — 1, 1× 104932 Логический тип true, false Символьный тип все символы кода 1 ASCII Not, And, Or, Xor, >=, <=, =, <>, <, > +, >=, <=, =, <>, <, >
Особенности разных языков программирования. Комментарии это часть текста программы, которая не обрабатывается при компиляции исходного кода. Как правило, комментарии отделяются определенными символами (эти символы называют символами комментария) от кода программы. Основное назначение комментариев это пояснение текста программы на естественном языке в произвольной форме, а также они используются для исключения части исходного кода из обработки (например, при исправлении программы, можно сохранить код до исправления, закомментировав его). Комментарии можно разделить на два вида: Многострочные комментарии; Однострочные комментарии. Однострочные это комментарии, которые действуют только в одной строке (от символа комментария до конца строки). Многострочные комментарии могут располагаться на нескольких строках, на одной строке или на части строки (т. е. возможно написать многострочный комментарий между двумя операторами, расположенными в одной строке). Многострочный комментарий ограничен двумя разными символами комментариев (один символ - начало комментария, второй - его окончание). Во многих языках многострочных комментарий не существует.
Особенности разных языков программирования. Комментарии. С++, C#, Jav a, Perl Однострочные комментарии // Многострочные /* комм */ комментарии Basic ‘ или && или Rem * Delphi // { комм } или (*комм *) PHP // или # PLSQL -- /* комм */
Особенности разных языков программирования. IF. Условный оператор это классика программирования, он есть в каждом языке. (собственно этот оператор есть даже в машинных кодах). Он позволяет выполнять определенный код, в зависимости от некоторого условия. Есть два вида условных операторов: Операторы вида if. . . elseif. . . else
Особенности разных языков программирования. IF. Язык С++, C#, Java, Transact-SQL Delphi Естественный язык Описание if (выражение 1) оператор1; if выражение 1 Then [elseоператор2; ] оператор1; [else оператор2; ] ЕСЛИ а больше 3, ТО вывести OK!, ИНАЧЕ вывести ERROR!, Пример int i = 2; if(i < 1){ cout << 'i меньше 1!'; } else { cout << 'i больше или равно 1!'; } i : = 1; if i < 1 Then begin Write(i); end else Write( - i); 1). Если на улице дождь возьми зонт, иначе не бери. 2) На улице дождь! Результат i больше или равно 1! - 1 Нужно взять зонт! Суть его, если условие в выражение 1 истинно, то выполняется оператор1, если условие ложно, то выполняется оператор2. Блок else в любом языке можно пропустить, тогда если условие выражения 1 ложно просто ничего не будет выполнятся, сразу управление передается дальше.
Особенности разных языков программирования. CASE. В большинстве языков программирования используется стандартный CASE вида (Правда называется он по - разному С++, C#, Java, PHP называется оператор switch, в Basic’е оператор Select, в Delphi, PLSQL - Case): Язык С++, C#, Java, PHP Delphi switch (выражение 1){ case значение 1: [операторы1] [break]. . . case значение. N: [операторы. N] [break] [default: операторы. M] } Case выражение 1 of значение 1: оператор1; . . . значение. N: оператор. N; else оператор. M; end;
case in of 0: u: =x+y; 1: u: =x-y; 2: u: =x*y; else u=0; end; В соответствии со значением in вычисляется u. Если in=0, то u=x+y, если in=1, то u=x-y, если in=2, то u=x*y и, наконец, u=0 при любых значениях in отличных от 0, 1 или 2.
Простые типы Целочисленные типы Логический тип Символьный тип Вещественный тип Перечисляемый тип Интервальный тип
Каждый тип имеет свой идентификатор (Turbo Pascal) Идентификатор integer byte word shortint longint Диапазон (множество) Операции значений Целые типы 2 – 32768. . 32767 1 0. . 255 2 0. . 65535 +, –, /, *, Div, Mod, >=, 1 – 128. . 127 <=, =, <>, <, > – 4 2147483648. . 21474836 47 Вещественные типы Количество байт real 6 2, 9× 10– 39 — 1, 7× 1038 single 4 1, 5× 10– 45 — 3, 4× 1038 double 8 5× 10– 324 — 1, 7× 10308 extended 10 Boolean 1 char +, –, /, *, >=, <=, =, <>, <, > 3, 4× 10– 4932 — 1, 1× 104932 Логический тип true, false Символьный тип все символы кода 1 ASCII Not, And, Or, Xor, >=, <=, =, <>, <, > +, >=, <=, =, <>, <, >
Перечисляемый тип - тип данных, заданный списком принадлежащих ему значений. type var <имя_типа> = (значение 1, значение 2, . . . , значение. N); <идентификатор, . . . > : <имя типа>; Program Week; Type Week = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); Var Day: Week; Begin Day: =Thursday; If (Day = Sunday) Or (Day = Saturday) then Writeln('Выходной') Else Writeln('Рабочий день'); End.
Интервальный тип (диапазон) Интервальный тип позволяет задавать две константы, определяющие границы диапазона значений для данной переменной. Компилятор при каждой операции с переменной интервального типа проверяет, остается ли значение переменной внутри установленного для нее диапазона. type <имя типа> = (<константа 1>. . <константа 2>); var <идентификатор, . . . >: <имя типа>; type Days = 1. . 31; var Rab. Day, Boln. Day: Days Такая декларация типа указывает компилятору, что для переменных этого типа допустимы только числа из указанного диапазона. Тем самым в программе могут быть автоматически организованы проверки корректности операций присвоения для этих переменных. При выполнении программы попытка присвоить такой переменной значение, не входящее в интервал допустимых значений, квалифицируется как ошибка и приводит к прекращению работы программы и выдаче соответствующего сообщения.
В данном примере переменные Rab. Day Boln. Day имеют тип Days и могут принимать любые значения из диапазона 1. . 31. Выход из диапазона вызывает программное прерывание. Интервальный и перечисляемый типы относятся к порядковым типам. Значит, для интервального типа определены операции отношения, и функции для определения порядкового номера, предыдущего и последующего элементов, т. е финкции Succ(), Pred() и Ord(). На этом уроке мы описали простые (скалярные), пользовательские типы данных: перечисляемый и интервальный.
Структуры данных Структура данных - программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.
Массивы Массив – это структурированный тип данных, состоящий из фиксированного числа элементов, объединённых одним именем, имеющих один и тот же тип, где каждый элемент имеет свой номер (индекс). Название регулярный тип (или ряд) массивы получили за то, что они объединяют однотипные (логически однородные) элементы, упорядоченные по индексам, определяющим положение каждого элемента в массиве. В качестве элементов массива можно использовать любой другой ранее описанный тип, поэтому вполне правомерно существование массивов записей, массивов указателей, массивов строк, массивов и т. д. Элементами массива могут быть данные любого типа, включая структурированные. Тип элементов массива называется базовым. Особенностью языка Pascal является то, что число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Элемент массива— отдельная переменная, входящая в массив. Размерность массива— количество индексов, по которым определяется положение элемента в массиве. Индексы элемента массива- совокупность номеров, определяющих его местоположение в массиве.
Объявление массива Массив, как и любая переменная программы, перед использованием должен быть объявлен в разделе объявления переменных. В общем виде инструкция объявления одномерного массива выглядит следующим образом: type var <имя типа> = аrrау[тип индекса] of <тип компонента>; <идентификатор > : <имя типа>; Массив может быть описан и без представления типа в разделе описания типов данных: var <идентификатор > : аrrау[тип индекса] of <тип компонента>
type var Klass = (К 1, К 2, КЗ, К 4); Znak = array[1. . 255] of char; M 1 : Znak; {Тип Znak предварительно описан в разделе типов} М 2 : array[1. . 60] of integer; {Прямое описание массива М 2} МЗ : аггау[1. . 4] of Klass; Если в качестве базового тина взят другой массив, то образуется структура, которую принято называть многомерным массивом. type var Vector = array[1. . 4] of integer; Massiv = array[1. . 4] of Vector; Matr : Massiv; Ту же структуру можно получить, используя другую форму записи: var Matr : array[1. . 4, 1. . 4] of integer;
Если при такой форме описания массива задан один индекс, массив называется одномерным, если два индекса – двумерным, если n индексов – n-мерным. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный – понятию прямоугольной таблицы (матрицы, набора векторов). Размерность ограничена только объемом памяти конкретного компьютера. Одномерные массивы обычно используются для представления векторов, а двумерные – для представления матриц. Пример: var Vector. Z : аrrау [1. . 40] of real; {Одномерный массив из 40 элементов} Matr. U : аrrау [1. . 8, 1. . 8] of byte: {Двумерный массив 8 x 8 элементов} Triif : array [1. . 4, 1. . 5, 1. . 8] of integer; {Трехмерный массив}
Для описания массива можно использовать предварительно определенные константы: const G 1 = 4; G 2 = 6; var Mas. Y : array [1. . G 1, 1…G 2] of real; Элементы массива располагаются в памяти последовательно. Элементы с меньшими значениями индекса хранятся в младших адресах памяти. Многомерные массивы располагаются таким образом, что самый правый индекс возрастает первым. Например, если имеется массив A : array[1. . 5, 1. . 5] of integer; то в памяти элементы массива будут размещены по возрастанию адресов: А[1, 1] А[1, 2] А[1, 3] А[1, 4] А[1, 5] А[2, 1] А[2, 2] … А[5, 5]
Все переменные и массивы, которые мы использовали до сих пор. были статическими. Они называются статическими потому, что их размер известен во время компиляции, память для них резервируются в стеке, и они создаются и уничтожаются автоматически. Динамические массивы существенно отличаются от статических: Память для динамических массивов выделяется вручную во время выполнения. Первый индекс динамического массива всегда равен 0. Память для динамических массивов всегда резервируется в куче. Куча — это область основной памяти, которая ограничена только размером доступной на компьютере виртуальной памяти. Если требуется хранить в массиве очень большой объем данных, следует использовать динамический массив, поскольку размеры статических массивов ограничены размером стека.
Для объявления динамических массивов используется следующий синтаксис: Имя. Массива: array of Тип. Данных; Во время объявления динамического массива он не содержит никаких данных, и никакая память для него не резервируется. Чтобы зарезервировать память для динамического массива, необходимо вызвать функцию Set. Length. Она принимает два параметра. При работе с динамическими массивами первым параметром должно служить имя массива, а вторым — новый размер массива. Set. Length (Имя. Массива, Новый. Размер. Массива);
program Project 1; uses Sys. Utils; var students: array of string; st. Number: Integer; cnt: Integer; begin Write('Number of students: '); Read. Ln(st. Number); Set. Length(students, st. Number); for cnt : = Low(students) to High(students) do begin Write('Student: '); Read. Ln(students[cnt]); if students[cnt] = 'end' then Break; end; end.
Для определения размера динамического массива можно использовать функцию Length, которая принимает только один параметр — имя динамического массива. Она возвращает общее количество элементов динамического массива. Индекс последнего элемента, возвращаемый функцией High, равен Length-1. var Dyn. Array: array of string; i: Integer; begin for i : = Low(Dyn. Array) to High(Dyn. Array) do ; for i : = 0 to Length(Dyn. Array) - 1 do ; end. Delphi позволяет также создавать динамические многомерные массивы. Синтаксис объявления динамического многомерного массива выглядит следующим образом: Имя. Массива: array of Тип. Данных; Delphi автоматически управляет динамическими массивами. Память, зарезервированная под динамический массив, автоматически освобождается по завершении использования массива. Память массива можно освобождать также вручную, передавая имя массива процедуре Finalize.
Строки Символ - это одна единица текста. Это буква, цифра, какой-либо знак. Кодовая таблица символов состоит из 256 позиций, т. е. каждый символ имеет свой уникальный код от 0 до 255. Символ с некоторым кодом N записывают так: #N. Строка, она же текст - это набор символов, любая их последовательность. Соответственно, один символ - это тоже строка, тоже текст. Текстовая строка имеет определённую длину. Длина строки - это количество символов, которые она содержит. Если один символ занимает 1 байт, то строка из N символов занимает соответственно N байт. Char - один символ (т. е. 1 байт); String - строка символов, текст (N байт). Официально строки вмещают лишь 255 символов, однако в Delphi в строку можно записать гораздо больше. Для хранения больших текстов и текстов со специальными символами существуют специальные типы данных Ansi. String и Wide. String (последний, кстати, двухбайтовый, т. е. для Юникода).
Строки Для задания текстовых значений в Pascal используются одинарные кавычки (не двойные!). Т. е. когда вы хотите присвоить строковой переменной какое-либо значение, следует сделать это так: S 1 : = 'text'; S 2 : = 'Вася'; Если вы хотите жёстко ограничить длину текста, хранимого в строковой переменной, можно сделать это следующим образом: var s: string[10]; В скобках указывается максимальная длина строки.
Операции со строками Сложение (конкатенация) var s 1, s 2: string; . . . s 1: ='123'+'456'; //s = "123456“ s 2: ='789'; s 1: =s 1+s 2; Длина строки Length() var Str: String; L: Integer; {. . . } Str: ='Hello!'; L: =Length(Str); //L = 6 Обращение к символам строки (строка - это массив символов) var s: string; c: char; . . . s: ='Hello!'; c: =s[2]; //c = "e"
Нахождение подстроки в строке Pos() Функция принимает два параметра: первый - подстроку, которую нужно найти, второй - строку, в которой нужно выполнить поиск. Если функция нашла вхождение подстроки в строку, возвращается номер позиции её первого вхождения. Если вхождение не найдено, функция даёт результат 0. var Str 1, Str 2: String; P: Integer; {. . . } Str 1: ='Hi! How do you do? '; Str 2: ='do'; P: =Pos(Str 2, Str 1); //P = 9
Удаление части строки Delete () Функция принимает три параметра: первый параметр - переменная строкового типа, из которой удаляется фрагмент (именно переменная! конкретное значение не задаётся, т. к. процедура не возвращает результат), второй параметр - номер символа, начиная с которого нужно удалить фрагмент, третий параметр - количество символов для удаления. Пример: Если функция нашла вхождение подстроки в строку, возвращается номер позиции её первого вхождения. Если вхождение не найдено, функция даёт результат 0. var Str 1: String; {. . . } Str 1: ='Hello, world!'; Delete(Str 1, 6, 7); // Str 1 = "Hello!"
Копирование (извлечение) части строки Copy() Функция Copy() позволяет скопировать из строки указанную часть. Функция принимает 3 параметра: текст (строку), откуда копировать, номер символа, начиная с которого скопировать и количество символов для копирования. Результатом работы функции и будет фрагмент строки. var s, word: string; s: ='Привет Вася'; word: =Copy(s, 1, Pos(' ', s)-1); Show. Message('Первое слово: '+word);
Множества Множество - это конечный или бесконечный набор определённых объектов, мыслимый как единое целое. Множество характеризуется своими элементами, а элементы имеют лишь одно свойство - принадлежность к данному множеству. Таким образом, мы можем только сказать, принадлежит элемент данному множеству или не принадлежит. Порядок расположения элементов в множестве никакой роли не играет. Понятие множества в языке программирования несколько отличается от математического определения этого понятия, но смысл сохраняется. Основное отличие в том, что в программировании множество может содержать только конечное число элементов, т. е. не может состоять из бесконечного числа объектов. В математике же последнее допустимо. Например, мы можем определить множество натуральных чисел, которое бесконечно: N = {1, 2, 3, . . . }
Множества Математика Множество - это конечный или бесконечный набор определённых объектов, мыслимый как единое целое. Множество характеризуется своими элементами, а элементы имеют лишь одно свойство - принадлежность к данному множеству. Таким образом, мы можем только сказать, принадлежит элемент данному множеству или не принадлежит. Порядок расположения элементов в множестве никакой роли не играет. Программирование То же самое, НО… в программировании множество может содержать только конечное число элементов Следует понимать, что множество не предназначено для хранения каких-либо значений (чисел, символов и т. д. ) - оно лишь может дать нам ответ на вопрос: присутствует конкретный элемент в множестве или его там нет.
Множества. Объявление. var A: set of Char; объявили множество A на основе символьного типа Char. Запомните: множество не может состоять более чем из 255 элементов! Например, следующее описание: var N: set of Integer; приведёт к ошибке "Set base type out of range".
Множества. Задание множеств. Чтобы задать множество, мы можем воспользоваться операцией присваивания, где слева стоит переменная-множество, а справа - нужный нам набор. Например, в описанное выше множество A мы хотим поместить элементы-символы A, B, C, D. Тогда это запишется так: A: =['A', 'B', 'C', 'D']; Теперь множество A содержит 4 элемента. Если вспомнить, что тип данных Char упорядочен, то данную запись можно сократить следующим образом: A: =['A'. . 'D']; Мы просто указали диапазон значений, который должен находиться во множестве. Допустимы, конечно же, комбинации диапазонов и отдельных значений: A: =['A', 'B', 'K'. . 'N', 'R', 'X'. . 'Z'];
Множества. Операции над множествами. 1. Находится ли элемент во множестве? Чтобы проверить, входит ли элемент во множество, следует использовать специальную конструкцию с оператором in. Слева от него указывается элемент, справа - множество. Результатом является логичное значение - истина или ложь. True - элемент принадлежит множеству, False - не принадлежит: var A: set of Char; {. . . } A: =['A'. . 'E', 'X']; if 'D' in A then Show. Message ('Элемент В находится во множестве A. ');
Множества. Операции над множествами. 2. Объединение множеств В словесном описании операция объединения - результирующее множество содержит все те элементы, которые есть хотя бы в одном из двух исходных множеств. Объединение записывается знаком плюс "+". Пример: var A, B, C: set of Char; {. . . } A: =['A', 'B', 'C']; B: =['X', 'Y', 'Z']; C: =A+B; //C = ['A', 'B', 'C', 'X', 'Y', 'Z']
Множества. Операции над множествами. 3. Пересечение множеств Операция пересечения формирует множество только из тех элементов, которые одновременное присутствуют как в первом, так и во втором исходном множестве. Пересечение обозначается звёздочкой "*". Пример: var X, Y, Z: set of Byte; {. . . } X: =[1, 2, 3, 4, 5]; Y: =[4, 5, 6, 7, 8]; Z: =X*Y; //Z = [4, 5]
Множества. Операции над множествами. 3. Разность множеств Операция вычитания удаляет из первого множества те элементы, которые есть во втором множестве: Пример: var X, Y, Z: set of Char; {. . . } X: =['A'. . 'D']; Y: =['D'. . 'F']; Z: =X-Y; //Z = ['A'. . 'C'] Следует обратить внимание, что порядок множеств в данном случае важен, т. е. X-Y и Y-X - это разные множества.
Множества. Применение множеств. С помощью множеств удобно задавать набор опций, каждая из которых либо включена, либо выключена. К примеру, поместите на форму кнопку (TButton), перейдите в инспектор объектов, разверните свойство Font (шрифт) и найдите свойство Style. Вот это свойство как раз и реализовано множеством. Во множестве 4 элемента: fs. Bold, fs. Italic, fs. Underline и fs. Strike. Out, каждый из которых отвечает за стиль шрифта. Принадлежность элементов ко множеству задаётся указанием значения True или False для каждого из этих пунктов. В строке "Style" находится описание данного множества.
Пример: Пусть будет меняться стиль шрифта у этой кнопки (Button 1). Поместим на форму 4 TCheck. Box - для доступа ко всем значениям и дадим им соответствующие имена. Изменение стиля будем делать при нажатии на саму эту кнопку. Пример реализации: procedure TForm 1. Button 1 Click(Sender: TObject); begin Button 1. Font. Style: =[]; //Сделали множество пустым //Теперь смотрим состояния флажков и добавляем нужные стили if Check. Box 1. Checked then Button 1. Font. Style: =Button 1. Font. Style+[fs. Bold]; if Check. Box 2. Checked then Button 1. Font. Style: =Button 1. Font. Style+[fs. Italic]; if Check. Box 3. Checked then Button 1. Font. Style: =Button 1. Font. Style+[fs. Underline]; if Check. Box 4. Checked then Button 1. Font. Style: =Button 1. Font. Style+[fs. Strike. Out]; end;
Чтобы не повторять везде одно и то же "Button 1. Font. ", эту часть кода можно, что называется, вынести за скобку при помощи специального оператора with. Смысл его прост: то, что вынесено вперёд, автоматически применяется ко всему, что находится внутри данного блока. В нашем случае будет так: procedure TForm 1. Button 1 Click(Sender: TObject); begin with Button 1. Font do begin Style: =[]; //Сделали множество пустым //Теперь смотрим состояния флажков и добавляем нужные стили if Check. Box 1. Checked then Style: =Style+[fs. Bold]; if Check. Box 2. Checked then Style: =Style+[fs. Italic]; if Check. Box 3. Checked then Style: =Style+[fs. Underline]; if Check. Box 4. Checked then Style: =Style+[fs. Strike. Out]; end;
У большинства компонент среди свойств можно найти множества. Например, у диалога открытия файла TOpen. Dialog (вкладка Dialogs) множеством представлено свойство Options, которое содержит приличное число элементов: TOpen. Option = (of. Read. Only, of. Overwrite. Prompt, of. Hide. Read. Only, of. No. Change. Dir, of. Show. Help, of. No. Validate, of. Allow. Multi. Select, of. Extension. Different, of. Path. Must. Exist, of. File. Must. Exist, of. Create. Prompt, of. Share. Aware, of. No. Read. Only. Return, of. No. Test. File. Create, of. No. Network. Button, of. No. Long. Names, of. Old. Style. Dialog, of. No. Dereference. Links, of. Enable. Include. Notify, of. Enable. Sizing, of. Dont. Add. To. Recent, of. Force. Show. Hidden); TOpen. Options = set of TOpen. Option;
Записи Запись (англ. record) - это сложный тип данных, позволяющие объединить данные разных типов. Название "запись" появилось из тех соображений, что данные разного типа можно встретить в таблицах: в каждой строке записаны сразу несколько разных значений. Таким образом, одна запись соответствует одной строке данных: она имеет несколько полей, каждое из которых хранит своё значение. Описание записи Чтобы работать в программе с записями, нужно сначала описать соответствующий тип данных. Запись описывается следующим образом: type имя_типа_записи = record {поля записи} end; В блоке полей описание идёт точно так же, как описание переменных: указывается имя поля, далее через двоеточие тип данных этого поля. Сами поля разделяются точкой с запятой.
Записи type TPerson = record Name: String; Age: Byte; Education, PC: Boolean; Foreign: set of TForeign. Languages; end; type TForeign. Languages = (fl. English, fl. German, fl. French); Для ФИО вполне подходит текстовая строка типа String. 255 символов. Для хранения возраста целесообразно выбрать тип данных Byte (число от 0 до 255). Для поля "образование" выбран логический тип данных. Условимся, что True - это высшее образование, False - высшего нет (т. е. среднее). PC - владение компьютером. Для хранения иностранных языков здесь используется множество.
Записи TPoint - запись с двумя полями - X и Y - служит для хранения координат точки. Описана эта запись следующим образом: TPoint = record X: Longint; Y: Longint; end; Ещё один пример - хранение даты. Дату можно разбить на число, месяц и год, и хранить каждое значение отдельно: TDate = record Day: 1. . 31; Month: 1. . 12; Year: 1900. . 2100; end;
Записи Работа с записями Чтобы обратиться к конкретному полю записи, применяется стандартная конструкция: имя_переменной. название_поля Т. е. имя переменной или объекта и его поле разделяются точкой. Чтобы работать с записью, нужно определить переменную, тип которой - наша запись. Описание происходит стандартным образом: var Person: TPerson; Имя переменной вы, естественно, можете дать любое, просто логично называть всё своими именами.
Записи type TPerson = record Name: String; Age: Byte; Education, PC: Boolean; Foreign: set of TForeign. Languages; end; procedure TForm 1. Button 1 Click(Sender: TObject); var Person: TPerson; begin Person. Name: =Edit 1. Text; Person. Age: =Up. Down 1. Position; Person. Education: =Check. Box 1. Checked; Person. PC: =Check. Box 2. Checked; Person. Foreign: =[]; if Check. List. Box 1. Checked[0] then Person. Foreign: =Person. Foreign + [fl. English]; if Check. List. Box 1. Checked[1] then Person. Foreign: =Person. Foreign + [fl. German]; if Check. List. Box 1. Checked[2] then Person. Foreign: =Person. Foreign + [fl. French]; End;
Записи procedure TForm 1. Button 1 Click(Sender: TObject); var Person: TPerson; I: Byte; begin with Person do begin Name: =Edit 1. Text; Age: =Up. Down 1. Position; Education: =Check. Box 1. Checked; PC: =Check. Box 2. Checked; Foreign: =[]; for I : = 0 to Check. List. Box 1. Items. Count-1 do if Check. List. Box 1. Checked[I] then Foreign: =Foreign + [TForeign. Languages(I)]; end;
Указатель в Delphi - величина, которая указывает на некий адрес в памяти, где хранятся некоторые данные. Указатели бывают двух видов: 1) типизированные, указывающие на данные определенного типа, 2) нетипизированные (типа pointer), которые могут указывать на данные произвольного типа.
Типизированные указатели объявляются в разделе Type программы с использованием символа ^ (оператора указателя) или ключевого слова Pointer. Типизирован ные указатели позволяют компилятору отслеживать, с каким именно типом данных происходят действия и не выполняются ли при этом некорректные операции. Вот примеры объявлений типизированных указателей: Type var PInt = ^Integer; // PInt - указатель на Integer Foo = record // Тип - запись Gobbledy. Gook: string; Snarf: Real; end; PFoo = ^Foo; // PFoo - указатель на объект типа foo P: Pointer; // Нетипизированный указатель P 2: PFoo; //Экземпляр PFoo
Операция @ и функция addr позволяют получить адрес переменной: var x : word; { переменная } pw : ^word; { указатель на величины типа word } pw : = @w; { или pw : = addr(w); } Переменная типа Pointer всегда содержит только адрес области па мяти. О выделении памяти для структуры, на которую будет указывать такой указатель, программист должен позаботиться сам. Когда указатель не указывает ни на что (его значение равно 0), то о таком указателе говорят, что его значение равно Nil, а сам указатель называют нулевым, или пустым указателем.
Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem. Динамические переменные не имеют собственных имен — к ним обращаются через указатели. Процедура new(var p : тип_указателя) выделяет в динамической памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель p, и адрес начала этого участка заносит в этот указатель. Функция new(тип_указателя) : pointer выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес начала этого участка. new применяется для типизированных указателей. Процедура getmem(var p : pointer; size : word) выделяет в динамической памяти участок размером в size байт и присваивает адрес его начала указателю p. Если выделить требуемый объем памяти не удалось, программа аварийно завершается. Указатель может быть любого типа.
Program Ptr. Test; Type My. Rec = record I: Integer; S: string; R: Real; end; PMy. Rec = ^My. Rec; var Rec: PMy. Rec; begin New(Rec); // Выделить память для новой записи Rec^. I : = 10; // Поместить в нее данные. Rec^. S : = ‘And now for something completely different. ’; Rec^. R : = 6. 384; …. Dispose(Rec); end. New() используется при выделении памяти для указателя на структуру дан- ных известного размера. Dispose() используется для освобождения памяти, выделенной с помощью функции New().
Для выделения памяти структурам, размер которых на этапе компиляции еще не известен, используются функции Get. Mem() и Alloc. Mem(). Например, компилятор не может определить заранее, сколько памяти потребуется выделить для структур, задаваемых переменными типа PChar или Pointer, что связано с самой природой этого типа данных. Самое важное - не пытаться манипулировать количеством памяти, большим, чем было выделено реально, поскольку наиболее вероятным результатом таких действий будет ошибка доступа к памяти (access violation). Для освобождения памяти, выделенной с помощью вышеупомянутых функций, используйте функцию Free. Mem(). Кстати, для выделения памяти лучше пользоваться функцией Alloc. Mem(), так как она всегда инициализирует выделенную память нулевыми значениями.
Подпрограмма - обособленная именованная часть программы со своим собственным локальным контекстом имён. Или иначе: часть программы, оформленная в виде отдельной синтаксической конструкции и снабжённая именем. Вызов подпрограммы осуществляется по имени. Локальные объекты (константы, переменные, типы, подпрограммы) доступны только внутри подпрограммы. В Паскале (Object Pascal) подпрограммы бывают двух типов: процедуры и функции.
Общая структура подпрограммы Структура подпрограммы в Паскале повторяет структуру всей программы, и в общем случае состоит из 3 -х основных компонент: Интерфейс подпрограммы (информация, необходимая для её вызова). Сосредоточен в заголовке. Локальный контекст подпрограммы (совокупность описаний объектов, с которыми осуществляются действия) Действия, составляющие смысл подпрограммы (последовательность операторов и вызовов подпрограмм, то есть программа на Паскале).
Процедуры и функции различаются назначением и способом использования. Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки. Процедура, это подпрограмма, которая обрабатывает данные, принимает или выводит информацию, меняет или нет каким-либо образом глобальные и локальные переменные. Смысл функций - определить алгоритм вычисления нового значения некоторого простого или ссылочного типа. Функция, это подпрограмма, которая, как и процедура, что-то делает, но, помимо этого, она обязательно возвращает значение, тип которого задается при описании заголовка процедуры. Вызов функции является одним из допустимых операндов выражения, обозначая в нём то значение, которое вычисляет функция, то есть, если подпрограмма с идентификатором “Function 1” – функция, то можно произвести следующие действия: X: =Function 1(“параметры – аргументы функции”); X: =2*Function 1(a, e, …, m, …)-1/Function 1(c, f, …, k, …); и т. д.
Procedure Имя_процедуры (параметры); Var лок_переменные : тип; Begin Код процедуры; end; Function Имя_функции (параметры): тип_рез-та; Var лок_переменные : тип; begin Код функции; Result: =результат; end; Описание подпрограммы состоит из ключевого слова procedure или function, за которым следует имя подпрограммы со списком параметров, заключённых в скобки. В случае функции далее ставится двоеточие и указывается тип возвращаемого значения. Обычная точка с запятой далее - обязательна! Сам код подпрограммы заключается в "логические скобки" begin/end. Для функции необходимо в коде присвоить переменной с именем функции или специальной зарезервированной переменной Result (предпочтит ельно) возвращаемое функцией значение.
Описанная таким образом подпрограмма должна быть размещена в основной программе до первого её вызова. Иначе при компиляции получите извещение о том, что "неизвестный идентификатор. . . " Следить за этим не всегда удобно. Есть выход - разместить только заголовок подпрограммы там, где размещают описания всех данных программы. Параметры - это список идентификаторов, разделённых запятой, за которым через двоеточие указывается тип. Если списков идентификаторов разных типов несколько, то они разделяются точкой с запятой. Всё, как и в случае обычного описания данных. Это так называемые формальные параметры. При вызове подпрограммы они заменяются на фактические - следующие через запятую данные того же типа, что и формальные. Параметры в описании подпрограммы могут и отсутствовать, тогда она оперирует данными прямо из основной программы. Локальные данные - переменные, константы, подпрограммы, которые используются и существуют только в момент вызова данной подпрограммы. Они так же должны быть описаны в этой подпрограмме. Место их описания - между заголовком и началом логического блока - ключевым словом begin. Имена локальных данных могут совпадать с именами глобальных. В этом случае используется локальная переменная, причём её изменение не скажется на глобальной с тем же именем. Совершенно аналогично локальным типам, переменным, константам могут быть введены и локальные процедуры и функции, которые могут быть описаны и использованы только внутри данной подпрограммы.
Области видимости объектов Имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, включая и все вложенные блоки. Имена объектов, описанные в блоке, должны быть уникальными в пределах данного блока и могут совпадать с именами объектов из других блоков. Если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного в объемлющем блоке, то последнее становится недоступным в данном блоке (экранировка).
Program X; Var I, j: integer; z: real; Procedure x 1(i: integer; ); Var j: integer; Begin End; Procedure x 2; Var z: integer; Procedure x 3(z: string); Begin End; Function y 4(z: string): integer; Begin End; Begin End; Begin End. Приведенная ниже диаграмма показывает видимость идентификаторов в примере. Каждый идентификатор виден в пределах того прямоугольника, в котором он описан и в прямоугольниках, содержащихся в данном. За пределами этого прямоугольника идентификатор либо неизвестен, либо имеет другое значение, тип. Так, например, функция y 4 может быть вызвана лишь внутри процедур x 2 и x 3, аналогично и x 3. Переменные z в теле программы и в каждой из x 2, x 3, y 4 имеют абсолютно разные и независимые значения, а в x 1 видима та же z, что и в теле программы. В тоже время переменные i и j перекрыты в x 1 новыми определениями, а в x 2, x 3, y 4, они те же, что и в основной программе.
Механизм передачи параметров Передача параметров по значению Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. procedure Test(s: string); При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.
Механизм передачи параметров Передача параметров по ссылке Pascal позволяет также передавать параметры в функции или процедуры по ссылке - такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции. procedure Change. Me(var x: longint); begin x : = 2; // Параметр х изменен вызванной процедурой end; Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.
Механизм передачи параметров Program A; Var a, b, c : integer; …. Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka (a, b, c: integer); Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …. Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka (aa, bb, cc: integer); Begin aa: = aa + 5; bb: = bb - 5; cc: = cc + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …. Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka (aa, bb, cc: integer); Begin aa: = aa + 5; bb: = bb - 5; cc: = cc + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka (var a, b, c: integer); Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka (var aa, bb, cc: integer); Begin aa: = aa + 5; bb: = bb - 5; cc: = cc + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka (a, b: integer; var c: integer); Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka; Var a, b, c : integer; Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Procedure obrabotka; Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; obrabotka(a, b, c); // чему равно а, b, c ? end. Function obrabotka: Integer; Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; c: =obrabotka(a, b, c); // чему равно а, b, c ? end. Function obrabotka: Integer; Begin a: = a + 5; b: = b - 5; c: = c + 10; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; c: =obrabotka(a, b, c); // чему равно а, b, c ? end. Function obrabotka: Integer; Begin a: = a + 5; b: = b - 5; c: = c + 10; Result: = a+b; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; c: =obrabotka(a, b, c); // чему равно а, b, c ? end. Function obrabotka (a, b, c: integer): Integer; Begin a: = a + 5; b: = b - 5; c: = c + 10; Result : =a+b; end.
Механизм передачи параметров Program A; Var a, b, c : integer; …… Begin a: =5; b: =9; c: =10; c: =obrabotka(a, b, c); // чему равно а, b, c ? end. Function obrabotka (var a, b, c: integer): Integer; Begin a: = a + 5; b: = b - 5; c: = c + 10; Result : =a+b; end.
Передача параметров констант Если нет необходимости изменять передаваемые функции или процедуре данные, можно описать параметр как константу. Ключевое слово const не только защищает параметр от изменения, но и позволяет компилятору сгенерировать более оптимальный код передачи строк и записей. Вот пример объявления параметраконстанты: procedure Test(const s: string ); Передача открытых массивов Открытый массив параметров позволяет передавать в функцию или процедуру различное количество параметров. В качестве параметров можно передать либо открытый массив элементов одинакового типа, либо массивы констант различного типа. В приведенном ниже примере объявляется функция, которой в качестве параметра должен передаваться открытый массив целых чисел. function Add. Em. Up(A: array of integer): integer; procedure What. Have. IGot( A: array of const ); В открытом массиве можно передавать переменные, константы или выражения из констант.
В Delphi есть одна очень полезная возможность - использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере: procedure Has. Def. Val( s: string; i: integer = 0 ); Подобное объявление означает, что процедура Has. Def. Val может быть вызвана двумя путями. В первом случае - как обычно, с указанием обоих параметров: procedure Has. Def. Val( 'Hello', 26 ); Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию: procedure Has. Def. Val( 'Hello' );
При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах: Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встречаться в списке после параметра, имеющего значение по умолчанию. Значения по умолчанию могут присваиваться только параметрам обычных типов, указателям или множествам. Значение по умолчанию может передаваться только по значению либо с модификатором const. Оно не может быть ссылкой или нетипизированным параметром.
Базовые алгоритмы обработки данных. Базовые алгоритмы обработки данных являются результатом исследований и разработок, проводившихся на протяжении десятков лет. Но они, как и прежде, продолжают играть важную роль во все расширяющемся применении вычислительных процессов. К базовым алгоритмам императивного программирования можно отнести: 1) Алгоритмы работы со структурами данных. Они определяют базовые принципы и методологию, используемые для реализации, анализа и сравнения алгоритмов. Позволяют получить представление о методах представления данных. 2) Алгоритмы сортировки, предназначенные для упорядочения массивов и файлов, имеют особую важность. С алгоритмами сортировки связаны, в частности, очереди по приоритету, задачи выбора и слияния. 3) Алгоритмы поиска, предназначенные для поиска конкретных элементов в больших коллекциях элементов. 4) Алгоритмы на графах полезны при решении ряда сложных и важных задач. 5) Алгоритмы обработки строк включают ряд методов обработки (длинных) последователей символов. Поиск в строке приводит к сопоставлению с эталоном, что в свою очередь ведет к синтаксическому анализу. К этому же классу задач можно отнести и технологии сжатия файлов. 6) Геометрические алгоритмы – это методы решения задач с использованием точек и линий (и других простых геометрических объектов).
Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (англ. Last In — First Out, «последним пришел — первым вышел» ). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно взять верхнюю. Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним. Стеки широко применяются в вычислительной технике. Например, для отслеживания точек возврата из подпрограмм используется стек вызовов, который является неотъемлемой частью архитектуры большинства современных процессоров. Языки программирования высокого уровня также используют стек вызовов для передачи параметров при вызове процедур. Арифметические сопроцессоры, программируемые микрокалькуляторы и язык Forth используют стековую модель вычислений.
Система предписаний стека: 1. 2. 3. 4. 5. Добавить элемент на стек Взять элемент со стека Проверить стек на пустоту Сделать стек пустым Вершина стека
Очередь - структура данных с методом доступа к элементам <первый пришёл - первый вышел> (FIFO, First In - First Out). Добавление элемента осуществляется в конец очереди, извлечение элементов - из начала очереди, при этом выбранный элемент из очереди удаляется. Система предписаний очереди: 1. Добавить элемент в конец очереди 2. Взять элемент из начала очереди 3. Проверить на пустоту 4. Сделать очередь пустой
Дек. Система предписаний дека: 1. 2. 3. 4. 5. 6. Добавить элемент слева Добавить элемент справа Взять элемент слева Взять элемент справа Проверить дек на пустоту Сделать дек пустым
Последовательность. Система предписаний последовательности: 1. 2. 3. 4. 5. 6. Добавить элемент в последовательность Удалить элемент из последовательности Прочесть элемент последовательности Встать в начало последовательности Проверить последовательность на пустоту Сделать последовательность пустой
Список (L 1 - однонаправленный, L 2 – двунаправленный). Система предписаний списка L 1: Система предписаний списка L 2: 1. Добавить элемент в cписок по указателю 2. Удалить элемент по указателю 3. Указатель в начале? 4. Передвинуть указатель в начало списка 5. Передвинуть указатель на следующий элемент 6. Сделать список пустым 7. Проверить на пустоту 1. Добавить элемент в cписок по указателю 2. Удалить элемент по указателю 3. Указатель в начале/конце? 4. Передвинуть указатель в начало /в конец списка 5. Передвинуть указатель на следующий/предыдущий элемент 6. Сделать список пустым 7. Проверить на пустоту
На практике линейные списки обычно реализуются при помощи массивов и связных списков. Иногда термин <список> неформально используется также как синоним понятия <связный список>.
Задача сортировки Пусть необходимо упорядочить n элементов R 1, R 2. . . Rn. Эти элементы называют записями. Всю совокупность записей называют файлом. Каждая запись Rj имеет ключ Kj, который и управляет процессом сортировки. Помимо ключа запись обычно содержит дополнительную информацию, которая не влияет на поиск, но хранится вместе с записью. Например: запись о сотрудниках предприятия. Отношение порядка «<» на множестве ключей вводится так, чтобы для любых трёх значений ключей a, b, c выполнялись следующие условия: 1) справедливо одно и только одно из соотношений a<b, a=b, b<a (закон трихотомии); 2) если a<b<c, то a<c (закон транзитивности). Эти два свойства определяют математическое понятие линейного упорядочивания (совершенного), и соответственно, любое множество с соотношением «<» , удовлетворяющее условиям 1), 2), поддаётся сортировке.
Задача сортировки – найти такую перестановку записей p(1), p(2)… p(n), после которой ключи расположились бы в неубывающем порядке: Kp(1)≤ Kp(2)≤Kp(n). Сортировка называется устойчивой, если она удовлетворяет дополнительному условию: записи с одинаковыми ключами остаются в прежнем порядке, то есть p(i)<p(j), если Kp(i)=Kp(j) и i<j. В зависимости от постановки задачи в одних случаях требуется физически перемещать записи в памяти так, чтобы их ключи были упорядочены. В других случаях достаточно создать вспомогательную таблицу, которая неким образом описывает перестановку и обеспечивает доступ к записям в соответствии с порядком их ключей. Если сортируемый файл целиком помещается в памяти, то используемый метод сортировки называется внутренним (internal). Сортировка файлов на внешних носителях называется внешней (external). Основное различие между ними состоит в том, что при внутренней сортировке доступ к любому элементу файла не предоставляет трудностей, в то время как в условиях внешней сортировки возможен только последовательный доступ к элементу или, по крайней мере, доступ к большим блокам элементов. На ряду с сортировкой массивов большой интерес представляет изучение методов сортировки связных списков (динамических структур). Однако большинство классических методов сортировки массивов обладают столь высокой степенью абстракции, что могут без труда быть применены к сортировке связных списков.
Методы сортировки Сортировка вставками Элементы просматриваются по одному, и каждый новый элемент вставляется в подходящее место среди ранее упорядоченных. Обменная сортировка Если два элемента расположены не по порядку, то они меняются местами. И так повторяется до тех пор, пока массив не будет упорядочен. Сортировка подсчётом Каждый элемент сравнивается со всеми остальными, и окончательное положение элемента определяется подсчётом числа меньших ключей. Сортировка посредством выбора Сначала выделяется наименьший (или наибольший) элемент и каким-либо образом отделяется от остальных. Затем снова выбирается наименьший (наибольший) элемент, но уже из оставшихся – и так далее. Сортировка слиянием Сортируемый массив разбивается на две половины меньшего размера, сортируется каждая половина в отдельности, далее – отсортированные массивы совмещаются в один массив.
1. 1 Сортировка простыми вставками Суть: элементы, начиная со второго, сравниваются с ранее упорядоченными. Например: дан массив 6, 3, 4, 9, 1, 5.
Где C – стоимость, n – количество выполнений строки, zi – количество повторений строки№ 4, T- время выполнения алгоритма.
Рассмотрим граничные случаи: 1. Массив уже отсортирован zi=1, тогда зависимость T(n) имеет линейный вид: T(n)=a∙n+b. Время алгоритма растёт линейно. 2. Массив отсортирован в обратном порядке zi=i; То есть время алгоритма растёт в соответствии с квадратичной зависимостью.
Порядок роста – это такая функция для которой найдутся такие константы С 1 и С 2>0 и такое число n 0, что для всех Или в общем случае: порядок роста – это функция для которой найдутся такие константы С 1, С 2>0 и такое число n 0, что будет выполняться неравенство для всех
ЯП презентация по курсу.pptx