Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

1.8.2 Класс string

Обрабатывать строки, используя класс string, пожалуй, проще и удобнее, чем использовать встроенные строки с завершающим нулём.

Для ввода переменных этого типа можно использовать функцию getline.

getline(cin, s);

Здесь s — имя вводимой переменной типа string.

При описании переменной типа string можно сразу её инициализировать.

Например: string v("Hello");

Доступ к элементам строки типа string осуществляется стандартным образом через индекс. Над строками типа string определены следующие операции:

  • присваивания, например s1=s2;

  • объединения строк (s1+=s2 или s1=s1+s2) — добавляет к строке s1 строку s2, результат сохранится в строке s1;

  • сравнения строк на основе лексикографического порядка: s1=s2, s1!=s2, s1<s2, s1>s2, s1<=s2, s1>=s2 — результатом будет логическое значение;

При обработке строк типа string можно использовать следующие методы (методов у класса string много, поэтому здесь представлены, на наш взгляд, используемые наиболее часто). Пусть sпроизвольная строка, тогда к каждому из методов обращаемся так:

s.имя_метода(параметры,_если_есть).

  • substr(pos, length) — возвращает подстроку из строки s, начиная с позиции pos длиной length символов;

  • empty() — возвращает значение true, если строка s пуста, false — в противном случае;

  • size(), length() – количество символов в строке (длина строки);

  • insert(pos, s1) — вставляет строку s1 в строку s, начиная с позиции pos;

  • erase(pos, length) — удаляет из строки s подстроку длиной length символов, начиная с позиции pos ;

  • find(s1, pos) — возвращает номер первого вхождения строки s1 в строку s, поиск начинается с номера pos, параметр pos может отсутствовать , в этом случае поиск идет с начала строки;

В качестве примера приведём последний (четвёртый!) вариант удаления пробелов из строки (примеры 1.7,1.8, 1.10). По лаконичности и наглядности текста, этот вариант, пожалуй, самый лучший. Но по эффективности безусловный лидер – вариант 1.8, в котором реализован собственный алгоритм обработки строки как массива символов.

//Пример 1.13 – удаление из строки пробелов

// с использованием типа string и его методов

#include <iostream>

#include <string>

using namespace std;

int main()

{

string s; int n=0;

cout<<"?"; getline(cin, s);

while ((n=s.find(" "))>=0) s.erase(n,1);

cout << s << endl;

system("pause"); return 0;

}

1.9 Структуры и объединения. Битовые поля

Для полноты изложения основ языка С++ кратко коснёмся структур (struct) и объединений (union). Это сложные типы данных, определяемые разработчиком в программе, обычно, с целью повышения её наглядности и удобства разработки.

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

Структура – сложный тип данных, который объединяет под общим именем переменные любых типов (они называются полями структуры). Объявляется следующим образом:

struct [имя_типа_структуры]

{

описание поля 1;

описание поля 2;

….

} [переменные_типа_структуры];

Определение структуры завершается точкой с запятой.

Можно опустить имя_типа_структуры или переменные_типа_структуры, но не то и другое сразу. Если переменные типа структуры не объявлены сразу при описании структуры, значит, они будут объявлены где-нибудь позже отдельным оператором. При описании структуру можно инициализировать, как и массив (используя фигурные скобки).

Например:

struct student

{

char name[30]; // фамилия студента

unsigned int mark; // оценка по программированию

};

Мы создали новый тип student, который теперь можно использовать, как и любой другой тип данных. Например, можно создать переменные этого типа:

student x, y={"Попов", 5};//переменные x и y имеют тип student,

// переменная y инициализирована, а x – не инициализирована

Для обращения к элементам структуры используется операция ‘.’:

cout << y.name << " " << <<y.mark << "\n";

При работе со структурами часто используются указатели. Например:

student *py=&y; // указатель на объявленную ранее структуру y

Имеется отдельный синтаксис обращения к элементам структуры через указатель на структуру – использование операции ‘->’. Например:

cout << py->name << " " << <<py->mark << "\n";

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

union [имя_типа_объединения]

{

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

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

….

} [переменные_объединения];

Например:

union int_char

{

int i;

char ch;

};

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

Доступ к элементам объединений осуществляется так же, как и к элементам структур, как показано в следующем примере:

// Пример 1.15 – выводим байты целого числа, используя union

union int_char

{

int i;

char ch[sizeof(int)];

};

int main(void)

{

int_char t;

t.i = 1;

for(int j=0;j<sizeof(int);j++)

cout << (int)t.ch[j]; //выводим значения отдельных байтов

}

Битовые поля. Язык C++ имеет удобные средства доступа к отдельны битам внутри байтов. Битовые поля могут быть объявлены только в структурах, объединениях и классах. Размер битового поля указывается через двоеточие при определении поля. Пример:

struct emp // структура сотрудник

{

char name[30];

unsigned lay_off: 1; //временно уволен или неактивен

unsigned hourly: 1; //почасовая оплата или оклад

unsigned deductions: 3; //вычеты

};

Здесь три последних поля хранятся в одном байте.

Ограничения на использование битовых полей:

  • нельзя получить адрес битового поля

  • нельзя создать битовое поле-массив

  • нельзя выходить за границы целого

1.10 Функции в С++ – основы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]