Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Простейшие скалярные стандартные типы




С++Builder Delphi Тип Число байтов Диапазон значений
unsigned char Byte, ByteBool, AnsiChar Целое, символ   [0,255]
char ShortInt, Char Целое   [-128,128]
wchar_t WideChar Символ Unicode    
unsigned short Word, WordBool Целое   [0,65535]
short SmallInt Целое   [-32768,32767]
int Integer Целое   [-32768,32767]
unsigned long Cardinal, LongBool Целое   [0,4294967295]
long LongInt Целое   [-2147483648, 2147483647]
float Single, real Вещественное   [3.4x10-38, 3.4x1038]
double Double, comp Вещественное   [1.7x10-308,1.7x10308]
long double Extended Вещественное   [3.4x10-4932, 1.1x104932]
unsigned char* PChar, PAnsiChar Указатель на символы без знака    
void* Pointer Указатель    
bool Boolean Логический   false, true

 

Дополнительные типы, реализуемые классами

С++Builder Delphi Тип
Set Set Множество 1-32 байт
String String Cтрока, подобная при работе строке Delphi
SmallString String[n] Короткие строки в Паскале длиной до 255 символов
AnsiString AnsiString Текстовая строка Delphi произвольной длины
Variant Variant Любое значение
TdateTime TDateTime Значение даты и времени в виде Float
Currency Currency Значение денежной величины

Рассмотрим отдельно эти типы.

Set реализуется шаблонным классом Set:

Set< < тип>,<мин.значение элемента множества>,<макс. значение(<=255) >>

Пример:

typedef Set <char, 'A','Z'> bolhiebukvi; // прописные латинские буквы

bolhiebukvi glasnie, soglasnie; // объявление множеств гласных и согласных

glasnie <<'A'<<'I'<<'E'; // заполнение множества гласными буквами

soglasnie <<'B'<<'C'<<'D'; // заполнение множества согласными буквами

// проверка принадлежности буквы ‘B’ принадлежности множеству glasnie

Label1->Caption=glasnie.Contains('А')?»Да»:»Нет»; // вывод «Да»

String реализуется в виде: String <список имен>. Эти строки могут исполь­зоваться в привычных опера­циях сцепления (+) и срав­­нения строк (==).

Внимание! Отсчет символов начинается не с нуля, а с единицы

Пере­чис­лим основные методы (имя строки и метод раз­де­ляются точкой) работы с этими строками:

ToDouble/ToInt ‑ перевод строки в вещественное/целое число.

c_str‑ возвращает указатель на символьный массив с исходной строкой.

Length, IsEmpty ‑ возвращает длину строки, признак пустой строки (True).

IsEmpty ‑ возвращает true, если длина строки нулевая.

Insert(i) ‑ вставка строки после i‑й позиции исходной строки.

Delete/SubString(i,n) ‑ удаление/выделение подстроки длиной n с i‑й по­зи­ции исходной строки (r=Label1->Caption.SubString(2,3)).

LastDelimiter‑ возвращаетпозицию последнего символа‑ограничителя. LowerCase/UpperCase ‑ пере­вод строки в нижний/верхний регистр.

Trim, TrimLeft/TrimRight ‑ убрать пробелы и управ­ляющие символы в на­ча­ле и в конце строки, только в начале/конце строки соответственно.

Format‑ форматирование строки, аналогично функции printf.

ToInt/ToDouble ‑ перевод числовой ст­ро­ки к целому/вещественному числу.

AnsiPos(s), Pos(s) ‑ возврат номера первого символа вхождения строки S.

Пример формирования и вывода фамилии, имени и отчества:

String Fio, Fam=«Иванов», Imj=«Иван»; Fio=Fam+’ ‘+Imj+’ ‘;

Fio.Insert(«Иванович»,Fio.Length()+1); Label1->Caption=Fio;

SmallString реализуется в виде: SmallString <длина> <имя строки>.

Пример: SmallString<30>Fam; Fam=«Иванов»; Label1->Caption=Fam;

AnsiString реализуется в виде:

AnsiString<имя переменной>[<длина>]. Этот тип эквивалентен типу String.

Пример:

AnsiString Fio, Fam=«Иванов», Imj=«Иван»; Fio=Fam+’ ‘+Imj+’ ‘;

Fio.Insert(«Иванович»,Fio.Length()+1); Label1->Caption=Fio;

Variant реализуется в виде: Variant <список имен переменных>.

Пример:

Variant Fam=«Иванов»,Dp=Date();//объявление универсальных переменных

Label1->Caption=Fam+DateToStr(Dp); // формирование и вывод метки

TDateTime реализуется в виде: TDateTime <список имен переменных>. Этот тип имеет структуру типа double, которая содержит в целой части зна­че­ние даты (порядкового номера дня начиная с 30.12.1899), а в дробной ‑ значение времени (отсчитывая от 12:00).

Пример: TDateTime d=Date(); Label1->Caption=d+1; // дата на завтра

Currency реализуется в виде: Currency <список имен переменных>.

Currency Stoimoct=123565.15; Label1->Caption=Stoimoct;

Переменные‑константы задаются добавлением модификатора const и значений при объявлении этих переменных. Попытки изменить эти значения операторами присваивания будут обнаружены при компиляции.

Пример. const int a=1; /* переменная‑константа*/ a=2; // ошибка

Переопределение типа можно осуществить оператором typedef.

Пример переопределения типаlong double на новый тип vehhiclo:

typedef long double vehhiclo;vehhiclo a=1.2, b=1.6; // перемен. типа vehhiclo

Массивы

Массив - это набор объектов одинакового типа, доступ к которым осу­щест­­вляется прямо по индексу в массиве. Обращение к массивам осуществляется с помощью указателей (pointers) (п.6.3).

Одномерный массив можно описать следующим образом:

<тип_данных> <имя_массива > [< размер>];

Используя имя массива и индекс, можно адресоваться к элементам массива: <имя_массива> [< значение_индекса >]

Значения индекса должны лежать в диапазоне от нуля до величины, на единицу меньшей, чем размер массива, указанный при его описании.

Пример: char fam [20]; // массив (строка) из 20 символов.

Двумерный массив можно описать следующим образом:

<тип_данных> <имя_массива> [<размер_1>] [< размер_2>];

Пример. int kol [30][20]; // таблица 30 на 20 чисел типа int.

Аналогично описываются массивы и больших размерностей.

Многомерные массивы располагаются в памяти так, что быстрее всего меняется последний индекс.

Начальные значения элементам массива можно присвоить при его объявлении в виде:

<тип имя_массива> [...] = {< знач-1>,< знач-2>,...,< знач-N >};

Если пользователь не указал в квадрат­ных скобках размер массива, то ком­пи­лятор сам задает размер массива по числу приведенных начальных зна­че­ний в фигурных скобках.

Примеры инициализации одномерных массивов:

int data [5 ]={5, 4, 3, 2, 1}; float scores [ ] = {3.4, 2.7, 1.8, 6.9, -24.3};

char tovar [20 ] = {«Сапоги»}; // строка «Сапоги»

char prompt [ ] = {«Ответ:»}; // строка «Ответ:»

char prompt [ ] = {'О', 'т', 'в', 'е', 'т', ':', '\0' }; // строка «Ответ:»

Структуры (записи)

Структуры (записи) ‑ это группа логически связанных переменных. Объявление структуры имеет вид:

struct [<имя структуры>]

{ <тип поля 1> <имя поля 1>;

...

<тип поля n > <имя поля n>;

} [<список имен структурных переменных>] ;

Описание переменной структурного типа выглядит следующим образом: struct <имя структуры> < список переменных-записей>;

Имя структурной переменной (записи) можно указать и сразу при объявлении структуры перед правой фигурной скобкой.

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

Пример. type1 valuel = x.field1; type3.value3 = z.field3;

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

Комбинируя структуры и массивы, можно строить уни­версальные и гибкие структуры данных.

Пример

struct stovar // объявление структуры под именем stovar

{ int kt; // код товара - целочисленная переменная

char nt [20]; // наименование товара - строка из 20 байтов

} // конец тела структуры

zstovar={1,»Сыр»}; // наименование переменной-записи и значения полей

stovar mzstovar [2]; // объявление массива записей типа stovar

mzstovar[1].kt=2; // задание значения поля kt второй записи массива

printf(«\n%d, %d %s»,zstovar.kt,mzstovar[1].kt,zstovar.nt); // вывод значений

Битовые поля задаются в виде:

<целочисленный тип> [<имя>]: <ширина в битах (<=64)>;

Раполагаются поля в памяти слева направо.

Пример. struct vector {int i:2; int:2; unsigned j:4; long k:64;} a,b,c;

Объединения union

Объединения соответствуют типам вариантных записей языка Delphi и объявляются подобно структурам. Активным может быть только одно поле. Все поля перекрывают друг друга в памяти.

Размер объеди­нения равен размеру наибольшего поля.

Пример:

union un {int i; float f; char c;} a,b; // объявление объединения

a.i=1; Label1->Caption=a.i; // использование поля i

a.f=12.34; Label2->Caption=a.f; // использование поля f

a.c='w'; Label3->Caption=a.c; // использование поля c

Перечисления enum

Перечисления служат для присвоения имен набору целых чисел (int), что повышает наглядность и надежность задания правильных значений переменной. Объявление имеет вид:

enum [<имя перечисляемого типа для объявления переменных>]

{ <имя 1>[=<значение 1>],...,<имя N>[=<значение N>] }

[<список имен перечисляемых переменных>];

По умолчанию значение первого элемента равно нулю, а значение сле­дую­щего элемента списка на единицу больше.

Пример задания имен дням недели, начиная с понедельника:

int main(int argc, char **argv) // основная процедура

{ enum dninedeli {poned=1,vtor,sreda,hetv,pjtn,subb,vosk} den; // дни недели

den=vosk; // задание значения перечисляемой переменной den

if (den==vosk) printf(«Воскресенье %d день недели», den); getch(); // вывод

}

Основные возможности

Предпроцессор

В задачи предпроцессора входят: подключение (при необходимости) к данной программе внешних файлов, указываемых директивой #include, и выполнение его директив.

Директива #Include

Во многие программы подставляются один или несколько файлов, часто в самое начало кода главной программы main. Появление директив:

#include <файл_1>

...

#include «файл_n»

приводит к тому, что препроцессор подставляет на место этих директив тексты файлов: файл_1 файл_2 файл_n соответственно. Если имя файла заключено в кавычки, то вклю­чает­ся файл пользователя. Если имя файла заключено в угловые скобки, то файл входит во внеш­ние биб­лиоте­ки C++. Приведем список основных библиотек: stdlib.h (стандартная), math.h, math.hpp (математика), SysUtils.hpp (утилиты), time.h (время), ctype.h (обработка символов), string.h (строки), stdio.h, conio.h (ввод‑вы­вод).

Директива #define

С помощью директивы #define, вслед за которой пишутся имя и значение макрооператора, оказывается возможным указать пред­процес­со­ру, чтобы он при любом появлении в исходном файле данного имени заменял это имя на соответствующее значение макро­оператора (име­но­ван­ные константы (п. 1.1.1)).

Пример: #define square (х) ((х)*(х)); /* задает замену символа square (аргумент) на значение (аргумент) * (аргумент) */

Пример: #define рi 3.1415926; /* связывает идентификатор pi со значением 3.1415962 */

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...