- •Сведения об авторах
- •1. Знакомство с языком С++
- •1.1 Первая программа на С++
- •1.2 Среда программирования Qt Creator
- •2. Общие сведения о языке С++
- •2.1 Алфавит языка
- •2.2 Данные
- •2.2.1 Символьный тип
- •2.2.2 Целочисленный тип
- •2.2.3 Вещественный тип
- •2.2.4 Логический тип
- •2.2.5 Тип void
- •2.3 Константы
- •2.4 Структурированные типы данных
- •2.5 Указатели
- •2.6 Операции и выражения
- •2.6.1 Операции присваивания
- •2.6.2 Арифметические операции
- •2.6.3 Логические операции
- •2.6.4 Операции отношения
- •2.6.5 Условная операция
- •2.6.6 Операция преобразования типа
- •2.6.7 Операция определения размера
- •2.6.8 Операции с указателями
- •2.7 Стандартные функции
- •2.8 Структура программы
- •2.9 Ввод и вывод данных
- •2.9.1 Функции ввода - вывода
- •2.10 Задачи для самостоятельного решения
- •2.10.2 Операции целочисленной арифметики.
- •2.10.3 Встроенные математические функции
- •3. Операторы управления
- •3.1 Основные конструкции алгоритма
- •3.2 Составной оператор
- •3.3 Условные операторы
- •3.3.1 Условный оператор
- •3.3.2 Оператор варианта
- •3.4 Операторы цикла
- •3.4.1 Оператор цикла с предусловием
- •3.4.2 Оператор цикла с постусловием
- •3.4.3 Оператор цикла с параметром
- •3.4.4 Операторы передачи управления
- •3.5 Решение задач с использованием циклов
- •3.6 Задачи для самостоятельного решения
- •3.6.1 Разветвляющийся процесс. Вычисление значения функции.
- •3.6.2 Разветвляющийся процесс. Попадание точки в плоскость.
- •3.6.3 Разветвляющийся процесс. Пересечение линий и решение уравнений.
- •3.6.4 Циклический процесс. Вычисление значений функции
- •3.6.6 Циклический процесс. Последовательности произвольных чисел
- •3.6.7 Циклический процесс. Работа с цифрами в числе
- •3.6.8 Вложенные циклы
- •4. Использование функций при программировании на С++
- •4.1 Общие сведения о функциях. Локальные и глобальные переменные
- •4.2 Передача параметров в функцию
- •4.3 Возврат результата с помощью оператора return
- •4.4 Решение задач с использованием функций
- •4.5 Рекурсивные функции
- •4.6 Перегрузка функций
- •4.7 Шаблоны функций
- •4.8 Область видимости переменных в функциях
- •4.9 Функция main(). Параметры командной строки
- •4.10 Задачи для самостоятельного решения
- •4.10.1 Применение функций при работе с последовательностями чисел
- •4.10.2 Применение функций для вычислений в различных системах счисления
- •4.10.3 Применение функций для решения нелинейных уравнений
- •5. Массивы
- •5.1 Статические массивы в С(С++)
- •5.1.1 Описание статических массивов
- •5.1.2 Основные операции над массивами
- •5.2 Динамические массивы в С(С++)
- •5.2.1 Функция malloc
- •5.2.2 Функция calloc
- •5.2.3 Функция realloc
- •5.2.4 Функция free
- •5.2.5 Операторы new и delete
- •5.3 Основные алгоритмы обработки массивов
- •5.3.2 Вычисление суммы элементов массива
- •5.3.3 Вычисление произведения элементов массива
- •5.3.4 Поиск максимального элемента в массиве и его номера
- •5.3.5 Удаление элемента из массива
- •5.3.6 Сортировка элементов в массиве
- •5.3.6.1 Сортировка методом «пузырька»
- •5.3.6.2 Сортировка выбором
- •5.3.6.3 Сортировка вставкой
- •5.4 Указатели на функции
- •5.5 Совместное использование динамических массивов, указателей, функций в сложных задачах обработки массивов
- •5.6.1 Основные операции при работе с массивами
- •5.6.2 Применение функций для обработки массивов.
- •5.6.3 Работа с группами элементов в массиве
- •5.6.4 Сортировка элементов массива
- •6. Статические и динамические матрицы
- •6.1 Статические матрицы С(С++)
- •6.2 Динамические матрицы
- •6.2.1 Использование указателей для работы с динамическими матрицами
- •6.2.2 Использование двойных указателей для работы с динамическими матрицами
- •6.3 Обработка матриц в С(С++)
- •6.4 Решение некоторых задач линейной алгебры
- •6.5 Задачи для самостоятельного решения
- •6.5.1 Основные операции при работе с матрицами
- •6.5.2 Работа со строками и столбцами матрицы
- •6.5.3 Решение задач линейной алгебры
- •7. Организация ввода-вывода в C++
- •7.1.2 Использование манипуляторов форматирования
- •7.2 Работа текстовыми файлами в C++
- •7.2.1 Запись информации в текстовый файл
- •7.2.2 Чтение информации из текстового файла
- •7.3 Обработка двоичных файлов
- •8. Строки в языке С++
- •8.1 Общие сведения о строках в С++
- •8.2 Операции над строками
- •8.3 Тип данных string
- •8.4 Задачи для самостоятельного решения
- •9. Структуры в языке С++
- •9.1 Общие сведения о структурах
- •9.2 Библиотеки для работы с комплексными числами
- •9.3 Задачи для самостоятельного решения
- •9.3.1 Структуры. Операции над комплексными числами
- •9.3.2 Работа с библиотекой комплексных чисел
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
250 |
8.Строки в языке С++
8.1Общие сведения о строках в С++
Строка – последовательность символов. Для работы с символами в языке С++ предусмотрен тип данных char. Если в выражении встречается одиночный символ, он
должен быть заключен в одинарные кавычки. При использовании в выражениях строка заключается в двойные кавычки. Признаком конца строки является нулевой символ '\0'. В С++ строки можно описать с помощью массива символов (массив элементов
типа char), в массиве следует предусмотреть место для хранения признака конца стро-
ки ('\0'). |
|
|
Например, |
//Описана строка |
из 25 символов. |
char s[25]; |
||
|
//Элемент s[25] предназначен |
|
|
//для хранения символа конца строки. |
|
char s[7]="Привет"; |
//Описана строка |
из 7 символов |
|
//и ей присвоено |
значение. |
// Определен массив из 3 строк //по 25 байт в каждой.
char m[3][25]={"Пример ", "использования", " строк"}
Для работы со строками можно использовать указатели (char *). Адрес первого
символа будет начальным значением указателя. |
|
|
Рассмотрим пример объявления и ввода строк. |
|
|
#include <iostream> |
|
|
using namespace std; |
|
|
int main() |
|
|
{ |
//Описываем 3 |
строки, |
char s2[20], *s3, s4[30]; |
||
cout<<"s2=";cin>>s2; |
//s3 - указатель. |
|
//Ввод строки |
s2. |
|
cout<<"s2="<<s2<<endl; |
//Запись в s3 |
адреса |
s3=s4; |
||
|
//строки s4. Теперь в |
|
|
//указателях s3 и s4 |
|
cout<<"s3="; cin>>s3; |
//хранится один адрес. |
|
//Ввод строки |
s3. |
cout<<"s3="<<s3<<endl; |
//Вывод на экран |
s3 и s4, |
cout<<"s4="<<s4<<endl; |
//s3 и s4 – одно |
и тоже. |
return 0; |
|
|
} |
|
|
Если запустить программу на выполнение, то в консольное окно приложения будет аналогичным, приведенному на рис. 8.1.
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
251 |
Рисунок 8.1. Окно программы ввода-вывода строк
Однако, если во вводимых строках появятся пробелы, программа будет работать не так, как ожидает пользователь (рис. 8.2).
Рисунок 8.2.Окно программы при вводе строк с пробелами
Дело в том, что функция cin вводит строки до встретившегося пробела. Более
универсальной функцией являет функция
cin.getline(char *s, int n);
она предназначена для ввода с клавиатуры строки s с пробелами, в строке не должно быть более n символов. Следовательно, для корректного ввода строк, содержащих пробел, необходимо в нашей программе заменить cin>>s на cin.getline(s,80).
8.2Операции над строками
Строку можно обрабатывать как массив символов, используя алгоритмы обработки массивов, или с помощью специальных функции обработки строк, некоторые из которых приведены в табл. 8.1-8.2.
Таблица 8.1. Функции работы со строками, библиотека string.h
Прототип функции |
Описание |
|
Пример |
Результат |
|
|
функции |
|
использования |
|
|
|
|
|
|
||
size_t strlen(const |
Вычисляет длину |
char s[80]; |
s=Hello, Russia! |
||
char *s) |
строки s в байтах |
cout<<"s="; |
s=Hello, Russia! |
||
|
|
|
|
cin.getline(s,80); |
Длина строки 14 |
|
|
|
|
cout<<"s="<<s<<endl |
|
|
|
|
|
<<"Длина строки\t" |
|
|
|
|
|
<<strlen(s)<<endl; |
|
char *strcat(char |
Присоединяет |
|
char s1[80],s2[80]; |
s1=Hello, |
|
*dest, |
строку |
src |
в |
cout<<"s1="; |
s2=Russia! |
const char *scr) |
конец |
строки |
cin.getline(s1,80); |
s=Hello, Russia! |
|
|
dest, |
|
|
cout<<"s2="; |
|
|
полученная |
|
cin.getline(s2,80); |
|
|
|
строка |
|
|
cout<<"s="<< |
|
|
возвращается |
в |
strcat(s1,s2); |
|
|
|
качестве |
|
|
|
|
|
результата |
|
|
|
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
252 |
||||||
|
|
|
|
|
|
||
Прототип функции |
Описание |
|
Пример |
Результат |
|
||
|
функции |
|
использования |
|
|
||
char *strcpy(char |
Копирует строку |
char |
s1=Hello,Russia! |
||||
*dest, |
src |
в |
место |
s1[80],s2[80] ; |
s2=Hello,Russia! |
||
const char *scr) |
памяти, |
|
на |
cout<<"s1="; |
|
|
|
|
которое |
|
|
cin.getline(s1,80); |
|
|
|
|
указывает dest |
|
strcpy(s2,s1); |
|
|
||
|
|
|
|
|
cout<<"s2="<<s2; |
|
|
char *strncat(char |
Присоединяет |
|
char s1[80],s2[80]; |
s1=Hello, |
|
||
*dest, |
строку |
maxlen |
cout<<"s1="; |
s2=Russia! |
|
||
const char *dest, |
символов строки |
cin.getline(s1,80); |
s=Hello, Russia |
||||
size_t maxlen) |
src |
в |
конец |
cout<<"s2="; |
|
|
|
|
строки dest |
|
cin.getline(s2,80); |
|
|
||
|
|
|
|
|
cout<<"s="<< |
|
|
|
|
|
|
|
strncat(s1,s2,6); |
|
|
char *strncpy(char |
Копирует |
|
|
char |
s1=Hello,Russia! |
||
*dest, |
maxlen |
|
|
s1[80],s2[80] ; |
s2=Hello |
|
|
const char *scr, |
символов строки |
cout<<"s1="; |
|
|
|||
size_t maxlen) |
src |
в |
место |
cin.getline(s1,80); |
|
|
|
|
памяти, |
|
на |
strncpy(s2,s1,5); |
|
|
|
|
которое |
|
|
cout<<"s2="<<s2; |
|
|
|
|
указывает dest |
|
|
|
|||
int strcmp(const |
Сравнивает |
две |
char |
s1=RUSSIA |
|
||
char *s1, |
строки |
|
|
в |
s1[80],s2[80] ; |
s2=Russia |
|
const char *s2) |
лексикографичес |
cout<<"s1="; |
-1 |
|
|||
|
ком порядке |
с |
cin.getline(s1,80); |
|
|
||
|
учетом различия |
cout<<"s2="; |
|
|
|||
|
прописных |
|
и |
cin.getline(s2,80); |
|
|
|
|
строчных |
букв, |
cout<<strcmp(s1,s2) |
|
|
||
|
функция |
|
|
<<endl; |
|
|
|
|
возвращает |
|
0, |
|
|
|
|
|
если |
строки |
|
|
|
||
|
совпадают, |
|
|
|
|
|
|
|
возвращает |
|
-1, |
|
|
|
|
|
если |
|
|
s1 |
|
|
|
|
располагается |
в |
|
|
|
||
|
упорядоченном |
|
|
|
|||
|
по |
алфавиту |
|
|
|
||
|
порядке раньше, |
|
|
|
|||
|
чем s2, и 1 в |
|
|
|
|||
|
противоположно |
|
|
|
|||
|
м случае. |
|
|
|
|
|
|
int strncmp(const |
Сравнивает |
|
|
char |
s1=Hello,Russia! |
||
char *s1, |
maxlen |
|
|
s1[80],s2[80] ; |
s2=Hello, |
|
|
const char *s2, |
символов |
двух |
cout<<"s1="; |
0 |
|
||
size_t maxlen) |
строк |
|
|
в |
cin.getline(s1,80); |
|
|
|
лексикографичес |
cout<<"s2="; |
|
|
|||
|
ком |
порядке, |
cin.getline(s2,80); |
|
|
||
|
функция |
|
|
cout<< |
|
|
|
|
возвращает |
|
0, |
strncmp(s1,s2,6); |
|
|
|
|
если |
строки |
|
|
|
||
|
совпадают, |
|
|
|
|
|
|
|
возвращает |
|
-1, |
|
|
|
|
|
если |
|
|
s1 |
|
|
|
|
располагается |
в |
|
|
|
||
|
упорядоченном |
|
|
|
|||
|
по |
алфавиту |
|
|
|
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
253 |
|||||
|
|
|
|
|
||
Прототип функции |
Описание |
Пример |
Результат |
|
||
|
функции |
использования |
|
|
||
|
порядке |
раньше, |
|
|
|
|
|
чем s2, и 1 – в |
|
|
|
||
|
противоположно |
|
|
|
||
|
м случае. |
|
|
|
|
|
Таблица 8.2. Функции работы со строками, библиотека stdlib.h |
||||||
Прототип функции |
Описание |
Пример |
Результат |
|
||
|
функции |
использования |
|
|
||
double atof(const |
Преобразует |
char a[10]; |
a=23.57 |
|
||
char*s) |
строку |
|
в |
cout<<"a="; |
|
|
|
вещественное |
cin>>a; |
a=23.57 |
|
||
|
число, |
в |
случае |
cout<<"a="<<atof(a) |
|
|
|
неудачного |
|
<<endl; |
|
|
|
|
преобразования |
|
|
|
||
|
возвращается |
|
|
|
||
|
число 0.0 |
|
|
|
|
|
int atoi(const char*s) |
Преобразует |
char a[10]; |
a=23 |
|
||
|
строку |
в |
целое |
cout<<"a="; |
|
|
|
число, |
в |
случае |
cin>>a; |
a=23 |
|
|
неудачного |
|
cout<<"a="<<atoi(a) |
|
||
|
преобразования |
<<endl; |
|
|
||
|
возвращается |
|
|
|
||
|
число 0 |
|
|
|
|
|
long atol(const char*s) |
Преобразует |
char a[10]; |
a=23 |
|
||
|
строку в длинное |
cout<<"a="; |
|
|||
|
целое |
число, в |
cin>>a; |
a=23 |
|
|
|
случае |
|
|
cout<<"a="<<atol(a) |
|
|
|
неудачного |
|
<<endl; |
|
|
|
|
преобразования |
|
|
|
||
|
возвращается |
|
|
|
||
|
число 0 |
|
|
|
|
|
Для преобразования числа в строку можно воспользоваться функцией sprintf |
||||||
из библиотеки stdio.h. |
sprintf(s, s1, s2); |
|
|
|||
|
|
|
||||
Она аналогична описанной ранее функции printf, отличие состоит в том, что |
||||||
осуществляется вывод не на экран, а в выходную строку s. |
|
|
8.3Тип данных string
Кроме работы со строками, как с массивом символов, в C++ существует специальный тип данных string. Для ввода переменных этого типа можно использовать cin50
или специальную функцию:
getline(cin,s);
Здесь s – имя вводимой переменной типа string.
При описании переменной типа string можно сразу присвоить значение этой
переменной.
string var(s);
Здесь var – имя переменной типа string, s – строковая константа. В результате
50 При работе c cin, как отмечалось ранее, ввод осуществляется до пробела.
Алексеев Е.Р., Чеснокова О.В. Самоучитель по программированию на C/C++. |
254 |
этого оператора создается переменная var типа string и в нее записывается значение
из строковой константы s. Например,
string v("Hello");
Создается строка v, в которую записывается значение Hello.
Доступ к i-му элементу строки осуществляется стандартным образом:
имя_строки[номер_элемента];
Над строками типа string определены следующие операции:
•присваивания, например s1=s2;
•объединение строк (s1+=s2 или s1=s1+s2) – добавляет к строке s1 строку s2, результат хранится в строке s1, например:
#include <iostream> #include <string> using namespace std; int main()
{
string a,b;
cout<<"a="; getline(cin,a); cout<<"b="; getline(cin,b); a+=b;
cout<<"a="<<a<<endl; return 0;
}
•сравнение строк на основе лексикографического порядка: s1==s2, s1!=s2, s1<s2, s1<=s2, s1>s2, s1>=s2 – результатом операций сравнения будет ло-
гическое значение;
При обработке строк типа string можно использовать следующие функции51: s.length() – возвращает длину строки s;
s.substr(pos, length) – возвращает подстроку из строки s, начиная с номера pos длиной length символов;
s.empty() – возвращает значение true, если строка s пуста, false – в про-
тивном случае;
s.insert(pos, s1) – вставляет строку s1 в строку s, начиная с позиции pos; s.remove(pos, length) – удаляет из строки s подстроку length длиной
pos символов;
s.find(s1, pos) – возвращает номер первого вхождения строки s1 в строку s, поиск начинается с номера pos, параметр pos может отсутствовать, в этом случае
поиск идет с начала строки;
s.findfirst(s1, pos) – возвращает номер первого вхождения любого символа из строки s1 в строку s, поиск начинается с номера pos, параметр pos может отсутствовать, в этом случае поиск идет с начала строки.
ЗАДАЧА 8.1. Некоторый текст хранится в файле text.txt. Подсчитать количество строк и слов в тексте.
Предлагаем читателю самостоятельно разобраться в приведенном программном
коде. Результаты работы программы показаны на рис. 8.3.
#include <iostream> #include <fstream>
51 В описанных ниже функциях строки s и s1 должны быть типа string.