Обработка символьных и строковых величин




Вещественные типы в Pascal

Тип Диапазон Число цифр Память, байт
Real 2.9e-39 … 1.7e38 11-12  
Single 1.5e-45 … 3.4e38 7-8  
Double 5.0e-324...1.7e308 15-16  
Extended 3.4e-4932 … 1.1e493 19-20  
Comp -9.2e63 … (9.2e63)-1 19-20  

Число цифр определяет точность, с которой будет храниться вещественное число. Например, для Real разрядность мантиссы может составлять не более восьми десятичных знаков. Тип Comp содержит только целые значения, которые представляются в вычислениях как вещественные.

Над действительными числами выполнимы операции сложения (+), вычитания (-), умножения (*) и деления (/). Результатом этих операций является также действительное число. Даже если хотя бы один из операндов вещественный, то результат этих операций также будет вещественным.

Операция деления (/) дает вещественный результат и в случае двух целых операндов. Например, 6 / 2 = 3.0.

Булевский тип. Переменная булевского типа принимает знач true (истина) или false (ложь). Эти величины упорядочены следующим образом: false < true. Операции and, or, not дают булевские значения.

Операция and (логическое умножение, пересечение, операция И) Выражение a and b дает значение true, только в том случае, если a и b имеют значение true. Во всех остальных случаях значения выражения a and b – false.

true and true = true; true and false = false; false and false = false

Операция or (логическое сложение, объединение, операция ИЛИ) Выражение a or b дает значение false, только в том случае, если a и b имеют значение false. Во всех остальных случаях результат – true.

true or true = true; true or false = true; false or false = false

Операция not (отрицание, операция НЕ) Выражение not a имеет значение, противоположное значению a.

not true = false; not false = true

Стандартные булевские функции odd(x) = true, если x нечетный (x целый); eoln(x) = true, если встретился конец строки текстового файла x; eof(x) = true, если встретился конец файла x. В ост случаях эти функции принимают значение false.

Обработка символьных и строковых величин

Символьный тип char Переменная этого типа занимает 1 байт и принимает одно из 256 значений кода ASCII (американский стандартный код для обмена информацией). Символы упорядочены в соответствии с их кодом, поэтому к данным символьного типа применимы операции отношения. В программе вместо символа можно использовать его код, состоящий из # и номера кодируемого символа (например, #51). Обычно символы, имеющие экранное представление, записывают в явном виде, заключив в апострофы (например, 'A', 'b', '*'). функции преобразования: ord(ch) – выдает номер символа (нумерация с нуля), chr(i) – выдает i-ый символ из таблицы символов. Пример. ord(H) выдает номер символа Н в последовательности всех символов, используемых транслято-ром. chr(15) выдает 15-ый символ этой последовательности.

Кроме того, для символьных переменных применяются такие функции: pred(ch) – возвращает предыдущий символ; succ(ch) – возвращает следующий символ; upcase(ch) – преобразует строчную букву в заглавную. Обрабатывает буквы только латинского алфавита. Также можно использовать процедуры inc и dec.

Стандартный тип String. В Pascal тип-строка (стандартный тип string) - последовательность символов произвольной длины (до 255 символов). Строку можно рассматривать как массив символов, однако в связи с широким использованием строк и некоторыми особенностями по сравнению со стандартными массивами они выделены в отдельный тип данных.

У типа-строки в квадратных скобках может быть указан его размер (от 1 до 255). Если размер строки не указан, он считается равным 255, например: var string[80];

string[10] = 'Январь'; Для строк применимы операции конкатенации (+) и сравнения. Операция конкатенации добавляет к первой строке вторую. Str:=Strl+Str2

Стандартные процедуры и функ­ции работы со строками. При работе со строками, как правило, возникает необходимость выполнять их копирование, вставку, удаление или поиск. Для эффективной реализации этих действий в Паскале предусмотрены стандартные процедуры и функции. Они кратко описаны ниже.

Функция Concat (s1, s2,..., sn) возвращает строку, являющуюся слиянием строк s1, s2,..., sn.

Функция Copy (s, start, len) возвращает подстроку длиной len, начинающуюся с позиции start строки s.

Процедура Delete (s, start, len) удаляет из строки s, начиная с позиции start, подстроку длиной len.

Процедура Insert (subs, s, start) вставляет в строку s подстроку subs, начиная с позиции start.

Функция Length (s) возвращает фактическую длину строки s, результат имеет тип byte.

Функция Pos (subs, s) ищет вхождение подстроки subs в строку s и возвращает номер первого символа subs в s или нуль, если subs не содержится в s.

11. Структ.данных. массивы Массив – структура однотипных данных с индексированным доступом. Каждый элемент массива имеет свой индекс. Индексы записываются в квадратных скобках через запятую: назв_мас [индекс]. Описание массивов В качестве диапазона можно исп.: Integer, Char, Boolean. Var <перем >: array[диапазон] Of<тип >; Также можно описать массив как новый тип данных: Type имя=array[диап.] of тип_компонентов; двухмерный массив можно объявить таким образом: Var X1: array [1..10] of array [1..5] of integer; Также это можно объявить более компактно: VarX1:[1..10,1..5] ofinteger; Это же справедливо для массивов с размерностью больше двух. Примеры на выше! Получение элементов массиваSpisok[1]:=’Иванов’; Действия с массивами Все действия выполняются поэлементно. Указатель-перем, кот. в качестве своего знач. сод. адрес байта оперативной памяти (один указатель позволяет адресовать 64Кб; Указатель занимает 2 байта). Как правило в паскале указатель связывается с некоторым типом данных (типизированный). Для его объявления используется знак ^, кот. пом. перед соотв. типом. Н/р: var a: ^integer; Можно объявить указатель, не связанный с конкретным типом данных (не типизированный). var p: pointer; Т.к. такие указатели не связаны с конкретным типом, с их помощью удобно динамически размещать данные (в процессе работы программы менять структуру и тип). Для типизированных указателей не допустимы операции с указателями других типов. Память под любую динамическую переменную неопходимо выделять процедурой new(типизированный_указатель): var i: ^real; begin new(i); Динамически размещенные данные (но не их адрес!) можно использовать для констант и переменных соответствующего типа в любом месте, где это допустимо, например: Var r: ^real; begin r^:=sqr(r^)+sin(r^)-2.3; Невозможен оператор r:=sqr(r^)+i^;так как указателю r нельзя присвоить значение вещественного типа. Точно так же недопустим оператор r^:=sqr(r); Работа с динамическими массивами с помощью про-цедур getmem и freemem Для работы с указателями любого типа используются процедуры getmem, freemem. Процедура getmem(p,size), где р – указатель, size – размер в байтах выделяемого фрагмента динамической памяти (size типа word), резервирует за указателем фрагмент динамической памяти требуемого размера. Процедура freemem(p,size), где р – указатель, size – размер в байтах освобождаемого фрагмента динамической памяти (size типа word) Это нужно для того, чтобы работать с так называемыми динамическими массивами. Обращение к i-му элементу динамического массива х имеет вид x^[i]. Пример использование динамического массива. Удалить из массива X(n) отрицательные элементы. Const n=10 Var i,j:byte; X: array [1..n] of real; begin for i:=1 to n do begin write('X[',i,']=');readln (X[i]); end; i:=1; while(i<=n)do if x[i]<0 then begin{Удаляем элемент массива с номером i.} for j:=i to n-1 do x[j]:=x[j+1]; {Уменьшаем размер массива.}{Не переходим к следующему элементу массива.} n:=n-1; end else {Если элемент не удалялся, то переходим к следующему элементу массива.} i:=i+1; 12. Структурированные типы данных. Записи. Запись– это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов. Определение типа записи начинается идентификатором record и заканчивается зарезервированным словом end. Между ними располагается список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля. Формат: type <имя типа> = record <идентификатор поля>:<тип компонента>; <идентификатор поля>:<тип компонента> end;   var <идентификатор,...>: <имя типа>; Оператор присоединения WITH: WITH <переменная> DO <оператор> Здесь WITH, DO - ключевые слова (с, делать); <переменная> - имя переменной типа запись, за которым, возможно, следует список вложенных полей; <оператор> - любой оператор Турбо Паскаля. Например: with c.bd do month:= 9; Это эквивалентно with с do with bd do month:= 9; Для вложенных полей приходится продолжать уточнения: type BirthDay = record day,month: Byte; year: Word end; var с: record name: String; bd: BirthDay end; begin ..... if c.bd.year = 1939 then... end. Ввод записей: type anketa=record fio: string[45]; dat_r: string[8]; adres: string[50]; curs: 1..5; grupp: string[3] end; var student: array [1..100] of anketa; I: integer; begin {последовательно вводим каждую запись} for I:=1 to 100 do begin writeln (‘введите сведения о’, I, ‘-м студенте’); writeln (‘введите фамилию, имя и отчество’); readln (student[I].fio); Вывод записей осуществляется по полям writeln (‘фамилия студента: ’, student. fio); Области использования:Как мы уже выяснили, массивы объединяют однородные единицы информации – элементы одного и того же типа. Но многообразие информации нельзя свести только к какому-то одному типу данных. Например, указывая положение точки в пространстве, мы можем воспользоваться одним и тем же типом для указания ее координат, но, описывая человека, мы должны указать его имя, рост, цвет глаз и волос, то есть в одном описании объединим разнороднуюинформацию. Данные такого рода, описывающие существенные стороны того или иного объекта путем включения в описание нескольких, часто разнотипных, элементов, называют записью (record).
13. Работа с файлами. Типизированные и текстовые файлы. Файл - это поименованная область памяти на каком-либо носителе информации, предназначенная для хранения данных. Этим носителем может быть гибкий или жесткий диск (магнитная лента). Внешние файлы должны быть описаны в разделе описаний программы. Описание файлов в общем случае имеет следующий вид: type <имя типа> = file of <тип компонент>; var <имя файловой переменной>:<имя файла>; или var <имя файловой переменной> file of <тип компонент>; Файловая переменная (обозначим ее как f) служит для доступа к файлу. В Турбо-Паскале существуют следующие категории файлов: · типизированные; · нетипизированные; · текстовые. В зависимости от категории объявление файлов соответственно будет: var f: file of <тип компонент>; var f: file; var f: text. Например: var f1:file of char; f2:file; f3:text. Файл во многом напоминает магнитную ленту, начало которой заполнено записями, а конец пока свободен. В программировании существует несколько разновидностей файлов, отличающихся методом доступа к его компонентам: файлы последовательного доступаи файлы произвольного доступа. Простейший метод доступа состоит в том, что по файлу можно двигаться только последовательно, начиная с первого его элемента, и, кроме этого, всегда существует возможность начать просмотр файла с его начала. Таким образом, чтобы добраться до пятого элемента файла, необходимо, начав с первого элемента, пройти через предыдущие четыре. Такие файлы называют файлами последовательного доступа. У последовательного файла доступен всегда лишь очередной элемент. Если в процессе решения задачи необходим какой-либо из предыдущих элементов, то необходимо вернуться в начало файла и последовательно пройти все его элементы до нужного. Файлы произвольного доступа позволяют вызывать компоненты в любом порядке по их номеру. Важной особенностью файлов является то, что данные, содержащиеся в файле, переносятся на внешние носители. Файловый тип– это единственный тип значений, посредством которого данные, обрабатываемые программой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ПК. Работа с файлами в Паскале Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип, кроме файлов. Иными словами, нельзя создать «файл файлов». В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти. Стандартные процедуры для работы с файлами. Работа с файлами производится посредством специальных стандартных процедур. Рассмотрим некоторые из них. АSSIGN (f, '<имя внешнего файла>') - эта процедура связывает файловую переменную f с именем внешнего файла на диске. Например: Assign (f1, 'fl.d'), здесь имя файловой переменной f1 связывается с файлом fl.d на диске. RESET (f) - процедура открывает существующий файл f для чтения. REWRITE (f) - создает и открывает новый файл для записи. APPEND (f) - открывает существующий файл для добавления данных. READ (f, X1,...,Xn) или READLN (f, X1,...,Xn)- считывает из файла f значения переменных X1 … Xn. WRITE (f, X1,...,Xn) или WRITELN (f, X1,...,Xn) - записывает в файл f значения переменных X1 … Xn. CLOSE (f) - закрывает файл f после окончания работы с ним. eof(f):boolean - принимает значение истина (true), если при чтении был достигнут конец файла. Пример: program readwrite; {$APPTYPE CONSOLE} uses SysUtils; var f: TextFile; s: string; begin AssignFile(f, c:\test.txt); // назначаем дескриптор файлу text.txt Rewrite(f); // открываем файл на запись writeln(f, s); // производим запись в файл CloseFile(f); // закрываем файл Reset(f); // открываем файл на чтение readln(f, s); // считываем данные из файла CloseFile(f); // закрываем файл end;   14. Реализация ветвлений в ЯП. Логический тип данных носит название BOOLEAN. Значением логического типа может быть одна из двух констант FALSE (ложь) или TRUE (истина). Для них справедливы правила: Ord(false)=0 Ord(true)=1 False Все реализации языка Pascal, в том числе и Turbo Pascal, вплоть до версии 6.0 содержали только один логический тип данных Boolean, элементы которого могут принимать лишь два логических значения: True (истина) и False (ложь) Отметим, что новые логические типы данныхбыли введены для обеспечения совместимости разрабатываемых программ с Windows, в которой значению False соответствует 0, а значению True – любое, отличное от 0, число. Логические переменныедолжны быть описаны предложением: Var <имя_переменной>: boolean; Величины логического типа данныхможно присваивать, выводить, но нельзя вводить процедурой read. Инструкция выбора if…else. Условный оператор имеет полную и краткую формы. Полная форма условного оператора выглядит следующим образом: if условие then оператор1 else оператор2 В качестве условия указывается некоторое логическое выражение. Если условие оказывается истинным, то выполняется оператор1, в противном случае выполняется оператор2. Краткая форма условного оператора имеет вид: if условие then оператор Если условие оказывается истинным, то выполняется оператор, в противном случае происходит переход к следующему оператору программы. В случае конструкции вида if условие1 then if условие2 then оператор1 else оператор2 else всегда относится к ближайшему предыдущему оператору if, для которого ветка else еще не указана. Если в предыдущем примере требуется, чтобы else относилась к первому оператору if, то необходимо использовать составной оператор: if условие1 then begin if условие2 then оператор1 end else оператор2 Пример: if a<b then min:= a else min:= b; Структура множественного выбора. Оператор выбора выполняет одно действие из нескольких в зависимости от значения некоторого выражения, называемого переключателем. Он имеет следующий вид: case переключатель of список выбора 1: оператор1;... список выбора N: операторN; else оператор0 end; Переключатель представляет собой выражение порядкового типа, а списки выбора содержат константы совместимого по присваиванию типа. Как и в операторе if, ветка else может отсутствовать. Оператор case работает следующим образом. Если в одном из списков выбора найдено текущее значение переключателя, то выполняется оператор, соответствующий данному списку. Если же значение переключателя не найдено ни в одном списке, то выполняется оператор по ветке else или, если ветка else отсутствует, оператор case не выполняет никаких действий. Список выбора состоит либо из одной константы, либо из диапазона значений вида a..b (константа a должна быть меньше константы b); можно также перечислить несколько констант или диапазонов через запятую: case DayOfWeek of 1..5: writeln('Будний день'); 6,7: writeln('Выходной день'); end; Реализация вложен­ных ветвлений. Программирование вложенных ветвлений Запишем на Паскале программу определения большего из трех чисел, блок-схема которой показана на рисунки. Program BIT2; var А, В, С, D: real; begin readln(А, В, С); if A>B then if A>C then D:=A else D:=B else if B>C then D:=B else D:=C; writeln(D)end. Обратите внимание на то, что перед elseточка с запятой не ставится. Вся ветвящаяся часть структуры алгоритма заканчивается на точке с запятой после оператора D:=C. сли на какой-то из ветвей оператора ветвления находится несколько последовательных операторов, то их нужно записывать между служебными словами beginи end. Конструкция такого вида: begin<Последовательность операторов>end   15. Реализация циклов в ЯП Цикл с предусловием while. Оператор цикла while имеет следующую форму: while условие do тело цикла Условие представляет собой выражение логического типа. Перед каждой итерацией цикла условие вычисляется, и если оно истинно, то выполняется тело цикла, в противном случае происходит выход из цикла. Если условие всегда оказывается истинным, то может произойти зацикливание: while 2>1 do write(1); Цикл с постусловием repeat.Оператор цикла repeat имеет следующую форму: repeat тело цикла until условие В отличие от цикла while, условие вычисляется после очередной итерации цикла, и если оно истинно, то происходит выход из цикла. Таким образом, операторы, образующие тело цикла оператора repeat, выполняются по крайней мере один раз. Обычно оператор repeat используют в ситуациях, где условие нельзя проверить, не выполнив тело цикла. Пример: repeat read(x); until x=0; Если условие всегда оказывается ложным, то может произойти зацикливание: repeat write(1); until 2=1; Структура повторения for.Оператор цикла for имеет одну из двух форм: for переменная:= начальное значение to конечное значение do тело цикла или for переменная:= начальное значение downto конечное значение do тело цикла Текст от слова for до слова do включительно называется заголовком цикла. Переменная после слова for называется параметром цикла. Для первой формы цикла с ключевым словом to параметр цикла меняется от начального значения до конечного значения, увеличиваясь всякий раз на единицу, а для второй формы ключевым словом downto - уменьшаясь на единицу. Для каждого значения переменной-параметра выполняется тело цикла. Однократное повторение тела цикла называется итерацией цикла. Значение параметра цикла после завершения цикла считается неопределенным. Переменная-параметр цикла может иметь любой порядковый тип. При этом начальное и конечное значения должны быть совместимы по присваиванию с переменной-параметром цикла. Пример: var en: (red,green,blue,white);... for en:= red to blue do write(Ord(en):2); for var c:= 'a' to 'z' do write(c); Если для цикла for... to начальное значение переменной цикла больше конечного значения или для цикла for... downto начальное значение переменной цикла меньше конечного значения, то тело цикла не выполнится ни разу. Если цикл используется в подпрограмме, то переменная-параметр цикла должна быть описана как локальная. Операторы break, continueОператоры break и continue используются только внутри циклов. Оператор break предназначен для досрочного завершения цикла. При его выполнении происходит немедленный выход из текущего цикла и переход к выполнению оператора, следующего за циклом. Оператор continue завершает текущую итерацию цикла, осуществляя переход к концу тела цикла. Пример: flag:= False; for var i:=1 to 10 do begin read(x); if x<0 then continue; // пропуск текущей итерации цикла if x=5 then begin flag:= True; break; // выход из цикла end; end; Использование операторов break и continue вне тела цикла ошибочно. Вложенный цикл - это цикл, размещённый внутри другого цикла. На первом проходе внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. Само собой, как внешний, так и внутренний цикл может быть прерван командой break. Пример 1. Напечатать числа в виде следующей таблицы 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 Данная таблица состоит из четырех строчек, в каждой из которых число 3 напечатано 5 раз. Строчку из пяти чисел можно напечатать с помощью одного цикла for:
for i:=1 to 5 do write(3, ' ');

Чтобы повторить вывод строчки 4 раза, вставляем этот цикл внутрь другого:

for k:=1 to 4 do {4 раза делаем то, что написано между begin’ом и end’ом} begin for i:=1 to 5 do write(3, ' '); {Выводим одну строку} writeln; {Переводим курсор на следующую строку} end;

Типичная ошибка, когда в качестве счетчиков вложенных циклов (i и k в приведенном примере) используется одна и та же переменная. То есть нельзя в каждом из циклов использовать одну переменную i. Помнить об этом особенно важно, поскольку данная ошибка не обнаруживается на этапе компиляции. Ваша программа запустится, но делать будет вовсе не то, что вы от нее ждете. В приведенном примере (если допустить ошибку, заменив переменную k на i) внешний цикл выполнится всего 1 раз вместо 4-х. Возможна также ситуация, когда такая ошибка приведет к зацикливанию: внешний цикл будет выполняться бесконечно долго – программа зависнет.

 

 

16. Реализация вспомогательных алгоритмов в языках программирования. Процедуры Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе. Описания меток, констант, типов и т.д. действительны только в пределах данной процедуры. В теле процедуры можно использовать любые глобальные константы и переменные. procedure <имя> (Формальные параметры); const...; type...; var...; begin <операторы процедуры> end;   Функции Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе: function <имя> (Формальные параметры): тип результата; const...; type...; var...; begin <операторы функции> end; В разделе операторов должен присутствовать, по крайней мере, один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего такого присваивания. Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип. По завершении выполнения подпрограмма-функция возвращаетглавной программе результат (подпрограмма-процедура не возвращаетявно результирующего значения). формальные параметры– параметры, определенные в заголовке подпрограммы фактические параметры– выражения, задающие конкретные значения при обращении к подпрограмме. В описании процедуры или функции задается список формальных параметров. Каждый параметр, описанный в списке формальных пара­метров, является локальным по отношению к описываемой процедуре или функции и в модуле, связанным с данной процедурой или функци­ей на него можно ссылаться по его идентификатору. Формальный параметр-значение обрабатывается, как локальная по отношению к процедуре или функции переменная, за исключением того, что он получает свое начальное значение из соответствующего фактического параметра при активизации процедуры или функции. Изменения, которые претерпевает формальный параметр-значение, не влияют на значение фактического параметра. Соответствующее фактическое значение параметра-значения должно быть выражением и его значение не должно иметь файловый тип или какой-либо структурный тип, содержащий в себе файловый тип. Фактический параметр должен иметь тип, совместимый по прис­ваиванию с типом формального параметра-значения. Если параметр имеет строковый тип, то формальный параметр будет иметь атрибут размера, равный 255. Параметр-переменная используется, когда значение должно пе­редаваться из процедуры или функции вызывающей программе. Соот­ветствующий фактический параметр в операторе вызова процедуры или функции должен быть ссылкой на переменную. При активизации проце­дуры или функции формальный параметр-переменная замещается факти­ческой переменной, любые изменения в значении формального пара­метра-переменной отражаются на фактическом параметре. Внутри процедуры или функции любая ссылка на формальный па­раметр-переменную приводит к доступу к самому фактическому пара­метру. Тип фактического параметра должен совпадать с типом фор­мального параметра-переменной (вы можете обойти это ограничение с помощью нетипизированного параметра-переменной).   Рекурсиейназывается ситуация, когда процедура или функция сама себя вызывает. Вот типичная конструкция такого рода: Procedure proc(i:integer); begin anweisungen1; if bedingung then proc(i+1); anweisungen2; end; Вызов proc(1) означает, что proc вызывает себя раз за разом с помощью proc(2),proc(3),.. до тех пор, пока условие bedin gung не отменит новый вызов. 17. Технология ООП. ООП — методология программ-я, к-я где прога предста-ся в виде совок-ти объектов опред-го класса, а классы образуют иерархию, основаннцю на принц. наслед-ти. Инкапсуляция - объединение, связывание в одно целое данных и программ-го кода для обработки данных. Базовой единицей инкапсуляции является класс, а конкретный экземпляр класса называется объектом. Полиморфизм позволяет использовать единый унифицированный интерфейс для выполнения однотипных действий с различными данными. Наследование позволяет одному объекту получать свойства др объекта. Данные к. наз полями, а ф-и – методами. Поля и методы нз эл-ми класса. Описание класса: Class<имя>{ [private:] <описание скрытых эл-в> public: <описание доступных эл-в>}; Спецификаторы доступа public и privateуправл-ют видим-ю эл-в класса. Интерфейс класса опис-ся после специф-ра public. Классы м/б глоб(обявл-ся вне любого блока) и лок(внутри блока). Доступ к эл-м объекта: операция «точка» при обращении к эл-ту ч/з bvz j,]trnfb jgthfwbz -> при обращении ч/з указатель. Статические компоненты классов. С помощью модиф-ра static можно описать статист. поля(для хранения данных, общих для всех объектов класса) и методы класса: Class A{public: Static int count:};// объявление в классе. Конструкторы:необх-мы для инициализ-ии объекта и вызыв-ся автомат-ки при его создании. Конструктор - это обычная ф-я, только в ней нет возвращаемого значения. Имя конструктора совпадает с именем класса. Конструктор должен располагаться в блоке public. К. не наслед-ся, их нельзя описывать с модиф-ми const, virtual, static. К. вызывается, если в проге встретилась к-л. из констр-й: Имя_класса имя_объекта [(список парам-в)]; // список парам-в не д.б. пустым. Имя_класса (список парам-в); //созд-ся объект без имени (список м.б. пустым) Имя_класса имя_объекта=выражение; //созд-ся объект без имени и копир-ся. Деструктор – это особый вид метода, применяющийся для освобождения памяти, занимаемой объектом. Деструктор вызыв-ся автоматически, когда объект выходит из области видимости: для лок объектов – при выходе из блока, в котором они объявлены; для глоб – как часть процедуры выхода из main при завершении программы; для объектов, заданных ч/з указатели, деструктор вызывается неявно при использ-и операции delete. Автоматический вызов деструктора объекта при выходе из области действия указателя на него не производится. Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса: ~class_name(void){Операторы деструктора} Деструктор: не имеет аргуметов, не м.б. объявлен как const или static, не наслед-ся, м.б. виртуальным. Пионером данного направления явился язык Смояток (Smalltalk), первоначально предназначенный для реализаций функций машин­ной графики. Работа над языком началась в 1970 г. в исследователь­ской лаборатории XEROX(США), а закончилась в 1980 г. оконча­тельным вариантом интерпретатораSmalltalk-80. Данный языкоригинален тем, что его синтаксис очень компактен и базируется ис­ключительно на понятии объекта. В нем отсутствуют операторы или данные, все, что входит в Смолток, является объектами, а объекты общаются друг с другом исключительно с помощью сообщений. В настоящее время версия VisualAgeforSmalltalk активно развивает­ся компанией IBM. Основой объектно-ориентированного программирования (ООП) является понятие объект. Его сущность выражается формулой «объект = данные + процедуры». Каждый объект содержит некото­рую структуру данных и доступные только ему процедуры (методы) обработки этих данных. Используя эту методологию, можно создать свой собственный абстрактный тип и отобразить проблемную область в эту созданную абстракцию вместо традиционного ее отображения в предопределенные управляющие структуры и структуры данных языка программирования. Объединение данных и свойственных им процедур обработки в одном объекте называется инкапсуляцией и присуще ООП. Другим фундаментальным понятием ООП является класс. Класс – это шаблон, на основе которого может быть создан конкретный про­граммный объект, он определяет свойства и методы объекта, принад­лежащего этому классу, соответственно, любой созданный объект ста­новится экземпляром класса. Класс обеспечивает скрытие данных, их гарантированную инициализацию, неявное преобразование типов для типов, определенных пользователем, контролируемое пользователем управление памятью и механизмы перегрузки операций. ООП является более естественным, так как предоставляет воз­можность выбрать имеющиеся или создать новые объекты и органи­зовать взаимодействия между ними. Следовательно, объектно-ориен­тированные языки по сравнению с процедурными являются языками более высокого уровня. 9. Классификация и обзор языков программирования. Понятие «язык программирования» Сегодня практически все программы создаются с помощью язы­ков программирования. Языки программирования — это формальные искусственные язы­ки. В отличие от естественных, язык программирования имеет ограниченный запас слов (операторов) и строгие правила их написания, а правила грам­матики и семантики, как и для любого формального языка, явно однозначно и четко сформулированы. Языки программирования, ориентированные на команды про­цессора и учитывающие его особенности, называют языками низко­го уровня. «Низкий уровень» не означает неразвитый, имеется в виду, что операторы этого языка близки к машинному коду и ориентиро­ваны на конкретные команды процессора. Языком самого низкого уровня является ассемблер. П рограмма, написанная на нем, представляет последовательность команд машин­ных кодов, но записанных с помощью символьных мнемоник. С по­мощью языков низкого уровня создаются компактные оптимальные по быстродействию программы. Например, драйверы устройств, модули стыковки с нестандартным оборудованием, когда важнее компактность, быстро­действие, прямой доступ к аппаратным ресурсам. Языки программирования, имитирующие естественные, обладающие укрупненными командами, ориентированные отдельные прикладные области обработки информации, называют языками высокого уровня. Чем выше уровень языка, тем ближе структуры данных и конструкции, использующиеся в програм­ме, к понятиям исходной задачи.Особенности конкретных компь­ютерных архитектур в них не учитываются, поэтому исходные тек­сты программ легко переносимы на другие платформы, имеющие трансляторы этого языка. Разрабатывать программы на языках вы­сокого уровня с помощью понятных и мощных команд значительно проще, число ошибок, допускаемых в процессе программирования, намного меньше. В настоящее время насчитывается несколько сотен таких языков (без учета их диалектов). Таким образом, языки программирования высокого уровня, ори­ентированные на решение больших содержательных прикладных за­дач, являются аппаратно-независимыми и требуют использования соответствующих программ-переводчиков для преобразования текста программы в машинный код, который в итоге и обрабатывается про­цессором. 2. Компиляторы и интерпретаторы С помощью языка программирования создается текст програм­мы, описывающий разработанный алгоритм. Чтобы программа была выполнена, надо либо весь ее текст перевести в машинный код (это действие и выполняет программа – компилятор) и затем передать на исполнение процессору, либо сразу выполнять команды языка, пе­реводя на машинный язык и исполняя каждую команду поочередно (этим занимаются программы – интерпретаторы). Интерпретатор функционирует следующим образом: берет очередной оператор языка из текста программы, анализирует его струк­туру и затем сразу исполняет. После успешного выполнения текущей команды интерпретатор переходит к анализу и исполнению следую­щей. Если один и тот же оператор в программе выполняется несколь­ко раз, интерпретатор всякий раз воспринимает его так, будто встре­тил впервые. Поэтому программы, в которых требуется произвести большой объем повторяющихся вычислений, будут работать медлен­но. Для выполнения программы на другом компьютере также необ­ходимо установить интерпретатор, так как без него программа пред­ставляет собой набор слов и работать не может. Компиляторы полностью обрабатывают весь текст программы (его называют исходным кодом илиsourcecode). Они осуществляют поиск синтаксических ошибок, выполняют семантический анализ и только затем, если текст программы в точности соответствует пра­вилам языка, его автоматически переводят (транслируют) на машин­ный язык (говорят: генерируют машинный код). Текст программы преобразует­ся в готовый к исполнению ЕХЕ-файл (исполнимый код), его можно сохранить в памяти компьютера или на диске. Этот файл имеет са­мостоятельное значение и может работать под управлением опера­ционной системы. Его можно перенести на другие компьютеры с процессором, поддерживающим соответствующий машинный код. Основной недостаток компиляторов – трудоемкость трансляции языков программирования, ориентированных на обработку данных сложной структуры, заранее неизвестной или динамически меняю­щейся во время работы программы. Для таких программ в машин­ный код вводятся дополнительные проверки и анализ наличия ре­сурсов операционной системы, средства динамического захвата и освобождения памяти компьютера, что на уровне статически задан­ных машинных инструкций осуществить достаточно сложно, а для некоторых задач практически невозможно. С помощью интерпретатора, наоборот, для исследования содер­жимого памяти допустимо в любой момент прервать работу програм­мы, организовать диалог с пользователем, выполнить любые сложные преобразования данных и при этом постоянно контролировать программно-аппаратную среду, что и обеспечивает высокую надеж­ность работы программы. Интерпретатор при выполнении каждой команды подвергает проверке и анализу необходимые ресурсы опе­рационной системы, при возникающих проблемах выдает сообщения об ошибках. В реальных системах программирования смеша


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-07-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: