Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Введение в класс string

Стандарт ISO/ANSI C++ расширил библиотеку C++, добавив класс string. Поэтому вместо применения символьных массивов для хранения строк можно применить переменные типа string. Чтобы использовать класс, в программе должен быть включен заголовочный файл string. Класс string являются частью пространства имен std, поэтому необходимо указать директиву using иначе обращаться к классу по имени std::string. Определение класса скрывает природу строки как массива символов и позволяет трактовать ее как обычную переменную.

Пример обработки переменных типа string

#include <iostream>

#include <string> //string

void main ()

{

using namespase std;

char charr1[20]; //создали пустой массив

char charr2[20] = “jaguar”; //инициализированный массив

string str1, str3; //пустой строковый объект

string str2 = “panther”; //инициализированная строка

charr1 = charr2; //НЕПРАВИЛЬНО, присвоение массива невозможно

strcpy(charr1. charr2); //копирование charr2 в charr1

strcat(charr1. charr2); //добавить charr2 к концу charr1

str1 = str2; //ПРАВИЛЬНО, присвоение объектов допускается

str1 += “paste”; //конкатенация строк

str3 = str1 + str2; //конкатенация строк

str1 += str2; //конкатенация строк

strcat(charr1,”juice”); //конкатенация массива и строки

int len1 = str1.size(); //получить количество литеров в строке

int len2 = strlen(charr1); //получить количество литеров в массиве

cout<<”строка”<<str1<<”содержит”<,len1<<”символов.\n”;

cout<<”строка”<<charr1<<”содержит”<,len2<<”символов.\n”;

getline(cin.str1); cin.get(charr1,20).get();

cout<<”Длина строки str1 после ввода: ”<<str1.size()<<endl;

cout<<” Длина строки charr1 после ввода:”<<strlen(charr1)<<endl;

}

Структуры

Структура – составной тип данных, состоящий из фиксированного числа разнотипных компонентов, обеспечивающий иерархию данных.. Тип компонентов может быть любым. Структура объединяет логически связанные данные разных типов и представляет собой набор переменных, которые объединены общим именем.

Формат объявления структуры:

struct идентификатор_типа {объявления_элементов_структуры};

Например, необходимо иметь сведения о студенте: его Ф. И. О., номер группы, средний бал успеваемости:

struct tinfstud

{

char name[20];

char grup[6];

int bal;

}

Ключевое слово struct указывает на то, что этот код определяет план структуры. Идентификатор tinfstud - дескриптор этой формы, то есть идентификатор нового типа и им можно пользоваться как стандартными типами. Далее между фигурными скобками находится список переменных, которые будут содержаться в переменной типа структуры. Элементы структуры называют переменными-членами или полями данных. Полями данных могут быть и структуры. Они называются вложенные. Объявление структуры не резервирует пространство в ОП, оно лишь создает новый тип данных. Память выделяется при объявлении переменной типа структура (tinfstud).

Пример объявления переменной типа tinfstud:

tinfstud zap;

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

Пример обращения к элементам структуры:

zap.bal; zap. grup: zap.name;

Переменная типа структура может быть как статическая, так и динамическая. При организации динамической структуры оператор new захватывает ОП в соответствии с базовым типом.

Пример организации динамической структуры:

tinfstud *pz = new tinfstud;

Для доступа к элементам структуры через указатель на переменную служит операция стрелка (->). Обе операции (. и ->) помещаются между именем переменной типа структуры и идентификатором элемента структурного типа.

Пример программы с простой структурой

#include <iostream>

using namespace std ;

int main ( )

{

// объявление типа структуры

struct Address {

char city [ 20 ] ; // город

char street [ 30 ] ; // улица

int house ; // номер дома

} ;

// объявление переменной

Address a ;

// ввод значений элементов

cin >> a . city ; cin >> a . street ; cin >> a . house ;

// объявление указателя с инициализацией

Address *p = new Address ;

// ввод значений элементов

cin >> p -> city ; cin >> p -> street ; cin >> p -> house ;

// присваивание структур

Address copy ; copy = a ; copy = * p ;

return 0 ;

}

Пример иерархической структуры

#include <iostream>

using namespace std ;

int main ( )

{

// простые структуры

struct Address {

char city [ 20 ]; char street [ 30 ]; int house ;

} ;

struct Person {

char Fname [ 15 ] ; char Lname [ 20 ] ;

} ;

// иерархическая структура

struct Employee {

Person p ; // вложенная структура

Address addr ; // вложенная структура

} ;

// объявление переменной указателя

Employee *p = new Employee ;

// ввод значений элементов

cin >> p -> p . Fname ; cin >> p -> p . Lname ;

cin >> p -> addr . city ;

cin >> p -> addr . street ;

cin >> p -> addr . house ;

return 0 ;

}

Операции отношения (==, !=, >, <, и т.д.) над структурами недопустимы. Оператор присвоения (=) выполняется над однотипными структурами. Эта операция устанавливает значение каждого члена одной структуры равным каждому соответствующему члену другой структуры, доже если член является массивом Такой тип присвоения называется почтовым присвоением. Структуру целиком читают или записывают в файл. Структуру можно передавать в качества аргумента функции, и функция может использовать структуру в качестве возвращаемого значения. Во всех остальных случаях в структуре обрабатывается каждое поле отдельно операциями его типа. Ввод переменных-членов структур производится также в соответствии с типом.

Инициализация структур может быть выполнена в момент объявления переменной. Для этого в операторе объявления переменной необходимо после операции присвоения в фигурных скобках указать значения элементов в порядке их объявлении. Если структура является иерархической, то значения каждой вложенной переменной структуры заключаются в отдельные фигурные скобки. Если членом структуры является массив, то значения всех элементов массива должны быть последовательно указаны.

Пример инициализации переменных структурного типа

#include <iostream>

using namespace std ;

int main ( )

{

struct Time { int hour ; int minute ; int second ; } ;

struct Interval { Time top ; Time end ; } ;

// инициализация простой структуры

Time top = { 5, 30, 0 } ; Time end = { 15, 30, 45 } ;

// инициализация иерархической структуры

Interval i1 = { { 5, 30, 0 }, { 15, 30, 45 } } ;

// вывод структурной переменной i1

cout << i1.top.hour << ':' ;

cout << i1.top.minute << ':' ;

cout << i1.top.second << " - " ;

cout << i1.end.hour << ':' ;

cout << i1.end.minute << ':' ;

cout << i1.end.second << endl ;

// структура с элементом двумерный массив

struct Book { char author [ 2 ] [ 50 ] ; char title [ 100 ] ; } ;

// иерархическая структура

struct BookCard { int number ; Book book ; } ;

// инициализация структурной переменной

BookCard c = { 12, "Harvey M. Deitel", "Payl J. Deitel",

"C++ How to Program" } ;

// вывод структурной переменной

cout << c.number << " - " ;

cout << c.book.author [ 0 ] << ", " ;

cout << c.book.author [ 1 ] << "/ " ;

cout << c.book.title << endl ;

return 0 ;

}

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

Пример использования массива структур

#include <iostream>

using namespace std ;

// названия железных дорог

const char* pName [ ] = { "East-Siberian", "Far-East",

"October ", "Krasnoyarsk", "Moscow ", "Sakhalin",

"Northern", "Southeast", "Southern-Ural" } ;

// эксплуатационная длина железных дорог

double len [ ] = { 3848.1, 6000, 10143, 3157.9,

8984, 833.8, 5951.7, 4189.1, 4806.6 } ;

int main ( )

{

// вычисление размера массива len

int size = sizeof ( len ) / sizeof ( len [ 0 ] ) ;

// объявление структуры

struct Road { char name [ 30 ] ; double length ; } ;

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

Road roadArray [ 20 ] ;

// заполнение массива структур

int i = 0 ;

while ( i < size )

{

strcpy_s ( roadArray [ i ] . name, 30, pName [ i ] ) ;

roadArray [ i ] . length = len [ i++ ] ;

}

// объявление указателя на массив типа структуры

Road* pRailRoad = new Road [ size ] ;

// приравнивание массивов

for ( i = 0; i < size; i++ )

* ( pRailRoad + i ) = roadArray [ i ] ;

// вывод значений из массива с адресом pRailRoad

Road* p = pRailRoad ;

do

{

cout << p -> name << '\t' << p -> length << '\n' ;

p++ ;

} while ( p < pRailRoad + size ) ;

// вычисление общей длины дорог

double total = 0 ;

for ( i = 0, p = pRailRoad ; i < size; i++ )

total += p++ -> length ;

cout << "\nSummary length = " << total << endl ;

return 0 ;

}

Microsoft Visual C++, после версии 7.1, поддерживает инициализацию структур членами типа класса string. Для этого необходимо обеспечить доступ к пространству имен std.

Пример использования в структуре членов типа класса string:

# include <string>

struct inflatable

{

std :: string name;

float volume;

double price;

} zap;

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

Формат определения битового поля:

имя_типа имя_поля : количество бит;

# include <stdio.h>

void main ()

{

struct bits

{

int I : 2;

unsigned j : 6;

int k : 3;

unsigned l : 5;

} a; //a – переменная типа bits занимает 2 байта

}

Инициализация полей выполняется в обычной манере и использовать стандартную нотацию структур для доступа к битовым полям: a.i = 2; a.j = 9; a.k = 7; a.l = 5;

Эта организация применяется для создания структур данных, которые подходят для регистрации на некотором аппаратном устройстве.

Объединение – это формат данных, который может хранить разные типы данных в пределах одной области памяти, но в каждую единицу времени только один из них. Объединение используется в случае, если значения переменных объединения не используются одновременно, а поочередно, атак же для преобразования типов. Размер ОП определяется размером наибольшего поля.

Формат организации объединения:

union имя_типа

{

члены объединения

}има_переменной;

Пример организации переменной:

union tob

{

int vin;

long vlon;

double vdb;

} pail;

pail.vin =15;

Объединение может применяться в структуре как поле, которое в одной ситуации одного типа, а в другой – другого типа.

struct widget

{

char brand[20];

int type;

union id

{

long id_num;

char id_char[20];

} id_val;

} prize;

……………….

if (prize.type == 1) cin>>prize.id_val. id_num;

else cin>> prize.id_val. id_char;