close

Вход

Забыли?

вход по аккаунту

?

ЛАБОРАТОРНА РОБОТА№6

код для вставкиСкачать
ЛАБОРАТОРНА РОБОТА №6
ПОРЯДКОВЫЕ ТИПЫ ДАННЫХ И СРЕДСТВА ИХ ОБРАБОТКИ
Цели работы:
* Познакомиться с целым типом данных.
* Познакомиться с символьным типом данных.
* Познакомиться с ограниченным типом данных.
* Познакомиться с типом данных String.
* Познакомиться с инструкцией цикла for.
* Создать приложение, обеспечивающее обработку данных этих типов с использованием инструкции for.
4 5 6 6.1 Краткие Теоретические сведения
6.1.1 Порядковые типы данных
Порядковыми (ordinal) называются типы, которым соответствуют данные, поддерживающие понятия "предшествующее значение" и "последующее значение". Например, для целого числа 5 можно определенно сказать, что ему предшествует число 4, а следующее за ним - число 6. С другой стороны невозможно сказать, какое число непосредственно предшествует вещественному числу 5.0.
В Object Pascal определены следующие порядковые типы:
- целые типы;
- символьные типы;
- булевы типы;
- ограниченные типы.
Для порядковых типов определен ряд функций, которые отражают специфику этих данных. Перечень этих функций приведен в таблице 6.1.
Таблица 6.1 - Функции для порядковых типов данных
ФункцияВозвращаемое значениеПримерSucc(<значение >)Возвращает следующее значениеSucc(123) = 124
Succ(false) = true
Succ('я') = #0Pred(<значение >)Возвращает предыдущее значениеPred('я') = 'ю'
Pred(#0) = 'я'Ord(<значение>)Возвращает целое число, соответствующее номеру <значения> во множестве возможных значений типа.Ord(123) = 123
Ord(-123) = -123
Ord('я') = 255
Ord(#0) = 0High(<имя переменной>)
High(<значение>)
High(<тип>)Возвращает максимальное значение для данных типаHigh('x')= 'я'
High(char)= 'я'
High(integer) = 2147483647Продолжение таблицы 6.1
Low(<имя переменной>)
Low(<значение>)
Low(<тип>)Возвращает минимальное значение для данных типаLow('x')= #0
Low(integer)=
-2147483648
6.1.1.1 Целые типы данных
Целые типы данных используются для представления целых чисел. Типами, обеспечивающими максимальную производительность, являются Integer и Cardinal. Оба типа занимают в памяти 4 байта и принимают значения в дапазоне: для Integer -2147483648..2147483647, для Cardinal 0..4294967295. В тех случаях, когда нужен больший диапазон чисел, можно использовать тип int64.
Следует помнить, что арифметические операции с целыми числами имеют свои особенности. Для деления используется операция div, которая выполняет целочисленное деление. Остаток от целочисленного деления на некоторое целое число можно найти с помощью операции mod.
Для целочисленных данных можно использовать и логические операции, такие как and, or, xor. Результат будет определяться применением соответствующей операции к каждой паре соответствующих бит двоичного представления чисел. При выполнении таких операций часто используют 16-ричное представление чисел. Признаком 16-ричного числа является знак $ перед числом, например $FF соответствует десятичному числу 255, а $100 соответствует десятичному числу 256.
Можно применять и операции сдвигов двоичных кодов числа влево (shl) или вправо (shr) на заданное число разрядов. Сдвиг вправо на один разряд соответствует целочисленному делению числа на 2. Сдвиг влево на один разряд соответствует умножению на 2. Например, в результате выполнения инструкции $FF shr 4, получим результат $0F.
6.1.1.2 Символьные типы данных
Символьные типы предназначены для представления символов. В Object Pascal можно использовать две разновидности символов:
- Типу Char соответствует множество из 256 символов, в котором символы упорядочены в соответствии с таблицей кодировки ANSI (American National Standard Code for Information Interchange). Каждый символ этого типа занимает 1 байт. Соответствие между кодом и соответствующим ему символом задается так называемой таблицей кодировки символов. Первая половина таблицы (коды от 0 до 127) используется для управляющих символов, цифр, латинских букв и наиболее распространенных символов, таких, как знаки препинания, знаки математических операций и т.п. Вторая половина таблицы (коды от 128 до 255) используется для национальных алфавитов и других символов.
- Типу WideChar соответствует множество символов Unicode, в котором каждый символ занимает 2 байта, и естественно, эта таблица символов может содержать очень большой список символов. Им соответствуют коды в диапазоне от 0 до 65535. Первые 256 символов в этом множестве соответствуют символам ANSI с соответствующими кодами.
В наших лабораторных работах мы будем использовать только тип Char. Фрагмент таблицы кодировки символов представлен ниже, в таблице 6.2. Таблица 6.2 - Кодировка некоторых символов ANSI
СимволКодДвоичное представление16-ричное представлениеОтсутствие символа00000 0000$00Пробел320010 0000$20!330010 0001$21...0480011 0000$301490011 0001$312500011 0010$323510011 0011$33...A650100 0001$41B660100 0010$42C670100 0011$43a970110 0001$61b980110 0010$62...А19211000000$C0Б19311000001$C1...а2241110 0000$E0б2251110 0001$E1...я2551111 1111$FF Обратите внимание на порядок расположения символов в таблице. Такой порядок позволяет упорядочивать слова и идентификаторы в алфавитном порядке с помощью кода символа.
Символьные константы можно записывать разными способами. Для большинства символов можно использовать изображение этого символа, заключенное в одинарные кавычки. Например, '1', 'z', '*'. Специальные символы удобно представлять с помощью их кода, в виде целого числа, которому предшествует знак #. Например, #0, #8, #13. Кроме того, любой символ может быть получен с помощью функции chr(), которой в качестве аргумента передается код символа. Например, chr(65) возвращает прописную латинскую букву 'A', а chr(255) - строчную букву 'я' кириллицы.
Обратное преобразование, то есть преобразование символа в код можно выполнить с помощью функции ord(). Например, ord('0') вернет 48.
При вводе отдельных символов из компонентов класса TEdit, необходимо иметь в виду, что свойство text этих компонентов возвращает не символ, а строку символов. Чтобы получить отдельный символ этой строки следует использовать порядковый номер символа в строке, записывая его в квадратных скобках после имени строки символов. Например, Edit1.text[1].
Для символов применимы все операции сравнения. При этом сравниваются коды символов. Поэтому 'б' > 'Б', и 'а' кириллицы больше, чем латинское 'a'.
Группы символов, которые соответствуют буквам, расположены таким образом, чтобы упростить преобразование больших букв в маленькие и наоборот. Разница в кодировке больших и маленьких букв и латинского и русского алфавита равна $20 или 32. Следовательно, чтобы превратить строчную букву в прописную, достаточно из ее кода вычесть 32. Число 32 можно и не помнить, так как его можно получить в результате вычитания кода прописной буквы из кода соответствующей строчной. Например, ord(z) - ord(Z), или оrd(a) - ord(A).
Особенность кодировки цифр состоит в том, что младший полубайт символа цифры соответствует ее числовому значению в двоичном представлении. Это позволяет легко преобразовывать код символа цифр в соответствующие числа с помощью логической операции and и маски $0F. Например, в результате операции ord('5') and $0F получится число 5.
Для преобразования символов цифр в соответствующие числа можно использовать тот факт, что символы цифр следуют в таблице кодировки друг за другом в порядке возрастания значений этих цифр.
Ниже приведено два варианта такого преобразования.
Первый вариант использует разницу в кодах нуля и выбранной цифры, которая соответствует числовому значению символа цифры ...
var c : char; n : integer;
...
n := ord(c)- 48; // что равносильно ord(c) -ord('0');
Второй вариант такого преобразования использует операцию and $0F с маской $0F. ...
const maska = $0F; // константа равная двоичному числу 00001111
var c : char; n : integer;
...
n := ord(c) and maska; // маска удаляет старший полубайт
6.1.1.3 Ограниченный тип данных.
Для порядковых типов можно задать поддиапазон их возможных значений - это и будет ограниченный тип.
Диапазон значений ограниченного типа задается выражением вида: <минимальное значение>..<максимальное значение>.
Например:
type TCaps = 'A'..'Z';
var bigLetter : TCaps; month : 1..12;
В этих примерах переменная bigLetter может принимать только символы латинских букв в верхнем регистре, а переменная month значения от 1 до 12.
Ограниченные типы используются, например, при объявлении массивов. В компиляторе Object Pascal имеется опция, позволяющая включить проверку диапазона при присваивании значения переменной ограниченного типа - {$R+}. Её можно включить в том месте вашей программы, где нужно начать проверку диапазона, и выключить в любом месте опцией {$R-}. При попытке присвоить переменной ограниченного типа значение, выходящее за пределы заданного поддиапазона, сгенерируется исключение с сообщением "Range check error".
Интервальный тип можно использовать для задания множества данных этого типа путем заключения интервала в квадратные скобки. Например, множество сточных русских букв можно задать таким образом ['а'..'я']. Для определения принадлежности некоторого символа к определенному таким образом множеству можно использовать операцию in, которая возвращает true, если символ принадлежит множеству и false - если не принадлежит. Например, результатом вычисления выражения '5' in ['0'..'9'], будет true.
6.1.2 Применение инструкции цикла FOR
Инструкция for...to...do позволяет последовательно перебирать значения некоторой переменной порядкового типа в заданном диапазоне, либо от начального значения до конечного значения, либо наоборот. С помощью этой инструкции легко организовать цикл. Особенность таких циклов в том, что число повторений заранее известно.
В общем виде инструкция for...to...do записывается так.
РРисунок 6.1- Синтаксис инструкции for...to...do На этом рисунке <параметр цикла> - переменная порядкового типа; <начальное значение> - выражение, определяющее начальное значение <параметра цикла>; <конечное значение> - выражение, определяющее конечное значение <параметра цикла>.
Следует отметить, что если между словами begin и end находится только одна инструкция, то операторные скобки: begin и end можно не писать.
Инструкция цикла for...to...do выполняется следующим образом:
1) Вычисляются <начальное значение> и <конечное значение >.
2) Переменной <параметр цикла> присваивается <начальное значение>.
3) Если значение <параметра цикла> превышает <конечное значение>, то цикл заканчивается.
4) Выполняется тело цикла.
5) Переменной <параметр цикла> присваивается следующее значение.
6) Выполнение продолжается с пункта 3.
Количество повторений тела цикла можно вычислить по формуле: Ord(<конечное значение>) - ord(<начальное значение>)+1;
Если <начальное значение> больше чем <конечное значение>, то тело цикла не будет выполнено ни разу.
Если <начальное значение> и <конечное значение> одинаковы, то тело цикла выполняется один раз.
Переменную <параметр цикла> можно использовать внутри цикла (но не изменять).
Если в инструкции for...to...do вместо слова to записать downto, то после очередного выполнения инструкций тела цикла, значение <параметра цикла> будет не увеличиваться, а уменьшаться. Начальное значение в этом случае должно быть больше чем <конечное значение>.
В рассмотренном ниже примере цикл for...to..do используется для того, чтобы добавить 10 символов '*' к тексту в компоненте Label1.
for i:=1 to 10 do begin
label1.caption:=label1.caption + '*';
end;
В следующем примере все прописные буквы текстового компонента Edit1 заменяются соответствующими строчными буквами. Для определения длины строки здесь используется функция length().
const rus=['А'..'Я']; lat=['A'..'Z'] ;
var ch: char; i:integer; s:string;
begin
s:= Edit1.Text; // Запоминаем текст компонента в переменной типа String
for i:=1 to length(s) do // Цикл по символам строки
begin
ch:= s[i]; // Очередной символ
if (ch in rus) or (ch in lat) then s[i]:= chr(ord(ch) +32);
Edit1.Text := s; // Вывод результата
end;
end;
6.1.3 Строки символов
Строка - это тип данных, которому соответствует последовательность символов. При работе со строками оперируют понятиями имя строки, размер строки, символ, номер символа. Для идентификации положения отдельных символов строки, используют индексы. В качестве индексов строки в Object Pascal могут использоваться только целые числа. Нумерация символов в строке начинается с единицы.
В языке Object Pascal существует несколько разновидностей строк, но мы рассмотрим только один из них, аналогичный типу String в языке Pascal. Этот тип в языке Object Pascal имеет название ShortString - короткая строка. Вместо него можно использовать и название String, но следует иметь в виду, что оно будет соответствовать типу ShortString только в том случае, если включена директива компилятора {$H+}. В противном случае String интерпретируется компилятором как тип AnsiString - длинная строка. Но, если в объявлении типа после ключевого слова String в квадратных скобках следует число, определяющее максимальную длину строки (например, String[4]), то, независимо от директив компилятора, тип трактуется как короткая строка.
Данные типа ShortString представляют собой последовательности 8-битовых ANSI символов, количество которых может быть от 0 до 255. Длина строки в процессе работы программы может изменяться, но размер выделяемой памяти при этом не меняется и равен 256 байтов. Начальный (нулевой) байт в выделенной памяти используется для хранения длины строки, в остальных хранятся символы строки. Если S - это строка типа ShortString, то Ord(S[0]), так же как и Length(S), возвращают длину строки.
Object Pascal поддерживает и подтипы типа ShortString, максимальная длина которых может быть меньше чем 255 символов. Требуемая максимальная длина строки задается в квадратных скобках после слова String. Например:
var MyString: String[10];
Эта запись равносильна такой:
type Tstring10 = String[10];
var MyString: Tstring10;
Использование подтипов экономит память, так как для строки выделяется меньше места.
Если переменной такого типа присваивается строка большей длины, то она будет обрезана справа.
Объявление типа со спецификатором длины нельзя использовать в заголовках процедур, которые используют параметры такого типа. Ниже приведен пример объявления процедуры, которое приведет к появлению сообщения об ошибке компиляции. procedure Check(S: string[20] ); // будет синтаксическая ошибка
Однако это не означает, что в процедуры нельзя передавать данные таких типов. Передавать такие данные можно, но предварительно следует определить соответствующий тип данных, а в объявлении процедуры для параметров использовать этот, предварительно объявленный, тип. Ниже приведен пример правильного объявления такой процедуры.
type TString20 = String[20];
procedure Check(S: TString20);
6.1.3.1 Операции над строками
Сцепление (конкатенация) строк осуществляется операцией "+". Например, выражение S1+S2 даст в результате новую строку, в которой после символов строки S1 будут расположены символы строки S2.
Для строк определены операции сравнения >, >=, <, <=, =, <>. Большей считается строка, у которой код первого из не совпавших символов больше. Обратите внимание, оценивается не длина строки, а коды символов. Именно на основе такого способа сравнения упорядочены слова в словарях.
В программах можно обращаться и к отдельным символам строки. Например, S[i] - это символ, расположенный в позиции i строки (индексы отсчитываются от 1, т.е. индекс 1 соответствует первому символу). Выражение S[i] возвращает значение типа Char.
При работе со строками не следует забывать о том, что задание максимального размера строки при ее объявлении не означает, что строка имеет такую длину. Размер строки устанавливается во время операции присваивания значения всей строке, и не изменяется при изменении отдельного символа.
Пусть мы хотим создать строку, состоящую из 15 случайных символов '0' и '1'. На первый взгляд может показаться, что процедура, приведенная ниже, даст правильный результат, однако это не так. Фактическая длина строки в этой процедуре равна 0, и такой же она останется после завершения цикла.
procedure TForm1.Button1Click(Sender: TObject);
var s: String[20]; i: integer;
begin
for i:=1 to 15 do s[i] := intToStr(random(2))[1];
edit1.Text:=s;
end;
Желаемый результат мы получим при таком варианте:
procedure TForm1.Button1Click(Sender: TObject);
var s: String[20]; i: integer;
begin
s:='';
for i:=1 to 20 do s := s+intToStr(random(2));
edit1.Text:=s;
end;
6.1.4 Некоторые стандартные процедуры и функции для обработки строк
6.1.4.1 Функция Length Объявление функции:
function Length (s : String): Integer;
Функция возвращает число символов в строке S, которая передана функции в качестве параметра.
Например, выражение Length('Десна') вернет значение 5.
6.1.4.2 Функция AnsiUpperCase
Объявления функций:
function AnsiUpperCase (const s : String): String Функция возвращает новую строку, полученную из s, путем преобразования символов букв к верхнему регистру. Функция AnsiUpperCase применима для латинских и русских текстов.
Например, выражение AnsiUpperCase('Десна') вернет значение 'ДЕСНА'.
Для использования функции следует подключить модуль SysUtils.
6.1.4.3 Функция AnsiLowerCase
Объявления функций:
function AnsiLowerCase (const s : String): String
Функция возвращает новую строку, полученную из S, путем преобразования символов букв к нижнему регистру. Функция AnsiLowerCase применима для латинских и русских текстов.
Например, выражение AnsiLowerCase('Десна') вернет значение 'десна'.
Для использования функции следует подключить модуль SysUtils.
6.1.4.4 Функция AnsiCompareText
Объявление функции:
function AnsiCompareText (const s1, s2: string): Integer;
Функция сравнивает две строки ANSI s1 и s2 без учета регистра. Возвращает значение < 0, если s1 < s2, 0, если s1 = s2, и > 0, если s1 > s2.
6.1.4.5 Функция Copy Объявление функции:
function Copy (s : String; index, count : Integer): String;
Функция возвращает подстроку строки s, начинающуюся с позиции index и содержащую до count символов.
Если index выходит за пределы строки - возвращается пустая строка.
Если count определяет больше символов, чем возможно, возвращается максимально возможное число символов.
Например, выражение Сopy('Десна - прекрасная река', 12, 7) вернет значение 'красная'.
6.1.4.6 Процедура Delete Объявление процедуры:
procedure Delete (var s : String; index, count : Integer);
Процедура удаляет из строки S до Count символов, начиная с позиции Index.
Если count определяет больше символов, чем возможно, удаляется максимально возможное число символов.
Если index выходит за пределы строки, удаление не производится.
Обратите внимание, так как строка передается в процедуру по ссылке, то в процедуру можно передавать только имя строки, но не значение.
Например, пусть значение строки s равно 'Десна - прекрасная река'. После вызова процедуры Delete (s, 9, 11) значение строки s станет 'Десна -река'.
6.1.4.7 Процедура Insert Объявление процедуры:
procedure Insert (source: String; var s: String; index: Integer);
Процедура вставляет строку source в строку s, начиная с позиции index.
Если index < 1, он заменяется единицей. Если индекс больше длины строки, source добавляется к концу строки s.
Так же как и в предыдущем случае, строка s передается в процедуру по ссылке. Например, пусть значение строки s равно 'Десна - река'. После вызова процедуры Insert ('прекрасная ' s, 9) значение строки s станет 'Десна - прекрасная река'.
6.1.4.8 Функция Pos Объявление функции:
function Pos (substr, s : String): Integer;
Функция возвращает позицию (индекс) первого вхождения строки substr в строку s. Если substr нет в s, возвращается 0.
Например, выражение Pos('прекрасная ', 'Десна - прекрасная река') вернет значение 9.
6.1.4.9 Функции Trim, TrimLeft, TrimRight Объявление функций:
function Trim (const S: string): string;
function TrimLeft (const S: string): string;
function TrimRight (const S: string): string;
Функция Trim удаляет из строки S начальные и завершающие пробелы и управляющие символы, такие как табуляция, возврат каретки и перевод строки.
Функция TrimLeft удаляет из строки S начальные пробелы и управляющие символы.
Функция TrimRight удаляет из строки S завершающие пробелы и управляющие символы.
Пробелы находящиеся внутри строки не удаляются ни одной из этих функций.
6.2 Тексты написанных процедур с пояснениями в виде комментариев:
6.2.1 Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses UnitSam;
{$R *.dfm}
end.
6.2.2 Unit2.pas
procedure TForm2.edtDKeyPress(Sender: TObject; var Key: Char);
begin
TestRealKey (key,TEdit(sender).Text);
end;
procedure TForm2.btn2Click(Sender: TObject);
begin
memo1.Clear;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
memo1.Clear;
edtD.text:='5';
edtC.text:='1';
edtz0.text:='2';
edtZmax.text :='5';
edtStep.text:='2';
end;
procedure TForm2.btn1Click(Sender: TObject);
var i,k:integer; z,w,d,c,z0,step,zmax:real; s:string;
begin
d:=strtofloat(edtD.Text);
c:=strtofloat(edtC.Text);
z0:=strtofloat(edtz0.Text);
zmax:=strtofloat(edtZmax.text);
step:=strtofloat(edtStep.text);
k:=round((zmax-z0)/step);
s:=format('%10s %10s',['z','w']);
memo1.lines.append(s);
for i:=1 to k do
begin
z:=z0+step*i;
w:=formula(d,z,c);
s:=format('%10.2f %10.2f',[z,w]);
memo1.lines.append(s);
end;
end;
end.
6.2.3 Unit3.pas
procedure TForm3.btn1Click(Sender: TObject);
var ch:char; code:integer; bin32,bin16,s:string;
begin
memo1.Clear;
for ch:='9' to 'À' do
begin
code:=ord(ch);
bin32:=inttobin(code);
bin16:=copy(bin32,17,16);
s:=format('Ñèìâîë %s - êîä - %3d (%s)',[ch,code,bin16]);
memo1.lines.Append(s);
end;
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
memo1.Clear;
end;
end.
6.2.4 Unit4.pas
procedure TForm4.edt1KeyPress(Sender: TObject; var Key: Char);
begin
TestRealKey (key,TEdit(sender).Text);
end;
procedure TForm4.btn1Click(Sender: TObject);
var n,i,k:integer; s:string;
begin
n:=strtoint(edt1.Text);
if (n>=27) or (n<=1) then begin showmessage('1<n<27'); exit; end;
for i:=100 to 999 do
begin
s:=inttostr(i);
if strtoint(s[1])+strtoint(s[2])+strtoint(s[3])=n then
begin inc(k); memo1.Lines.Append(s); end;
end;
memo1.Lines.Append('È òîãî êîëè÷åñòâî öèôð = '+inttostr(k));
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
memo1.Clear;
end;
end.
6.2.5 UnitSam.pas
procedure TForm5.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
TestRealKey (key,TEdit(sender).Text);
end;
function myfunc(s:string):integer;
var i,S1:integer;
begin
result:=0; S1:=0;
for i:=1 to length(s) do
begin
S1:=(ord(s[i])-48)*round(exp(ln(10)*(length(s)-i)));
result:=result+S1;
end;
end;
procedure TForm5.Button1Click(Sender: TObject);
var s:string;
begin
s:=edit1.text;
edit2.text:=inttostr(MyFunc(s))
end;
end.
6.3 Изображение интерфейсов проекта с результатами работы:
Рисунок 6.1- Табулирование функции Рисунок 6.2- Таблица "Символ-код" Рисунок 6.3-Обработка последовательностей целых чисел Рисунок 6.4- Подпрограмма StrToInt 6.4 Выводы: В ходе выполнения лабораторной работы ознакомились с целыми, символьными, ограниченными типами данных, а также с инструкцией цикла for. Создали приложение, обеспечивающее обработку данных этих типов с использованием инструкции for.
Документ
Категория
Рефераты
Просмотров
38
Размер файла
172 Кб
Теги
робота, лабораторная
1/--страниц
Пожаловаться на содержимое документа