© С.В.Кухта, 2009 1 Основные элементы языка Паскаль Тема 2.

Презентация:



Advertisements
Похожие презентации
1 ESC – ВЫХОД НА СЛЕДУЮЩИЙ миэт цко НА ПРЕДЫДУЩИЙ Алфавит языка Турбо-Паскаль: БУКВЫ И ЦИФРЫ 1. Прописные и строчные буквы латинского алфавита: A B C D.
Advertisements

turbo.exe основной файл среды Любой язык обладает алфавитом, синтаксисом и семантикой. В алфавит входит набор символов, использующихся в языке с помощью.
Урок 6 Turbo Pascal Язык профессионального программирования, который назван в честь французского математика и философа Блеза Паскаля (1623–1662) и разработан.
Урок 3 Turbo Pascal Язык профессионального программирования, который назван в честь французского математика и философа Блеза Паскаля (1623–1662) и разработан.
1 Программирование на языке Паскаль Тема 1. Введение.
Тема 1. Введение 1.
1 Программирование на языке Паскаль Тема 1. Введение Кулебякин В.В.
1 Программирование на языке Паскаль Тема 1. Введение.
Тема урока Переменная. Тип данных. Ввод и вывод данных.
1 Программирование на языке Паскаль Тема 1. Введение.
ОДНОМЕРНЫЕ МАССИВЫ. РАБОТА С ЭЛЕМЕНТАМИ СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ.
Тема: « Линейные вычислительные алгоритмы. ». Язык Паскаль был разработан в 1970г. Никласом Виртом как язык обучения студентов программированию. Паскаль.
Урок 2. Информационные процессы в обществе и природе.
1 Программирование на языке Паскаль Типы данных. Оператори. Стандартные функции.
Язык программирования Turbo Pascal. Программирование Программирование – это запись разработанного алгоритма на языке программирования. 4 Автор языка Паскаль.
1 Программирование на языке Паскаль © К.Ю. Поляков, ВведениеВведение 2.ВетвленияВетвления 3.Сложные условияСложные условия 4.ЦиклыЦиклы 5.Циклы.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Ипеременные и константы имеют своё собственное уникальное имя – идентификатор. И переменные и константы имеют своё собственное уникальное имя – идентификатор.
Программирование на языке Паскаль Тема 1. Введение.
«Типы данных». Целочисленные типы данных Тип ДиапазонТребуемая память (байт) byte shortint integer word longint
Транксрипт:

© С.В.Кухта, Основные элементы языка Паскаль Тема 2.

© С.В.Кухта, Общая характеристика языка Паскаль 2. Алфавит языка Паскаль 3. Структура программы 4. Основные объекты программы 5. Типы данных и операции, производимые с ними 6. Стандартные процедуры и функции 7. Арифметические выражения 8. Оператор присваивания 9. Процедуры ввода-вывода данных 10. Метки и оператор безусловного перехода Содержание

© С.В.Кухта, Общая характеристика языка Паскаль

© С.В.Кухта, Языки программирования Язык Паскаль был разработан Никласом Виртом первоначально для целей обучения программированию. В настоящее время он получил широкое распространение по ряду объективных причин. 1)По своей идеологии Паскаль наиболее близок к современной методике и технологии программирования. В частности, он достаточно полно отражает идеи структурного программирования, что довольно хорошо видно даже из основных управляющих структур языка. 2)Паскаль хорошо приспособлен для применения технологии разработки программ сверху-вниз (пошаговой детализации). 3)Паскаль содержит большое разнообразие различных структур данных, что обеспечивает простоту алгоритмов, а следовательно снижение трудоемкости при разработке программ.

© С.В.Кухта, Отличия алгоритмических языков от машинных алгоритмический язык обладает гораздо большими выразительными возможностями, т.е. его алфавит значительно шире алфавита машинного языка, что существенно повышает наглядность текста программы; набор операций, допустимых для использования, не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определенного класса; формат предложений достаточно гибок и удобен для использования, что позволяет с помощью одного предложения задать достаточно содержательный этап обработки данных;

© С.В.Кухта, Отличия алгоритмических языков от машинных требуемые операции задаются в удобном для человека виде, например, с помощью общепринятых математических обозначений; для задания операндов операций, используемым в алгоритме данным присваиваются уникальные имена, выбираемые программистом, и ссылка на операнды производится, в основном, по именам; в языке может быть предусмотрен значительно более широкий набор типов данных по сравнению с набором машинных типов данных.

© С.В.Кухта, Языки программирования Из вышеперечисленного следует, что алгоритмический язык в значительной мере является машинно-независимым.

© С.В.Кухта, Основные понятия языка Паскаль

© С.В.Кухта, Алфавит языка Паскаль Алфавит включает в себя буквы, цифры и специальные символы. 1. Прописные и строчные буквы латинского алфавита: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z _ знак подчеркивания (используется в именах вместо пробела) 2. Десятичные цифры:

© С.В.Кухта, Алфавит языка Паскаль 3. Прописные и строчные буквы русского алфавита (для комментариев, для вывода сообщений на экран): А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я

© С.В.Кухта, Алфавит языка Паскаль 4. Специальные символы: + плюс – минус * звездочка / дробная черта (слэш) > больше < меньше = равно : двоеточие; точка с запятой пробел ' апостроф, запятая. точка ^ коммерческое а (эт) $ знак доллара # номер [ ] квадратные скобки { } фигурные скобки ( ) круглые скобки

© С.В.Кухта, Алфавит языка Паскаль 5. Составные символы, которые нельзя разделять пробелами не равно = больше или равно := присваивание.. промежуток значений (* *) (..) начало и конец комментариев (замена фигурных скобок)

© С.В.Кухта, Зарезервированные слова ABSOLUTE AND ARRAY ASM ASSEMBLER BEGIN CASE CONST CONSTRUCTOR DESTRUCTOR DIV DO DOWNTO ELSE END EXTERNAL FAR FILE FOR FORWARD FUNCTION GOTO IF IMPLEMENTATION IN INHERITED INLINE INTERFACE INTERRUPT LABEL MOD NEAR NIL NOT OBJECT OF OR PACKED PRIVATE PROCEDURE PROGRAM PUBLIC RECORD REPEAT SET SHL SHR STRING THEN TO TYPE UNIT UNTIL USES VAR VIRTUAL WHILE WITH XOR

© С.В.Кухта, Структура программы Для того чтобы компилятор правильно понял, какие именно действия от него ожидаются, ваша программа должна быть оформлена в полном соответствии с синтаксисом (правилами построения программ) языка Паскаль.

© С.В.Кухта, Структура программы program ; Uses …;{ подключаемые модули и библиотеки } Label …;{ раздел объявления меток } Const …;{ раздел объявления констант } Type …;{ раздел объявления типов } Var …; { раздел объявления переменных } begin { начало основного блока программы } … { операторы основного блока программы } end. { конец основного блока программы } program ; Uses …;{ подключаемые модули и библиотеки } Label …;{ раздел объявления меток } Const …;{ раздел объявления констант } Type …;{ раздел объявления типов } Var …; { раздел объявления переменных } begin { начало основного блока программы } … { операторы основного блока программы } end. { конец основного блока программы } Procedure …; { раздел описания процедур } Function …; { раздел описания функций } Procedure …; { раздел описания процедур } Function …; { раздел описания функций } комментарии в фигурных скобках не обрабатываются

© С.В.Кухта, Структура программы Любой из перечисленных необязательных разделов может встречаться в тексте программы более одного раза, их общая последовательность также может меняться, но при этом всегда должно выполняться главное правило языка Паскаль: прежде чем объект будет использован, он должен быть объявлен и описан. !

© С.В.Кухта, Оформление текста программы Шапка – комментарий в начале процедур и функций. { Max – максимальное из двух чисел Вход: a, b – исходные числа Выход: максимальное из a и b } function Max(a, b: integer): integer; begin... end; { Max – максимальное из двух чисел Вход: a, b – исходные числа Выход: максимальное из a и b } function Max(a, b: integer): integer; begin... end;

© С.В.Кухта, Оформление текста программы Отступы – тело цикла, условного оператора, оператора выбора и т.п. сдвигается вправо на 2-3 символа. for i:=1 to n do begin j := 0; while j < i do begin j := j + 1; k := k mod N; end; k := k + 1; end; for i:=1 to n do begin j := 0; while j < i do begin j := j + 1; k := k mod N; end; k := k + 1; end; лесенка for i:=1 to n do begin j := 0; while j < i do begin j := j + 1; k := k mod N; end; k := k + 1; end; легче читать текст программы видны блоки begin-end (где начинаются и заканчиваются) Скорость работы программы не меняется! !

© С.В.Кухта, Оформление текста программы «говорящие» имена функций, процедур, переменных: Sum, ShowMenu, count, speed. пробелы в операторах выделение пустыми строками и комментариями важных блоков if(a

© С.В.Кухта, Порядок разработки программы 1. Программист должен знать алгоритм решения задачи 2. Нужно придумать имена константам, переменным 3. Нужно определить какого типа будут переменные 4. Перед вычислениями нужно задать или ввести исходные данные для решения задачи 5. Задать действия необходимые для получения результата 6. Полученный результат нужно вывести 7. Проверить работоспособность программы на нескольких исходных данных

© С.В.Кухта, Из чего состоит программа? Константа – постоянная величина, имеющая имя. Переменная – изменяющаяся величина, имеющая имя (ячейка памяти). Выражение состоит из констант, переменных, указателей функций, знаков операций и скобок и служит для задания правила вычисления некоторого значения. Комментарий – строка (или несколько строк) из произвольных символов, заключенная в фигурные скобки. Оператор – неделимый элемент программы, который позволяет выполнять определенные алгоритмические действия.

© С.В.Кухта, Из чего состоит программа? Процедура – вспомогательный алгоритм, описывающий некоторые действия (рисование окружности). Функция – вспомогательный алгоритм для выполнения вычислений (вычисление квадратного корня, sin).

© С.В.Кухта, Идентификаторы Имена, даваемые программным объектам (константам, типам, переменным, функциям и процедурам, да и всей программе целиком) называются идентификаторами. Каждый объект программы должен иметь уникальный идентификатор. Идентификаторы могут иметь любую длину, но если у двух имен первые 63 символа совпадают, то такие имена считаются идентичными. Максимальная длина символов. Вы можете давать программным объектам любые имена, но необходимо, чтобы они отличались от зарезервированных слов языка Паскаль, потому что компилятор все равно не примет переменные с "чужими" именами.

© С.В.Кухта, Идентификаторы Имена могут включать латинские буквы (A-Z) цифры знак подчеркивания _ заглавные и строчные буквы не различаются Имена НЕ могут включать русские буквы пробелы скобки, знаки +, =, !, ? и др. имя не может начинаться с цифры

© С.В.Кухта, Идентификаторы Какие имена правильные? AXby R&B 4Wheel Вася PesBarbos TU154 [QuQu] _ABBA A+BKoren uravneniya X1_X2Koren

© С.В.Кухта, Константа - это объект, значение которого известно еще до начала работы программы. необходимы для оформления наглядных программ, незаменимы при использовании в тексте программы многократно повторяемых значений, удобны в случае необходимости изменения этих значений сразу во всей программе. Константы

© С.В.Кухта, Константы const i2 = 45; { целое число } pi = 3.14; { вещественное число } qq = 'Вася'; { строка символов } L = True; { логическая величина } const i2 = 45; { целое число } pi = 3.14; { вещественное число } qq = 'Вася'; { строка символов } L = True; { логическая величина } целая и дробная часть отделяются точкой можно использовать русские буквы! может принимать два значения: True (истина, «да») False (ложь, «нет») может принимать два значения: True (истина, «да») False (ложь, «нет»)

© С.В.Кухта, Константы В языке Паскаль существует три вида констант: неименованные константы (цифры и числа, символы и строки, множества); именованные нетипизированные константы; именованные типизированные константы.

© С.В.Кухта, Неименованные константы Неименованные константы не имеют имен, и потому их не нужно описывать. Тип неименованной константы определяется автоматически, по умолчанию: любая последовательность цифр (возможно, предваряемая знаком "-" или "+" или разбиваемая одной точкой) воспринимается компилятором как число (целое или вещественное); любая последовательность символов, заключенная в апострофы, воспринимается как строка (см. сл. тему) ; любая последовательность целых чисел либо символов через запятую, обрамленная квадратными скобками, воспринимается как множество (см. сл. тему). Кроме того, существуют две специальные константы true и false, относящиеся к логическому типу данных.

© С.В.Кухта, Неименованные константы int1 := -10; real2 := х; char3 := 'z'; string4 := 'abc' + string44; set5 := [1,3,5] * set55; boolean6 := true; int1 := -10; real2 := х; char3 := 'z'; string4 := 'abc' + string44; set5 := [1,3,5] * set55; boolean6 := true; Примерами использования неименованных констант могут послужить следующие операторы:

© С.В.Кухта, Нетипизированные константы Именованные константы, как следует из их названия, должны иметь имя. Стало быть, эти имена необходимо сообщить компилятору, то есть описать в специальном разделе const. Если не указывать тип константы, то по ее внешнему виду компилятор сам определит, к какому (базовому) типу ее отнести. Любую уже описанную константу можно использовать при объявлении других констант, переменных и типов данных.

© С.В.Кухта, const n = -10; m = ; mmm = n*100; x = 2.5; c = 'z'; s = ' компьютер'; b = true; const n = -10; m = ; mmm = n*100; x = 2.5; c = 'z'; s = ' компьютер'; b = true; Примеры описания нетипизированных констант: Нетипизированные константы

© С.В.Кухта, Типизированные константы Любую уже описанную константу можно использовать при объявлении других констант, переменных и типов данных. Типизированные именованные константы представляют собой переменные(!) с начальным значением, которое к моменту старта программы уже известно. Следовательно, во-первых, типизированные константы нельзя использовать для определения других констант, типов данных и переменных, во-вторых, их значения можно изменять в процессе работы программы.

© С.В.Кухта, Типизированные константы Описание типизированных констант производится по следующему шаблону: const : = ; const : = ;

© С.В.Кухта, const n: integer = -10; x: real = 2.5; c: char = 'z'; b: boolean = true; const n: integer = -10; x: real = 2.5; c: char = 'z'; b: boolean = true; Примеры описания типизированных констант: Типизированные константы Примеры типизированных констант других типов будем приводить по мере изучения соответствующих типов данных.

© С.В.Кухта, Переменные Переменная – это величина, имеющая имя, тип данных и значение. Значение переменной можно изменять во время работы программы. Тип данных - это характеристика диапазона значений, которые может принимать переменная, относящиеся к этому типу данных. Наиболее часто применяемые типы переменных: integer{ целая } real{ вещественная } char{ один символ } string{ символьная строка } boolean { логическая }

© С.В.Кухта, Переменные Все используемые в программе переменные должны быть описаны в специальном разделе var по следующему шаблону: Пример объявления переменных (выделение памяти): var a, b: integer; Q: real; s1, s2: string; var a, b: integer; Q: real; s1, s2: string; var [, ] : ; [, ] : ; var [, ] : ; [, ] : ;

© С.В.Кухта, Комментарии Используют для пояснений, необходимых для лучшего понимания программы. Комментарий представляет собой пояснительный текст, который можно записывать в любом месте программы, где разрешен пробел. Текст комментария ограничен символами { и } или (* и *). Может содержать любые комбинации латинских и русских букв, цифр и других символов алфавита языка Паскаль. Примеры: { Комментарий к программе Regress } { Блок вычисления корней уравнения } (* Переменная для вычисления суммы ряда *) { Комментарий к программе Regress } { Блок вычисления корней уравнения } (* Переменная для вычисления суммы ряда *)

© С.В.Кухта, Комментарии По месту положения в программе комментарии подразделяются на четыре класса: 1)объясняющие назначение программы; 2)поясняющие смысл идентификаторов констант и переменных; 3)поясняющие смысл идентификаторов констант и переменных; 4)объясняющие труднопонимаемые элементы алгоритма.

© С.В.Кухта, Комментарии Внутри самого комментария символы } или *) встречаться не должны. Во время компилирования программы комментарии игнорируются. Следовательно, их можно добавлять в любом месте программы. Можно даже разорвать оператор вставкой комментария. Кроме того, все, что находится после ключевого слова end., завершающего текст программы, компилятор тоже воспринимает как комментарий.

© С.В.Кухта, Типы данных и операции

© С.В.Кухта, Компиляторы языка Паскаль требуют, чтобы сведения об объеме памяти, необходимой для работы программы, были предоставлены до начала ее работы. Для этого в разделе описания переменных (var) нужно перечислить все переменные, используемые в программе. Кроме того, необходимо также сообщить компилятору, сколько памяти каждая из этих переменных будет занимать. А еще было бы неплохо заранее условиться о различных операциях, применимых к тем или иным переменным. Все это можно сообщить программе, просто указав тип будущей переменной. Имея информацию о типе переменной, компилятор "понимает", сколько байт необходимо отвести под нее, какие действия с ней можно производить и в каких конструкциях она может участвовать.

© С.В.Кухта, Тип данных определяет: возможные значения переменных, констант, функций, выражений, принадлежащих к данному типу; внутреннюю форму представления данных в ЭВМ; операции и функции, которые могут выполняться над величинами, принадлежащими к данному типу.

© С.В.Кухта, Классификация типов данных Для удобства программистов существует множество стандартных типов данных и плюс к тому возможность создавать новые типы. Конструируя новые типы данных на основе уже имеющихся (стандартных или опять-таки определенных самим программистом), нужно помнить, что любое здание должно строиться на хорошем фундаменте. Поэтому сейчас мы и поговорим об этом "фундаменте". На основании базовых типов данных строятся все остальные типы языка Паскаль, которые так и называются: конструируемые.

© С.В.Кухта, Классификация типов данных Типы данных Скалярные Структурированные Стандартные Типы, определяемые пользователем Вещественный Целый Символьный Логический Адресный Перечисляемый Интервальный Множества Массивы Записи Файлы базовые типы конструируемые типы

© С.В.Кухта, Формат описания типа Type = ; Типы данных, конструируемые программистом, описываются в разделе type по следующему шаблону: type lat_bukvy = 'a'..'z','A'..'Z'; Например:

© С.В.Кухта, Базовые типы данных являются стандартными, поэтому нет нужды описывать их в разделе type. Однако при желании это тоже можно сделать, например, дав длинным определениям короткие имена. Скажем, введя новый тип данных можно немного сократить текст программы. Стандартные конструируемые типы также можно не описывать в разделе type. Однако в некоторых случаях это все равно приходится делать из-за требований синтаксиса. Например, в списке параметров процедур или функций конструкторы типов использовать нельзя (см. лекции далее). type int = integer;

© С.В.Кухта, Целочисленные типы определяют константы, переменные и функции, значения которых реализуются множеством целых чисел. Целочисленные типы данных Целочисленный тип данных BYTE Целочисленный тип данных WORD Допустимые значения: от 0 до 255 Пример: 5 58 Формат хранения в оперативной памяти: 1 байт без знака Допустимые значения: от 0 до Пример: Формат хранения в оперативной памяти: 2 байта без знака

© С.В.Кухта, 2009 Целые беззнаковые числа Беззнаковые данные – не могут быть отрицательными. Байт (символ) память: 1 байт = 8 бит диапазон значений 0…255, 0…FF 16 = Паскаль: byte биты младший старший старший полубайт старшая цифра младший полубайт младшая цифра 4 16 E = 4E 16

© С.В.Кухта, 2009 Целые беззнаковые числа Целое без знака память: 2 байта = 16 бит диапазон значений 0…65535, 0…FFFF 16 = Паскаль: word биты старший байтмладший байт 4D 16 7A = 4D7A 16

© С.В.Кухта, Целочисленные типы данных Целочисленный тип данных SHORTINT Целочисленный тип данных INTEGER Допустимые значения: от – 128 до 127 Пример: Формат хранения в оперативной памяти: 1 байт со знаком Допустимые значения: от –32768 до Пример: 5 – –32768 Формат хранения в оперативной памяти: 2 байта со знаком

© С.В.Кухта, Целочисленные типы данных Целочисленный тип данных LONGINT Допустимые значения: от – до Пример: 5 – Формат хранения в оперативной памяти: 4 байта со знаком

© С.В.Кухта, 2009 «-1» – это такое число, которое при сложении с 1 даст 0. 1 байт: FF = байта:FFFF = байта:FFFFFFFF = Целые числа со знаком Сколько места требуется для хранения знака? ? Старший (знаковый) бит числа определяет его знак. Если он равен 0, число положительное, если 1, то отрицательное. не помещается в 1 байт!

© С.В.Кухта, 2009 Двоичный дополнительный код Задача: представить отрицательное число (–a) в двоичном дополнительном коде. Решение: 1. Перевести число a–1 в двоичную систему. 2. Записать результат в разрядную сетку с нужным числом разрядов. 3. Заменить все «0» на «1» и наоборот (инверсия). Пример: (– a) = – 78, сетка 8 бит 1. a – 1 = 77 = = – 78 знаковый бит

© С.В.Кухта, 2009 Целые числа со знаком Байт (символ) со знаком память: 1 байт = 8 бит диапазон значений: max min – 128 = – 2 7 … 127 = 2 8 – 1 Паскаль: shortint можно работать с отрицательными числами уменьшился диапазон положительных чисел 127 – 128

© С.В.Кухта, 2009 Целые числа со знаком Слово со знаком память: 2 байта = 16 бит диапазон значений – … Паскаль: integer Двойное слово со знаком память – 4 байта диапазон значений – 2 31 … Паскаль: longint

© С.В.Кухта, 2009 Ошибки Переполнение разрядной сетки: в результате сложения больших положительных чисел получается отрицательное (перенос в знаковый бит) – 128

© С.В.Кухта, 2009 Ошибки Перенос: при сложении больших (по модулю) отрицательных чисел получается положительное (перенос за границы разрядной сетки) – в специальный бит переноса

© С.В.Кухта, Над целочисленными операндами выполняются арифметические операции, операции отношения. Целочисленные типы данных Арифметические операции + сложение, – вычитание, * умножение, MOD и DIV целочисленное деление: MOD – остаток от деления операндов DIV – целая часть частного. Результат выполнения операции является величиной целого типа. 21 Div 4 = 5 21 MOD 5 = 1 4 DIV 8 = 0 4 mod 8 = 4 (-2 mod 5)= Div 4 = 5 21 MOD 5 = 1 4 DIV 8 = 0 4 mod 8 = 4 (-2 mod 5)= -2

© С.В.Кухта, Целочисленные типы данных Операции отношения (сравнения) = равенство, неравенство, больше, = больше или равно Результат выполнения операции является величиной логического типа (True или False).

© С.В.Кухта, Вещественные типы определяют константы, переменные и функции, значения которых реализуются множеством действительных (вещественных) чисел. Вещественные типы данных Вещественный тип данных REAL Вещественный тип данных SINGLE Допустимые значения: от 2.9e–39 до 1.7e+38 Пример: e–3 1.76e Формат хранения в оперативной памяти: 6 байт, в том числе 11 цифр для мантиссы Допустимые значения: от 1.5e–45 до 3.4e+38 Формат хранения в оперативной памяти: 4 байта, в том числе 7 цифр для мантиссы

© С.В.Кухта, Вещественные типы данных Вещественный тип данных DOUBLE Вещественный тип данных EXTENDED Допустимые значения: от 5.0e–324 до 1.7e+308 Формат хранения в оперативной памяти: 8 байт, в том числе 15 цифр для мантиссы Допустимые значения: от 3.4e–4932 до 1.1e+4932 Формат хранения в оперативной памяти: 10 байт, в том числе 19 цифр для мантиссы Вещественный тип данных COMP Допустимые значения: от –9.2e+18 до 9.2e+18 Формат хранения в оперативной памяти: 8 байт, в том числе 19 цифр для мантиссы

© С.В.Кухта, 2009 Нормализация двоичных чисел X = s M 2 e s – знак (1 или -1) M – мантисса, e – порядок M = 0 или 1 M < 2 15,625 = 1111,101 2 = 1 1, знак порядок мантисса Пример:

© С.В.Кухта, 2009 Нормализованные числа в памяти IEEE Standard for Binary Floating-Point Arithmetic (IEEE 754) 15,625 = 1 1, s = 1 e = 3 M = 1, pm Знаковый бит: 0, если s = 1 1, если s = – 1 Знаковый бит: 0, если s = 1 1, если s = – 1 Порядок со сдвигом: p = e + E (сдвиг) Порядок со сдвигом: p = e + E (сдвиг) Дробная часть мантиссы: m = M – 1 Дробная часть мантиссы: m = M – 1 Целая часть M всегда 1, поэтому не хранится в памяти! ?

© С.В.Кухта, 2009 Вещественные числа в памяти 15,625 = 1, байта = 32 бита p = e+127 = 130 = m = M – 1 = 0,

© С.В.Кухта, Над вещественными операндами выполняются арифметические операции, операции отношения. Вещественные типы данных Арифметические операции + сложение, – вычитание, * умножение, / деление. Результат выполнения операции является величиной вещественного типа –10/ *(–10.1E2) 21.2/(11.21E–2) –10/ *(–10.1E2) 21.2/(11.21E–2)

© С.В.Кухта, Операции отношения (сравнения) = равенство, неравенство, больше, = больше или равно Результат выполнения операции является величиной логического типа (True или False). Вещественные типы данных

© С.В.Кухта, Данные, которые могут принимать логические значения True и False. Логический тип данных BOOLEAN Логические операции Not – логическое отрицание And – логическое И (конъюнкция) Or – логическое ИЛИ (дизъюнкция) Xor – логическое исключающее ИЛИ Таблицы истинности для операций: АВNot АА And ВА Or ВА Xor В False TrueFalse TrueFalseTrue False True False

© С.В.Кухта, Операции отношения (сравнения) Логический тип определен таким образом, что True < False. Это позволяет применять к булевским операндам все операции сравнения: = равенство, неравенство, больше, = больше или равно Логический тип данных BOOLEAN

© С.В.Кухта, Типы данных: символы Символьный тип данных CHAR Допустимые значения: один символ из кодовой таблицы (256 символов кода ASCII) Пример: Y f 4 я Д * Формат хранения в оперативной памяти: 1 байт Применимы все операции отношения, функции преобразования типов Ord() и Chr(), функции, которые определяют предыдущий и последующий символы Pred() и Succ().

© С.В.Кухта, Типы данных: символы Строковый тип данных STRING Строка типа String – это цепочка символов типа Char. String используется для хранения текстовых сообщений. Допустимые значения: любой текст длинной не более 255 символов Пример: Всё, что вы хотите написать! Формат хранения в оперативной памяти: 1 байт на каждый символ строки + 1 байт под длину строки

© С.В.Кухта, Кодирование символов Текстовый файл на экране (символы) в памяти – двоичные коды В файле хранятся не изображения символов, а их числовые коды в двоичной системе! !

© С.В.Кухта, Кодирование символов 1. Сколько символов надо использовать одновременно? или (UNICODE) 2. Сколько места надо выделить на символ: 3. Выбрать 256 любых символов (или 65536) - алфавит. 4. Каждому символу – уникальный код (или ). Таблица символов: 5. Коды – в двоичную систему = бит на символ …ABCD… коды

© С.В.Кухта, Кодировка 1 байт на символ таблица ASCII (международная) кодовая страница ASCII = American Standard Code for Information Interchange 0-31 управляющие символы: 7 – звонок, 10 – новая строка, 13 – возврат каретки, 27 – Esc. 32 пробел знаки препинания:., : ; ! ? специальные знаки: + - * / () {} [] цифры заглавные латинские буквы A-Z строчные латинские буквы a-z Кодовая страница (расширенная таблица ASCII) для русского языка: CP-866 для системы MS DOS CP-1251 для системы Windows (Интернет) КОИ8-R для системы UNIX (Интернет)

© С.В.Кухта, Типы данных, определяемые программистом Интервальный тип данных Позволяет задавать две константы, определяющие границы диапазона значений для данной переменной. Обе константы должны принадлежать одному из стандартных типов (тип real здесь недопустим). Значение первой константы должно быть обязательно меньше второй. Type =.. ; Type =.. ; Формат описания типа: Type Dni = 1..31; Например:

© С.В.Кухта, Типы данных, определяемые программистом Перечисляемый тип данных Определение перечисляемого типа задает упорядоченное множество значений путем перечисления имен, обозначающих эти значения. Type = (,, …, ); Type = (,, …, ); Формат описания типа: Type Weekday = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); Colour = (Red, Orange, Yellow, Green, Blue, Black); Operation = (Plus, Minus, Times, Divide); Type Weekday = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); Colour = (Red, Orange, Yellow, Green, Blue, Black); Operation = (Plus, Minus, Times, Divide); Например:

© С.В.Кухта, Среди базовых типов данных особо выделяются порядковые типы. Такое название можно обосновать двояко: 1)Каждому элементу порядкового типа может быть сопоставлен уникальный (порядковый) номер. Нумерация значений начинается с нуля. Исключение - типы данных shortint, integer и longint. Их нумерация совпадает со значениями элементов. 2)Кроме того, на элементах любого порядкового типа определен порядок (в математическом смысле этого слова), который напрямую зависит от нумерации. Таким образом, для любых двух элементов порядкового типа можно точно сказать, который из них меньше, а который - больше. Порядковые типы данных

© С.В.Кухта, Только для величин порядковых типов определены следующие стандартные функции и процедуры: 1)Функция ord(x) возвращает порядковый номер значения переменной x (относительно того типа, к которому принадлежит переменная х). 2)Функция pred(x) возвращает значение, предшествующее х (к первому элементу типа неприменима). 3)Функция succ(x) возвращает значение, следующее за х (к последнему элементу типа неприменима). 4)Процедура inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1). Порядковые типы данных

© С.В.Кухта, )Процедура inc(x, k) возвращает k-е значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+k). 6)Процедура dec(x) возвращает значение, предшествующее х (для арифметических типов данных это эквивалентно оператору x:=x-1). 7)Процедура dec(x, k) возвращает k-e значение, предшествующее х (для арифметических типов данных это эквивалентно оператору x:=x-k). Порядковые типы данных

© С.В.Кухта, На первый взгляд кажется, будто результат применения процедуры inc(x) полностью совпадает с результатом применения функции succ(x). Однако разница между ними проявляется на границах допустимого диапазона. Функция succ(x) неприменима к максимальному элементу типа, а вот процедура inc(x) не выдаст никакой ошибки, но, действуя по правилам машинного сложения, прибавит очередную единицу к номеру элемента. Номер, конечно же, выйдет за пределы диапазона и за счет усечения превратится в номер минимального значения диапазона. Получается, что процедуры inc() и dec() воспринимают любой порядковый тип словно бы "замкнутым в кольцо": сразу после последнего вновь идет первое значение. Порядковые типы данных

© С.В.Кухта, Поясним все сказанное на примере. Для типа данных type sixteen = 0..15; попытка прибавить 1 к числу 15 приведет к следующему результату: Начальная единица будет отсечена, и потому получится, что inc(15)=0. Аналогичная ситуация на нижней границе допустимого диапазона произвольного порядкового типа данных наблюдается для процедуры dec(x) и функции pred(x): dec(min_element)= max_element Порядковые типы данных

© С.В.Кухта, Опишем теперь порядковые типы данных более подробно. 1)Логический тип boolean имеет два значения: false и true, и для них выполняются следующие равенства: ord(false)=0, ord(true)=1, false

© С.В.Кухта, )Перечисляемые типы данных задаются в разделе type явным перечислением их элементов. Например: type week =(sun,mon,tue,wed,thu,fri,sat) Для этого типа данных: inc(sat) = sun, dec(sun) = sat. 5)Интервальные типы данных задаются только границами своего диапазона. Например: type month = 1..12; budni = mon..fri; Типы данных, относящиеся к порядковым

© С.В.Кухта, )Программист может создавать и собственные типы данных, являющиеся комбинацией нескольких стандартных типов. Например: type valid_for_identifiers= 'a'..'z','A'..'Z','_','0'..'9'; Этот тип состоит из объединения нескольких интервалов, причем в данном случае изменен порядок латинских букв: если в стандартном типе char 'A' < 'a', то здесь наоборот - 'a' < 'A'. Для величин этого типа выполняются следующие равенства: inc('z')='A'; dec('0')='_', pred('9')='8'; ord('b')= 2. Типы данных, относящиеся к порядковым

© С.В.Кухта, Стандартные функции

© С.В.Кухта, Арифметические функции Функция НазначениеТип аргумента Тип результата ABS(X) Абсолютное значение (модуль) аргумента целый вещественный целый вещественный ARCTAN(X) Арктангенс аргумента целый вещественный COS(X) Косинус аргумента целый вещественный EXP(X) Экспонента аргумента целый вещественный FRAC(X) Дробная часть числа вещественный INT(X) Целая часть числа вещественный LN(X) Натуральный логарифм целый вещественный PI Значение величины = вещественный SIN(X) Синус аргумента целый вещественный SQR(X) Квадрат аргумента вещественный SQRT(X) Квадратный корень аргумента целый вещественный

© С.В.Кухта, Эти функции предназначены для преобразования типов величин, например, символа в целое число, вещественного числа в целое и т.д. Chr(X) – преобразование ASCII-кода в символ. Аргумент функции – целого типа от 0 до 255. Результатом – символ, соответствующий данному коду. High(X) – получение максимального значения величины. Аргумент функции – параметр или идентификатор порядкового типа, типа- массива, типа-строки. Результат функции для величины порядкового типа – максимальное значение этой величины, типа-массива – максимальное значение индекса, типа-строки – объявленный размер строки. Low(X) – получение минимального значения величины. Аргумент функции и результат функции аналогичны High(X). Функции преобразования типов

© С.В.Кухта, Ord(X) – преобразование любого порядкового типа в целый тип. Аргумент функции – логический, символьный, перечисляемый тип. Результат – величина типа Longint. Round(X) – округление вещественного числа до ближайшего целого. Результат – округленная до ближайшего целого величина типа Longint. Trunc(X) – получение целой части вещественного числа. Результат – целая часть этого числа типа Longint. Функции преобразования типов

© С.В.Кухта, Примеры арифметических функций sin(x) cos(x) arctan(x) Аргумент x для тригонометрических функций указывается в радианах. ! a:=Pi/180*30; s:=sin(a); c:=cos(a); t:=s/c; ct:=c/s; a:=Pi/180*30; s:=sin(a); c:=cos(a); t:=s/c; ct:=c/s; синус, косинус, тангенс и котангенс угла 30

© С.В.Кухта, Примеры арифметических функций exp(x) ln(x) Exp(b*Ln(a)) Вычислять a b таким образом можно только для положительных значений a. Алгоритм вычисления a b для любых значений a будет разобран позднее. ! e x (экспонента числа, e ) ln x (натуральный логарифм) ln x (натуральный логарифм) abab abab exp(7*ln(x-3)) (x-3) 7 exp(x*ln(2)) 2 x2 x 2 x2 x

© С.В.Кухта, Примеры арифметических функций Round(x) Trunc(x) Перевод дробного числа в целое с округлением Перевод дробного числа в целое с округлением Перевод дробного числа в целое с отбрасыванием дробной части a1:=Round(2.34); a1 = 2 a2:=Trunc(2.34); a2 = 2 b1:=Round(8.51); b1 = 9 b2:=Trunc(8.51); b2 = 8 c1:=Round(-3.7); c1 = -4

© С.В.Кухта, Примеры арифметических функций Вычисляемая функция Математическая запись Запись на языке Паскаль Exp(y*ln(x)) Exp(1/y*ln(x)) arctan(x/sqrt(1-x*x)) arctan(sqrt(1-x*x)/x) Ln(x)/Ln(y) Sin(x)/Cos(x)

© С.В.Кухта, Randomize – стандартная процедура установки датчика случайных чисел в исходное состояние. Random – стандартная функция формирования случайного дробного числа из диапазона от 0 до 1. Random(N) – стандартная функция формирования случайного целого числа из диапазона от 0 до N-1. Генераторы случайных чисел

© С.В.Кухта, Примеры получения случайных числе a:=Random; 0

© С.В.Кухта, Арифметические выражения

© С.В.Кухта, Все арифметические операции можно сочетать друг с другом - с учетом допустимых для их операндов типов данных. В роли операндов любой операции могут выступать переменные, константы, вызовы функций или выражения, построенные на основе других операций. Все вместе и называется выражением.

© С.В.Кухта, Примеры арифметических выражений (x 0) z shl abs(k) выражение, результат которого принадлежит к типу boolean вторым операндом является вызов стандартной функции (x mod k) + min(a,b) + trunc(z) сочетание арифметических операций и вызовов функций odd(round(x/abs(x))) "многоэтажное" выражение sin(-x*x-1/(1+x))*(koef[1]*koef[1]-4*koef[2]); "многоэтажное" выражение с использованием массива

© С.В.Кухта, Порядок вычислений 1. Если в выражении расставлены скобки, то чем меньше глубина вложенности скобок, тем позже вычисляется заключенная в них операция. 2. Если же скобок нет, то сначала вычисляются значения операций с более высоким приоритетом, затем – с менее высоким. 3. Несколько подряд идущих операций одного приоритета вычисляются в последовательности "слева направо". 4. Вызов любой функции имеет более высокий приоритет, чем все внешние относительно этого вызова операции. Выражения, являющиеся аргументами вызываемой функции, вычисляются в момент вызова. !

© С.В.Кухта, Приоритеты всех операций языка Паскаль Операции Приоритет Унарные операции +, -, ^, # Первый (высший) Операции, эквивалентные умножению *, /, div, mod, and, shl, shr Второй Операции, эквивалентные сложению +, -, or, xor Третий Операции сравнения =, , >, =, in Четвертый

© С.В.Кухта, Примеры выражений для целых чисел с указанием последовательности вычислений a + b * c / d a * not b or c * d = 0 результат принадлежит к вещественному типу данных результат принадлежит к логическому типу данных min(a + b, 0) * (a + 1) результат принадлежит к целочисленному типу данных

© С.В.Кухта, В общем случае при выполнении арифметических (и любых других) операций компилятору требуется, чтобы типы операндов совпадали: нельзя, например, сложить массив и множество, нельзя передать вещественное число функции, ожидающей целый аргумент, и т.п. В то же время, любая процедура или функция, написанная в расчете на вещественные значения, сможет работать и с целыми числами. Правила, по которым различные типы данных считаются взаимозаменяемыми, приведены ниже. Совместимость типов данных

© С.В.Кухта, Эквивалентность - это наиболее высокий уровень соответствия типов. Она требуется при действиях с указателями ( см. Тему далее ), а также при вызовах подпрограмм. "А как же тогда быть с оговоркой, сделанной двумя абзацами выше?" - спросите вы. Мы не станем сейчас описывать механизм передачи аргументов процедурам и функциям, поясним лишь, что эквивалентность типов требуется только для параметров-переменных ( см. Тему далее ). Эквивалентность

© С.В.Кухта, Итак, два типа - Т1 и Т2 - будут эквивалентными, если верен хотя бы один вариант из перечисленных ниже: Т1 и Т2 совпадают; Т1 и Т2 определены в одном объявлении типа; Т1 эквивалентен некоторому типу Т3, который эквивалентен типу Т2. Эквивалентность

© С.В.Кухта, Пример. Эквивалентность Здесь эквивалентными будут Т1 и Т2; Т1 и Т3; Т1 и Т4; Т1 и Т5; Т4 и Т5. А вот Т2 и Т3 - не эквивалентны! type T2 = T1; T3 = T1; T4, T5 = T2; type T2 = T1; T3 = T1; T4, T5 = T2;

© С.В.Кухта, Итак, два типа - Т1 и Т2 - будут эквивалентными, если верен хотя бы один вариант из перечисленных ниже: Т1 и Т2 совпадают; Т1 и Т2 определены в одном объявлении типа; Т1 эквивалентен некоторому типу Т3, который эквивалентен типу Т2.

© С.В.Кухта, Совместимость типов требуется при конструировании выражений, а также при вызовах подпрограмм (для параметров-значений). Совместимость означает, что для переменных этих типов возможна операция присваивания - хотя во время этой операции присваиваемое значение может измениться: произойдет неявное приведение типов данных (см. п. "Приведение типов данных" ниже). Совместимость

© С.В.Кухта, Два типа Т1 и Т2 будут совместимыми, если верен хотя бы один вариант из перечисленных ниже: Т1 и Т2 эквивалентны (в том числе совпадают); Т1 и Т2 - оба целочисленные или оба вещественные; Т1 и Т2 являются подмножествами одного типа; Т1 является некоторым подмножеством Т2; Т1 - строка, а Т2 - символ ( см. Тему далее ); Т1 - это тип pointer, а Т2 - типизированный указатель ( см. Тему далее ); Т1 и Т2 - оба процедурные, с одинаковым количеством попарно эквивалентных параметров, а для функций - с эквивалентными типами результатов ( см. Тему далее ). Совместимость

© С.В.Кухта, В отличие от простой совместимости, совместимость по присваиванию гарантирует, что в тех случаях, когда производится какое-либо присваивание (используется запись вида a:=b; или происходит передача значений в подпрограмму или из нее и т.п.), не произойдет никаких изменений присваиваемого значения. Два типа данных Т1 и Т2 называются совместимыми по присваиванию, если выполняется хотя бы один вариант из перечисленных ниже: Т1 и Т2 эквивалентны, но не файлы; Т1 и Т2 совместимы, причем Т2 – некоторое подмножество в Т1; Т1 – вещественный тип, а Т2 – целый. Совместимость по присваиванию

© С.В.Кухта, Как мы упомянули в п. "Арифметические операции" выше, тип результата арифметических операций (а следовательно, и выражений) может отличаться от типов исходных операндов. Например, при "дробном" делении ( / ) одного целого числа на другое целое в ответе все равно получается вещественное. Такое изменение типа данных называется неявным приведением типов. Если в некоторой операции присваивания участвуют два типа данных совместимых, но не совместимых по присваиванию, то тип присваиваемого выражения автоматически заменяется на подходящий. Это тоже неявное приведение. Причем в этих случаях могут возникать изменения значений. Неявное приведение типов данных

© С.В.Кухта, Т.е., если выполнить такую последовательность операторов Неявное приведение типов данных a:= 10;{a: byte} a:= -a; writeln(a); a:= 10;{a: byte} a:= -a; writeln(a); то на экране мы увидим не -10, а 246 (246 = ). Неявным образом осуществляется и приведение при несоответствии типов переменной-счетчика и границ в циклах for (см. след. Тему).

© С.В.Кухта, Неявное приведение типов данных можно отключить, если указать директиву компилятора {$R+}, которая принуждает компилятор всегда проверять границы и диапазоны. Если эта директива включена, то во всех ситуациях, в которых по умолчанию достаточно совместимости типов данных, будет необходима их эквивалентность. По умолчанию такая проверка отключена, поэтому во всем дальнейшем изложении (если, конечно, явно не оговорено противное) будем считать, что эта директива находится в выключенном состоянии {$R-}. Неявное приведение типов данных

© С.В.Кухта, Тип значения можно изменить и явным способом: просто указав новый тип выражения, например: a:= byte(b). В этом случае переменной а будет присвоено значение, полученное новой интерпретацией значения переменной b. Т.е., если b имеет тип shortint и значение -23, то в a запишется 233 (= ). Явное приведение типов данных

© С.В.Кухта, Приводить явным образом можно и типы, различающиеся по длине. Тогда значение может измениться в соответствии с новым типом. Т.е., если преобразовать тип longint в тип integer, то возможны потери из-за отсечения первых двух байтов исходного числа. Например, результатом попытки преобразовать число к типу integer станет число , а к типу word - число Явное приведение типов данных

© С.В.Кухта, В заключение приведем список стандартных функций, аргумент и результат которых принадлежат к совершенно различным типам данных: trunc: real integer; round: real integer; val: string byte / integer / real; chr: byte char; ord: longint; Функции, изменяющие тип данных

© С.В.Кухта, Пример. Присвоить целой переменной d первую цифру из дробной части положительного вещественного числа x. Например, если x=32,597, то d=5. Функции, изменяющие тип данных d:= trunc(x*10) mod 10; Решение. 1-й способ. Решение этой задачи можно получить, если умножить заданное число на 10. В этом случае задача сведется к выделению последней цифры полученного произведения. Нужно еще учесть, что операция mod применима к целому числу, поэтому произведение нужно преобразовать к целому виду, например, отбросив дробную часть. Получаем оператор, решающий задачу:

© С.В.Кухта, Функции, изменяющие тип данных varx: real; { заданное число } d, cod: integer; { первая цифра дробной части заданного числа } s: string; { число, представленное в виде строки символов } begin str(x, s); { преобразовали число в строку '32.597' } Val(copy(s, pos('.', s) + 1, 1), d, cod) { выделили нужную цифру } end. varx: real; { заданное число } d, cod: integer; { первая цифра дробной части заданного числа } s: string; { число, представленное в виде строки символов } begin str(x, s); { преобразовали число в строку '32.597' } Val(copy(s, pos('.', s) + 1, 1), d, cod) { выделили нужную цифру } end. 2-й способ. Возможно решение с помощью преобразования числа в строку символов (будет рассмотрено в Теме 5). В этом случае в строке нужно найти позицию точки и выделить следующую за ней цифру. Получаем такой фрагмент:

© С.В.Кухта, Простейшие операторы

© С.В.Кухта, Оператор языка Паскаль – это неделимый элемент программы, который позволяет выполнять определенные алгоритмические действия. Если говорить строго, то оператором называется (минимальная) структурно законченная единица программы. Все операторы должны заканчиваться знаком ";" (точка с запятой), и ни один оператор не может разрываться этим знаком. Единственная возможность не ставить после оператора ";" появляется в том случае, когда сразу за этим оператором следует ключевое слово end. !

© С.В.Кухта, Простейшие операторы языка a:= b; - присваивание переменной а значения переменной b. В правой части присваивания может находиться переменная, константа, арифметическое выражение или вызов функции. ; - пустой оператор, который можно вставлять куда угодно, а также вычеркивать откуда угодно, поскольку на целостность программы это никак не влияет. Операторные скобки, превращающие несколько операторов в один: begin end;

© С.В.Кухта, Простейшие операторы языка Оператор безусловного перехода ( GoTo ). Операторы вызова подпрограммы (например, Abs, Write, ReadLn ).

© С.В.Кухта, Составные операторы языка Составной оператор – это последовательность операторов, заключенных в операторные скобки Begin и End. Условные операторы ( If, Case ). Операторы цикла ( Repeat, While, For ). Оператор присоединения ( With ).

© С.В.Кухта, Как изменить значение переменной? Оператор присваивания служит для изменения значения переменной. program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); end. program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); end. a ? 5 5 b ? a 5 7*4 28 Пример:

© С.В.Кухта, Оператор присваивания Арифметическое выражение может включать константы имена переменных знаки арифметических операций: + - * / div mod вызовы функций круглые скобки ( ) умножение деление деление нацело остаток от деления := ;

© С.В.Кухта, Имя слева от символа присваивания := является именем переменной, которой присваивается значение выражения, стоящего справа. С помощью этого оператора осуществляется преобразование информации. Он предназначен для вычисления нового значения некоторой переменной, а также для определения значения, возвращаемого функцией. Оператор присваивания Тип выражения в правой части оператора присваивания должен совпадать или быть совместимым с типом переменной из левой части. Компилятор на этапе синтаксического анализа программы осуществляет эту проверку - так называемый контроль типов. !

© С.В.Кухта, Примеры операторов присваивания Root1 := Pi*(x - y); Discriminant := Sqrt(b*b-4*a*c)/2/A; Index := Index + 1; Letter := Succ(Succ(Letter)); F:= sin(-x*x-1/(1+x)); R:=(r1 + r2)/(r1*r2); D:=((a = b) AND (c = d)) OR (a > d); Root1 := Pi*(x - y); Discriminant := Sqrt(b*b-4*a*c)/2/A; Index := Index + 1; Letter := Succ(Succ(Letter)); F:= sin(-x*x-1/(1+x)); R:=(r1 + r2)/(r1*r2); D:=((a = b) AND (c = d)) OR (a > d);

© С.В.Кухта, program qq; var a, b: integer; x, y: real; begin a := 5; 10 := x; y := 7,8; b := 2.5; x := 2*(a + y); a := b + x; end. program qq; var a, b: integer; x, y: real; begin a := 5; 10 := x; y := 7,8; b := 2.5; x := 2*(a + y); a := b + x; end. Какие операторы неправильные? имя переменной должно быть слева от знака := целая и дробная часть отделяются точкой нельзя записывать вещественное значение в целую переменную

© С.В.Кухта, Ручная прокрутка программы program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); b := a div 5; a := a mod b; a := a + 1; b := (a + 14) mod 7; end. program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); b := a div 5; a := a mod b; a := a + 1; b := (a + 14) mod 7; end. ab ??

© С.В.Кухта, Порядок выполнения операций вычисление выражений в скобках умножение, деление, div, mod слева направо сложение и вычитание слева направо z := (5*a*c+3*(c-d))/a*(b-c)/ b; x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));

© С.В.Кухта, Ввод и вывод данных

© С.В.Кухта, Как мы уже говорили, любой алгоритм должен быть результативным. В общем случае это означает, что он должен сообщать результат своей работы потребителю: пользователю-человеку или другой программе (например, программе управления принтером). Мы не будем описывать здесь внутренние автоматические процессы, использующие сигналы непрерывно функционирующих программ, а сосредоточим внимание на взаимодействии программы и человека, т.е. на процессах ввода информации с клавиатуры и вывода ее на экран. В программировании существует специальное понятие консоль, которое обозначает клавиатуру при вводе и монитор при выводе. Ввод и вывод: консоль

© С.В.Кухта, Для того чтобы получить данные, вводимые пользователем вручную (т.е. с консоли), применяются команды Ввод с консоли read ( ) readln ( ) Первая из этих команд считывает все предложенные ей данные, оставляя курсор в конце последней строки ввода, а вторая - сразу после окончания ввода переводит курсор на начало следующей строки. В остальном же их действия полностью совпадают.

© С.В.Кухта, Например, при помощи команды Ввод с консоли Список ввода - это последовательность имен переменных, разделенных запятыми. программа может получить с клавиатуры данные сразу для четырех переменных, относящихся к различным типам данных. readln(k, x, c, s); {k:byte; x:real; c:char; s:string} readln(k, x, c, s); {k:byte; x:real; c:char; s:string}

© С.В.Кухта, Вводимые значения необходимо разделять пробелами, а завершать ввод - нажатием клавиши Enter. Ввод данных заканчивается в тот момент, когда последняя переменная из списка ввода получила свое значение. Следовательно, вводя данные при помощи приведенной на слайде выше команды, вы можете нажать Enter четыре раза - после каждой из вводимых переменных, - либо же только один раз, предварительно введя все четыре переменные в одну строчку (обязательно нужно разделить их пробелами). Ввод с консоли

© С.В.Кухта, При вводе исходных данных происходит преобразование из внешней формы представления во внутреннюю, определяемую типом переменных. Типы вводимых значений должны совпадать с типами указанных переменных, иначе возникает ошибка. Поэтому нужно внимательно следить за правильностью вводимых данных. Вообще, вводить с клавиатуры можно только данные базовых типов: целого, вещественного, символьного (за исключением логического). Ввод с консоли

© С.В.Кухта, Если же программе все-таки необходимо получить с консоли значение для boolean-величины, придется действовать более хитро: вводить оговоренный символ, а уже на его основе присваивать логической переменной соответствующее значение. Например: Ввод с консоли repeat writeln('Согласны ли Вы с этим утверждением?'); writeln('y - да, n - нет'); readln(c);{c:char} case c of 'y': b:= true; 'n': b:= false; else: writeln('Ошибка!'); end; until (c='n') or (c='y'); repeat writeln('Согласны ли Вы с этим утверждением?'); writeln('y - да, n - нет'); readln(c);{c:char} case c of 'y': b:= true; 'n': b:= false; else: writeln('Ошибка!'); end; until (c='n') or (c='y');

© С.В.Кухта, Второе исключение: строки, хотя они и не являются базовым типом, вводить тоже разрешается. Признаком окончания ввода строки является нажатие клавиши Enter, поэтому все следующие за нею переменные необходимо вводить с новой строчки. Ввод с консоли

© С.В.Кухта, Сделаем одно важное замечание: ожидая от человека ввода с клавиатуры, не нужно полагать, что он окажется ясновидящим и просто по мерцанию курсора на черном экране догадается, какого типа переменная нужна ожидающей программе. Вывод на консоль Старайтесь всегда придерживаться правила: "лысый" ввод недопустим! Перед тем как считывать что-либо с консоли, необходимо сообщить пользователю, что именно он должен ввести: смысл вводимой информации, тип данных, максимальное и минимальное допустимые значения и т.п. !

© С.В.Кухта, Примером неплохого приглашения служит, скажем, такая строчка: Введите два вещественных числа (0.1

© С.В.Кухта, Для того чтобы вывести на экран какое-либо сообщение, воспользуйтесь процедурами write( ) Первая из них, напечатав на экране все, о чем ее просили, оставит курсор в конце выведенной строки, а вторая переведет его в начало следующей строчки. Вывод на консоль writeln( )

© С.В.Кухта, Список вывода может состоять из нескольких переменных или констант, записанных через запятую; все эти переменные должны иметь тип либо базовый, либо строчный. Например: writeln(a, b, c); Вывод на консоль Переменные, составляющие список вывода, могут относиться к целому, вещественному, символьному или булевскому типам. В качестве элемента списка вывода кроме имен переменных могут использоваться выражения и строки. Оператор Writеln без параметров реализует пропуск строки и переход к началу следующей строки.

© С.В.Кухта, Если для вывода информации воспользоваться командой, приведенной в конце предыдущего слайда, то выводимые символы окажутся "слепленными". Чтобы этого не случилось, нужно либо позаботиться о пробелах между выводимыми переменными: Форматированный вывод writeln(a, ' ', b, ' ', c); Но предпочтительнее задать для всех (или хотя бы для некоторых) переменных формат вывода: writeln(a:5, b, c:20:5); количество позиций, выделяемых под дробную часть числа количество позиций, выделяемых под всю переменную

© С.В.Кухта, Если число длиннее, чем отведенное под него пространство, количество позиций будет автоматически увеличено. Если же выводимое число короче заданного формата, то спереди к нему припишутся несколько пробелов. Таким образом можно производить вывод красивыми ровными столбиками, а также следить за тем, чтобы переменные не сливались. Форматированный вывод

© С.В.Кухта, Например, если a = 25, b = 'x', а c = 10.5, то после выполнения команды _ _ _25_x_ _ Форматированный вывод writeln(a:5, ' ', b, c:20:5); на экране или в файле будет записано следующее: Особенно важен формат при выводе вещественных переменных. К примеру, если не указать формат, то число 10.5 будет выведено как Е Такой формат называется записью с плавающей точкой.

© С.В.Кухта, Если же задать только общую длину вещественного числа, не указывая длину дробной части, то оно будет занимать на экране заданное количество символов (в случае надобности, спереди будет добавлено соответствующее количество пробелов), но при этом останется в формате плавающей точки. Минимальной длиной для вывода вещественных чисел является 10 (при формате _x.xE+yyyy). Первая позиция зарезервирована под знак "-". Форматированный вывод

© С.В.Кухта, Примеры форматированного вывода Вывод десятичного представления величины J, начиная с позиции расположения курсора. Для целочисленного выражения Оператор вывода Значение переменной Результат Write(J); 236 Write(J, J+1, J+2); Вывод десятичного представления величины J в крайние правые позиции поля заданной шириной. Оператор вывода Значение переменной Результат Write(J:6); 236___236 Write(J:10); 1_________1 Write(J+J:7); 236____472

© С.В.Кухта, Примеры форматированного вывода Вывод в поле шириной 18 символов (по умолчанию) десятичного представления величины R в формате с плавающей точкой. Для вещественного выражения Оператор вывода Значение переменной Результат Write (R); __ E+02 Write (R); E+01_ E+01 Write (R/2); __ E+02

© С.В.Кухта, Примеры форматированного вывода Вывод десятичного представления величины R в формате с плавающей точкой в крайние правые позиции поля заданной шириной. Для вещественного выражения Оператор вывода Значение переменной Результат Write(R:15); E+02 Write(R:15); E+02 Write(-R:12); E+01

© С.В.Кухта, Примеры форматированного вывода Вывод десятичного представления величины R в формате с фиксированной точкой в крайние правые позиции поля заданной шириной. Причем, после десятичной точки выводится заданное количество цифр (не более 24-х), представляющих дробную часть числа; если их количество равно 0, ни дробная часть, ни десятичная точка не выводятся. Для вещественного выражения Оператор вывода Значение переменной Результат Write(R:8:4); Write(R:7:2); _ Write(R:9:4); _

© С.В.Кухта, Примеры форматированного вывода Вывод символа Ch, начиная с позиции расположения курсора. Для выражения символьного типа Вывод символа Ch в крайнюю правую позицию поля заданной ширины. Оператор вывода Значение переменной Результат Write(Ch); XX Write(Ch, Ch, Ch); !!!! Оператор вывода Значение переменной Результат Write(Ch:5); X____X Write(Ch:2, Ch:4); !_!___!

© С.В.Кухта, Примеры форматированного вывода Вывод строки S, начиная с позиции расположения курсора. Для выражения строкового типа Вывод символа S в крайние правые позиции поля заданной ширины. Оператор вывода Значение переменной Результат Write(S); Иванов Write(S); Ведомость 2 Write(S, S); ZZXXXZZXXXZZXXX Оператор вывода Значение переменной Результат Write(S:10); Иванов____Иванов Write(S:14); Ведомость 2_Ведомость 2 Write(S:6, S:6); ZZXXX_ZZXXX_ZZXXX

© С.В.Кухта, Примеры форматированного вывода Вывод результата выражения B (True или False), начиная с позиции расположения курсора. Для выражения логического типа Вывод результата выражения B (True или False) в крайние правые позицию поля заданной ширины. Оператор вывода Значение переменной Результат Write(B); True Write(B); False Write(B, not B); TrueTrueFalse Оператор вывода Значение переменной Результат Write(B:6); True__True Write(B:10); False_____False Write(B:5, not B:8); True_True___False

© С.В.Кухта, Например (подчеркивание служит для визуализации пробела): Форматированный вывод В случае недостаточной длины вывода число будет автоматически округлено. ! Оператор форматного вывода Результат вывода на экран write ( :10); _1.3E+0002 write ( :11); _1.25E+0002 write ( :12); _1.252E+0002 write ( :13); _1.2524E+0002 write ( :14); _ E+0002 write ( :15); _ E+0002 write ( :16); _ E+0002

© С.В.Кухта, Пример 1. Сложение двух чисел Задача. Ввести два целых числа и вывести на экран их сумму. Простейшее решение: program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln ( c ); end. program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln ( c ); end.

© С.В.Кухта, Блок-схема линейного алгоритма начало конец c := a + b; ввод a, b вывод c блок «начало» блок «ввод» блок «процесс» блок «вывод» блок «конец»

© С.В.Кухта, Оператор ввода read ( a ); { ввод значения переменной a} read ( a, b ); { ввод значений переменных a и b} Как вводить два числа? через пробел: через Enter: a 25 b 30 a 25 b 30

© С.В.Кухта, Оператор вывода write ( a ); { вывод значения переменной a} writeln ( a ); { вывод значения переменной a и переход на новую строчку} writeln ( 'Привет!' ); { вывод текста} writeln ( 'Ответ: ', c ); { вывод текста и значения переменной c} writeln ( a, '+', b, '=', c );

© С.В.Кухта, Форматы вывода program qq; var i: integer; x: real; begin i := 15; writeln ( '>', i, '', i:5, '', x, '', x:10, '', x:7:2, '', i, '', i:5, '', x, '', x:10, '', x:7:2, '

© С.В.Кухта, Полное решение program qq; var a, b, c: integer; begin writeln('Введите два целых числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. program qq; var a, b, c: integer; begin writeln('Введите два целых числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. Протокол: Введите два целых числа =55 компьютер пользователь

© С.В.Кухта, Пример 2. Задача. Программа вычисления площади круга, вписанного в треугольник и площади круга, описанного около треугольника. Program Triangle; Const Pi = ; Line =___________; Var a, b, c : Real; Sint, Sout : Real; S, p : Real; Begin { ввод данных } Write (введите стороны треугольника a b c); Readln (a, b, c); { вычисления } p:=(a+b+c)/2; S:=Sqrt(p*p–a)*(p–b)*(p–c)); Program Triangle; Const Pi = ; Line =___________; Var a, b, c : Real; Sint, Sout : Real; S, p : Real; Begin { ввод данных } Write (введите стороны треугольника a b c); Readln (a, b, c); { вычисления } p:=(a+b+c)/2; S:=Sqrt(p*p–a)*(p–b)*(p–c)); Sout:=Pi*sqrt(a*b*c/4/S); Sint:=Pi*sqrt(2*S/p); { печать ответа } Writeln; Writeln (Line); Writeln(Sвпис =, Sout); Writeln(Line); Writeln(Sопис =, Sint); Writeln(Line) End. Sout:=Pi*sqrt(a*b*c/4/S); Sint:=Pi*sqrt(2*S/p); { печать ответа } Writeln; Writeln (Line); Writeln(Sвпис =, Sout); Writeln(Line); Writeln(Sопис =, Sint); Writeln(Line) End.

© С.В.Кухта, Пример 3. Задача. Программа возведения положительного числа x в степеньn, т.е. y=x n. Расчет производится по формуле: y=e n*ln(x). Program N_2; {возведение положительного числа в степень} Var n, x, y: real; BEGIN Writeln ('Введите значение аргумента х>0'); Readln (x); Writeln ('Введите значение показателя степени n='); Readln (n); y:= exp( n * ln(x)); Writeln (' Результат y=', y:10:6); Writeln (' Нажмите Enter'); readln; {задержка экрана до нажатия Enter} END. Program N_2; {возведение положительного числа в степень} Var n, x, y: real; BEGIN Writeln ('Введите значение аргумента х>0'); Readln (x); Writeln ('Введите значение показателя степени n='); Readln (n); y:= exp( n * ln(x)); Writeln (' Результат y=', y:10:6); Writeln (' Нажмите Enter'); readln; {задержка экрана до нажатия Enter} END.

© С.В.Кухта, Метки и безусловный переход

© С.В.Кухта, Метки Метка помечает какое-либо место в тексте программы. Метками могут быть числа от 0 до 9999 или идентификаторы, которые в этом случае уже нельзя использовать для каких-либо иных нужд. Все метки должны быть описаны в специальном разделе label: label ; Меткой может быть помечен любой оператор программы: : ; Любая метка может встретиться в тексте программы только один раз.

© С.В.Кухта, Оператор безусловного перехода Используются метки только операторами безусловного перехода goto: Это означает, что сразу после оператора goto будет выполнен не следующий за ним оператор (как это происходит в обычном случае), а тот оператор, который помечен соответствующей меткой. В принципе, передавать управление можно вперед и назад по тексту программы, внутрь составных операторов и наружу и т.п. Исключением являются только процедуры и функции (см. соответствующую Тему): внутрь них и наружу безусловные переходы невозможны. goto ;

© С.В.Кухта, Оператор безусловного перехода Оператор Goto следует применять как можно реже, так как его частое употребление резко усложняет понимание логики программы. В крайнем случае он может использоваться для преждевременного выхода из операторов повтора. Вообще же использование безусловных переходов в структурном и надежном программировании считается "дурным тоном". Поэтому настоятельно советуем: Воздерживаться от употребления операторов goto. Язык Паскаль обладает достаточным количеством структурных конструкций и возможностей, позволяющих достичь хороших результатов надежными средствами. !

© С.В.Кухта, Пример... Label Metka1, Metka2;... Goto Metka1;... Metka1: Writeln (Summa); Goto Metka2;... Metka2: End.... Label Metka1, Metka2;... Goto Metka1;... Metka1: Writeln (Summa); Goto Metka2;... Metka2: End.