У вас вопросы?
У нас ответы:) SamZan.net

практикуму СТРОКИ по курсу ПРОГРАММИРОВАНИЕ 2010 МИНСК

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 28.12.2024

      

БЕЛОРУССКИЙ     ГОСУДАРСТВЕННЫЙ    УНИВЕРСИТЕТ

факультет  радиофизики  и   электроники

кафедра  информатики

Н.В. Серикова

ПРАКТИЧЕСКОЕ       РУКОВОДСТВО

к  лабораторному практикуму

«СТРОКИ»

по курсу

«ПРОГРАММИРОВАНИЕ»

2010

МИНСК


Практическое руководство к лабораторному практикуму «СТРОКИ» по курсу «ПРОГРАММИРОВАНИЕ» предназначено для  студентов, изучающих базовый курс программирования на языке С++, специальностей «Радиофизика», «Физическая электроника», «Компьютерная безопасность».

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

Все примеры протестированы  в среде Microsoft Visual Studio 2005.

Автор будет признателен всем, кто поделится своими соображениями по совершенствованию данного пособия.

Возможные предложения и замечания можно присылать по адресу:

E-mail: Serikova@bsu.by,  


ОГЛАВЛЕНИЕ


Строки  

Строка  – последовательность символов кодовой таблицы ПЭВМ, обрабатываемая как единая  структура. Строка может включать буквы, цифры и разнообразные специальные символы.

Такая последовательность должна быть ограничена, то есть нужно знать, где она заканчивается. Есть два варианта связать со строкой ее размер:  хранить его, либо ограничить строку специальным символом (элементом последовательности), дойдя до которого мы будем знать, что достигли конца. 

Языки программирования имеют различные типы данных для представления строк и библиотеки функций для работы со строками.

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

Элементом строки является символ.

Количество символов в строке определяет длину  и размер строки.

Размер строки - общая длина строки, которая характеризует размер памяти, выделяемый строке при описании.

Длина строки - текущая длина строки (всегда меньше или равна размеру строки), которая показывает количество  символов строки в каждый конкретный момент времени.

В каждом языке программирования существует функция для определения текущей длины строки. Размер строки всегда больше, чем длина  строки. Это связано с тем, что в памяти, отводимой для строковой переменой, дополнительно хранится либо размер строки, либо нуль-символ.

Нуль-символ (\0) отмечает конец нуль-терминированной строки. Хотя нуль-символ записывается в виде двух символов, компилятор его интерпретирует как один символ, который может храниться в переменной символьного типа.

Строка, в которой нет символов, называется пустой. Длина пустой строки равна 0. Размер пустой строки равен 1. В  языках программирования существует разница между символом и строкой длинны  1 символ.

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

Инициализация строковой переменной может происходить при объявлении или непосредственно в программе. Размер инициализирующей строки не должен превышать максимальной длины строковой переменной.

Операции сравнения  выполняются над строками в лексикографическом порядке.

Лексикографический порядок – порядок сравнения строк, принятый во многих языках программирования.

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

Кодировка (кодовая таблица) - это однозначное соответствие между целым число (кодом) и символом. Кодировки обычно составляют так, что символы следуют в алфавитном порядке и символ 'а' имеет наименьший код, а символ 'z' наибольший. Таким образом, выполняя лексикографическое сравнение строк можно разместить их в алфавитном порядке.


Строки символов в С++

Способы представления строк символов в C++

  •  в виде одномерного массива символов (строки, завершающиеся нулевым байтом) - С-строки;
  •  в виде объекта класса string;
  •  другие способы в зависимости от реализации.


С-Строки (завершающиеся нулевым байтом)              

  •  Описываются как одномерный массив, каждый элемент которого имеет тип char.
  •  Символы строки последовательно располагаются в элементах  массива, начиная с нулевого.
  •  В элемент массива, следующий за последним символом  автоматически записывается элемент с ASCII кодом  0: ‘\0’

Описание строк, завершающихся нулевым байтом

  •  Строка описывается как обычный массив символов char 

  •  

  char s [] = “Hello”;
  char s [6] = “ Hello”;

  char s [6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};

  •  Размер массива должен быть на 1 больше длины самой длинной строки, которую предполагается в этом массиве хранить

 

 char s[10] = “Hello”;

Основные отличия строк, завершающих нулевым байтом, от массивов

  •  В процессе выполнения программы отслеживается текущая длина строки.
  •  Строка в целом может быть проинициализирована значением строкового литерала  (а не только поэлементно символьными значениями).

  •  При помещении идентификатора символьного массива в поток cout  выводится не адрес массива, а его содержимое от 0-го элемента до последнего перед  завершающим символом  \0.  

Основные ограничения на действия со строками,

завершающимися нулевым байтом (С-строками)

  •  Строки, как и обычные массивы, нельзя присваивать друг другу, используя оператор присваивания (включая присвоение строке строкового литерала где-либо, кроме начальной инициализации).
  •  К строкам, как к обычным массивам, нельзя применять операции сравнения.
  •  Для строк нет перегруженных операций (например, + для операции конкатенации).
  •  Для выполнения операций копирования, конкатенации, сравнения строк и ряда других операций приходится использовать встроенные функции, описанные в заголовке <string.h>

.


 
Функции  преобразования (С-строки)

STDLIB.H

ИМЯ ФУНКЦИИ

ЗАПИСЬ

ОПИСАНИЕ

1

аtof

double atof(char *str)

Преобразует строку str в вещественное число

2

atoi

int  atoi(char *str)

Преобразует строку str в десятичное число

3

аtol  

long atol (char *str)

Преобразует строку str в длинное десятичное число

4

fcvt

_fcvt_s

char* fcvt

(double value,

int count,

int *dec,

int *sign )

 

errno_t  _fcvt_s

(  char* buffer,

  size_t sizeInBytes,

  double value,

  int count,

  int *dec,

  int *sign )

Преобразует число с плавающей точкой типа  value в строку.

результат – строка, содержащая результат конвертации.

value – число для конвертации.

count – число цифр после запятой.

dec – количество цифр целой части.

sign – знак числа (0 или 1)

Преобразует число с плавающей точкой типа  value в строку buffer.

В случае успеха – возвращает значение 0.

buffer – строка, содержащая результат конвертации.

sizeInBytes – размер строки buffer в байтах.

value – число для конвертации.

count – число цифр после запятой.

dec – количество цифр целой части.

sign – знак числа (0 или 1)

5

itoa

_itoa_s

char * itoa (int v,

char *str, int baz)

char * _itoa_s (int v, char *str, int baz)

Преобразует целое v в строку str.

baz – основание системы счисления 2<=baz<=36.

6

ltoa

_ltoa_s

char * ltoa (long v,

char *str, int baz)

char * _ltoa_s (long v, char *str, int baz)

Преобразует длинное целое v в строку str .

baz – основание системы счисления 2<=baz<=36.

7

strtod

double strtod (char *str1,  char **str2)

Преобразует строку str1 в вещественное число,  параметр str2  возвращает указатель на первый символ, который не может быть интерпретирован как часть числа (= NULL, если преобразование выполнено корректно).

8

strtol

long strtol (char *str1,  char **str2, int base)

Преобразует строку str1 в десятичное целое по основанию base,  параметр str2  возвращает указатель на первый символ, который не может быть интерпретирован как часть числа  

(= NULL, если преобразование выполнено корректно).

9

ultoa

_ultoa_s

сhar *ultoa(unsigned long v, char *str, int baz)

сhar *_ultoa_s(unsigned long v, char *str, int baz)

Преобразует беззнаковое длинное целое v в строку str .

baz – основание системы счисления 2<=baz<=36.


Функции  для работы с С-строками

STRING.H

ИМЯ ФУНКЦИИ

ЗАПИСЬ

ОПИСАНИЕ

1

strcat

char* strcat (char *str1,  char *str2)

Выполняет конкатенацию (объединение) строк,  записывая результат по адресу первого аргумента.

strcat_s

errno_t  strcat_s  (char *str1, size_t n,  char *str2)

Выполняет конкатенацию (объединение) строк,  записывая результат по адресу первого аргумента. n - размер строки str1.

2

strchr

char * strchr (char *str, char c)

Находит в строке str первое вхождение символа c. Если его нет, то возвращает NULL.

3

strcmp

int strcmp (char *str1, char *str2)

Сравнивает строки str1 и str2.

Результат <0, если str1<str2,

=0 если str1=str2,   >0, если str1>str2

4

strcpy

strcpy_s

char * strcpy(char *str1,  char *str2)

char* strcpy_s (char *str1, size_t n,  char *str2)

Копирует строку str2 в строку str1

Копирует строку str2 в строку str1. n - размер строки str1.

5

strcspn

int strcspn( char *str1,  char *str2)

Определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2. Если его нет, то возвращает NULL.

6

strdup

_strdup

char* strdup (char *str)

char* _strdup (char *str)

Дублирование строки str с выделением ей памяти

7

strlen

unsigned  int strlen (

char *str)

Вычисляет длину строки str , не включая нуль-символ.

8

strlwr

_strlwr_s

char* strlwr (char *str)

char* _strlwr_s (char *str, size_t n)

Преобразует буквы верхнего регистра в строке  str в буквы нижнего регистра

Преобразует буквы верхнего регистра в строке  str в буквы нижнего регистра. n - размер строки str.

9

strncat

strncat_s

char * strncat( char *str1,  char *str2, int  kol)

errno_t strncat_s( char *str1, size_t n,  char *str2, int  kol)

Приписывает kol символов строки  str2 к строке str1.

Приписывает kol символов строки  str2 к строке str1. n - размер строки str1.

10

strncmp

int strncmp(char *str1,  char *str2, unsigned int kol)

Сравнивает строки str1 и str2., причем рассматриваются только первые kol символов. Результат <0, если str1<str2, =0 если str1=str2,  >0, если str1>str2

11

strncpy

char * strncpy (char *str1,  char *str2,       unsigned int kol)

Копирует kol символов строки str2 в строку str1.

Функция не выполняет ни усечения, ни заполнение строки.

12

strpbrk

char * strpbrk (char *str1,  char *str2)

Находит в строке  str1 первое появление любого из множества символов, входящих в строку str2. Если его нет, то возвращает NULL.

13

strrchr

char * strrchr( char *str, char c)

Находит в строке str последнее вхождение символа c. Если его нет, то возвращает NULL.

14

strrev

char * strrev( char *str)

Инвертирование (реверс) строки str

15

strspn

int strspn( char *str1,  char *str2)

Определяет длину первого сегмента строки str1, содержащего символы, входящие во множество символов строки str2. Если его нет, то возвращает NULL.

16

strstr

char *strstr (char *str1,  char *str2)

Определяет адрес первого вхождения в строку str1 подстроки str2. Если подстрока  не найдена, то возвращается указатель NULL.

17

strtok

char * strtok(char *str1,  char *str2)

Функция  разбивает  переданную  ей строку (первый аргумент вызова) на лексемы  в соответствии с заданным набором разделителей  (второй аргумент). Функция возвращает  указатель  на  первую  из  найденных  лексических  единиц    или  значение NULL,  если  таких  единиц  в  строке-аргументе нет. После выделения лексической единицы из аргумента str1 непосредственно за ней размещается символ с нулевым кодом. Функция изменяет разбиваемую на лексемы строку.

strtok_s

char * strtok_s (char *str1,  char *str2,

char** sm)

Функция  разбивает  переданную  ей строку (первый аргумент вызова) на лексемы  в соответствии с заданным набором разделителей  (второй аргумент). Функция возвращает  указатель  на  первую  из  найденных  лексических  единиц    или  значение NULL,  если  таких  единиц  в  строке-аргументе нет. После выделения лексической единицы из аргумента str1 непосредственно за ней размещается символ с нулевым кодом. Функция изменяет разбиваемую на лексемы строку.

sm – используется для хранения информации во время вызова функции. (Указатель на ячейку памяти)

18

strupr

_strupr_s

char* strupr (char *str)

char* _strupr_s (char *str, size_t n)

Преобразует буквы нижнего регистра в строке  str в буквы верхнего регистра

Преобразует буквы нижнего регистра в строке  str в буквы верхнего регистра. n - размер строки str.


Функции для работы со строками

Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом. Присваивание выполняется с помощью функций стандартной библиотеки strcpy или strncpy  или посимвольно «вручную».

Функция strcpy (char *s1, char *s2)  копирует все символы строки, указанной вторым параметром, включая завершающий 0, в строку, указанную первым параметром.

Функция strncpy (char *s1, char *s2, n) выполняет то же самое, но не более n символов. Если нуль-символ встретился в исходной строке раньше, то копирование прекращается, а оставшиеся до n символы строки s2  заполняются нуль-символами. В противном случае (если n меньше или равно длине строки s1) завершающий нуль-символ в s2 не добавляется.

Функция strlen(char *s) возвращает фактическую длину строки s, не включая нуль-символ.

Функции strcat и strncat используются для объединения строк.

Функция strcat (char *s1, char*s2) добавляет копию строки s2, включая завершающий нуль-символ, в конец строки s1. Первый символ строки  s2  размещается в байте, в котором был записан  нуль-символ строки s1.   Если строка  s1  заполнена, а  s2  –  не нулевая строка,     то  вызов    strcat (s1, s2);    перезапишет конец  строки. Следите  за длиной результирующей строки при конкатенации строк при вызове  функции  strcat (. . .).  

Функция strncat(char *s1, char *s2, n) позволяет добавить не более чем n символов строки s2 в конец строки s1. 

Функция strcmp (char *s1, char *s2) позволяет сравнить 2 строки. Функция возвращает 0, если строки равны, отрицательное значение, если первая строка меньше, чем вторая, и положительное значение, если первая строка больше, чем вторая. Функция strncmp (char *s1, char *s2, n) проводит сравнение только первых n символов двух строк.

Функции stricmp и strnicmp позволяют сравнивать строки без учета регистра, т.е. без различия между прописными и строчными буквами.

Функция     strchr (const   char  *s,  int  c)  реализует поиск одиночного символа в строке. Она  возвращает значение NULL, если символ-аргумент в строке  не найден, иначе  возвращает указатель на этот символ.  

Функция  strcspn (char *s1, char *s2) - определяет и возвращает длину начальной части строки s1, состоящей из символов, не содержащихся в строке s2.

Функция  strspn (const char *s1, const char *s2) - определяет и возвращает длину начальной части строки s1, состоящей только из символов, содержащихся в строке s2.

Функция strpbrk (char *s1, char *s2) - определяет позицию первого вхождения в строку s1 любого из символов строки s2. Если символ не найден, то возвращается указатель NULL.

Функция strstr (char *s1, char *s2) - определяет позицию первого вхождения в строку s1 подстроки s2. Если подстрока  не найдена, то возвращается указатель NULL.

Функция    char*   strtok  (char  *s1,  const  char  *s2)   интерпретирует строку  s1  как последовательность лексических единиц (слов), разделенных ограничителями,  которые заданы в строке-аргументе, соответствующей параметру  s2. Функция возвращает  указатель  на  первую  из  найденных  лексических  единиц    или  значение NULL,  если  таких  единиц  в  строке-аргументе нет. После выделения лексической единицы из аргумента s1 непосредственно за ней размещается символ с нулевым кодом. Таким  образом,  функция  разбивает  переданную  ей строку (первый аргумент вызова) на лексемы  в соответствии с заданным набором разделителей  (второй аргумент).  Эту функцию можно использовать для выделения в строке лексем-слов.  Функция изменяет разбиваемую на лексемы строку, поэтому необходимо позаботиться о предварительном сохранении строки.

Функции для работы со строками

для Microsoft Visual Studio 2005

Функции

strcpy_s  (char *s1, size_t n, char* s2)  

strcat_s   (char *s1, size_t n, char* s2)

strncat_s (char *s1, size_t n, char *s2, k)

_strlwr_s ( char *s1, size_t n)

_strupr_s( char *s1, size_t n)

аналогичны предыдущим функциям, n – размер строки s1. Как правило возвращают  0, если функция выполняется корректно.

Функция  strtok_s  (char  *s1,  const  char  *s2, char** sm)   аналогична функции strtok. Причем sm  содержит начало следующей лексемы строки.


Ввод С-строк 

При вводе строки с клавиатуры (помещение в поток cin) следует контролировать длину вводимой строки (чтобы она не превышала длину массива, где будет храниться строка

const int MAX=100;

 char str[MAX];

cin >> setw (MAX) >> str;  // Ввод до MAX-1 символов

При помещении строки в поток cin пробелы и символы новой строки конвертируются в завершающий нулевой байт

const int MAX=100;

char str [MAX];

   cin >> setw (MAX) >> str;  

              // Введем строку "Good Morning"

cout << str;                // Получим "Good"

Чтобы ввести строку, содержащую пробелы, необходимо вызвать встроенную функцию getline для потока cin:

char str [MAX];

cin.getline (str, MAX);

или  можно задать свой разделитель строк:

char str [MAX];

char SEP = '$';   

              // Задаем свой разделитель строк  

cin.getline (str, MAX, SEP);      


Строки стандартного класса string

Язык С++ включает в себя новый класс, называемый string. Этот класс во многом улучшает традиционный строковый тип, позволяет обрабатывать строки также как данные других типов, а именно с помощью операторов. Он более эффективен и безопасен в использовании, не нужно заботиться о создании массива нужного размера для строковой переменной, класс string берет на себя ответственность за управлением памятью.

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

Для работы со строками класса string существует множество методов и операций.

Объявление и инициализация строк string.

                    //создаем пустую строку

                    //вызов конструктора без аргументов

string s1;       

                 // создаем строку из C-строки

                 //вызов конструктора с одним аргументом

string s2("aaaa");

// string s2 = "aaaa";   // или так

           // создаем строку из C-строки 10 символов

            //вызов конструктора с двумя аргументами

string s3("abcdefghijklmnopqrstuvwxyz",10);

           // создаем строку из 5 одинаковых символов

string s4(5,’!’);

              // создаем строку-копию из строки s3

string  s5(s3);

            // создаем строку-копию из строки s3

            //  начиная с индекса 5 не более 3 символов

string  s6(s3,5,3);


Методы  для работы со строками класса string

МЕТОД

ЗАПИСЬ

ОПИСАНИЕ

1

at

at (unsigned  n)

доступ к n-му элементу строки

2

append

append (string &str)

добавляет строку str к концу вызывающей строки

(тоже, что оператор + )

append (string &str, unsigned  pos, unsigned  n);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

добавляет к вызывающей строке n символов строки str, начиная с позиции pos

append ( char  *sr, unsigned  n);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

добавляет к вызывающей строке n символов С-строки s

3

assign

assign (string &str)

присваивает строку str вызывающей строке (тоже, что   s2=s1)

assign ( string &str, unsigned  pos, unsigned  n);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

присваивает вызывающей строке n символов строки str, начиная с позиции pos

assign ( char  *sr, unsigned  n);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

присваивает вызывающей строке n символов C-строки s

4

capacity

unsigned int capacity ();

возвращает объем памяти, занимаемый строкой

5

compare

int compare (string &str);

сравнение двух строк, возвращает значение <0, если вызывающая строка лексикографически меньше str, =0, если строки равны и >0, если вызывающая строка больше

int compare (string &str, unsigned  pos, unsigned  n);

сравнение со строкой str n символов вызывающей строки, начиная с позиции pos; возвращает значение <0, если вызывающая строка лексикографически меньше str, =0, если строки равны и >0, если вызывающая строка больше

int compare (unsigned  pos1, unsigned  n1, string &str, unsigned  pos2, unsigned  n2);

n1 символов вызывающей строки, начиная с позиции pos1, сравниваются с подстрокой строки str длиной n2 символов, начиная с позиции pos2; возвращает значение <0, если вызывающая строка лексикографически меньше str, =0, если строки равны и >0, если вызывающая строка больше

6

copy

unsigned int copy  (char  *s, unsigned  n, unsigned pos = 0);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

копирует в символьный массив s   n элементов вызывающей строки, начиная с позиции pos; нуль-символ в результирующий массив не заносится; метод возвращает количество скопированных элементов

7

c_str

char *  c_str()

возвращает указатель на С-строку, содержащую копию вызываемой строки; полученную С-строку нельзя  изменить

8

empty

bool  empty();

возвращает истину, если строка пустая

9

erase

erase (unsigned  pos = 0, unsigned n = npos);

удаляет n элементов, начиная с позиции  pos (если n не задано, то удаляется весь остаток строки)  npos-самое большое число >0 типа unsigned

10

find

unsigned int find (string &str, unsigned pos = 0);

ищет самое левое вхождение строки str в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned , если вхождение не найдено

unsigned find (char c, unsigned  pos = 0);

ищет самое левое вхождение символа с в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned, если вхождение не найдено

unsigned rfind (char c, unsigned pos = 0);

ищет самое правое вхождение символа с в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned, если вхождение не найдено

11

find_last_of

unsigned  find_last_of (string  &str, unsigned  pos = 0);

ищет самое правое вхождение любого символа строки str в вызывающей строке, начиная с позиции pos; возвращает позицию вхождения, или npos(самое большое число >0 типа unsigned, если вхождение не найдено

12

insert

insert (unsigned  pos,  string    &str);

вставляет строку str в вызывающую строку, начиная с позиции pos

insert (unsigned  pos1,  string  &str, unsigned pos2,

unsigned  n);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

вставляет в вызывающую строку, начиная с позиции pos1 n символов строки str, начиная с позиции pos2

insert (unsigned pos,  char * sr, unsigned  n);

вставляет в вызывающую строку n символов C-строки s, начиная с позиции pos

13

length

unsigned  length ();

возвращает размер строки

14

max_size

unsigned  max_size();

возвращает максимальную длину строки

15

replace

replace (unsigned  pos,  unsigned  n, string &str);

заменяет n элементов, начиная с позиции pos вызывающей строки, элементами строки str

replace (unsigned  pos1,  unsigned  n1, string &str, unsigned  pos2,  unsigned  n2);

заменяет n1 элементов, начиная с позиции pos1 вызывающей строки, n2 элементами строки str, начиная с позиции pos2  

replace (unsigned  pos,  unsigned  n1, char  *s,   unsigned  n2);

заменяет n1 элементов, начиная с позиции pos вызывающей строки, n2 элементами C-строки s  

16

size

unsigned  size();

возвращает размер строки

17

substr

string substr(unsigned  pos = 0, unsigned  n = npos);

выделяет подстроку длиной n из исходной строки, начиная с позиции pos

18

swap

swap (string &str)

обменивает содержимое вызывающей строки и строки str


Операции для работы со строками класса string

оператор

ЗАПИСЬ

        string s1,s2,s3;

ОПИСАНИЕ

1

+

s3 = s1+ s2;

конкатенация (сцепление) строк, можно присоединить единичный символ к строке

2

+=

s1 += s2;

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

3

=

s2 = s1;

присваивание

4

==

s2 == s1

лексикографическое сравнение на равенство строк

5

!=

s2 != s1

лексикографическое сравнение на неравенство строк

6

>

s2 > s1

лексикографическое сравнение  строк на >

7

>=

s2 >= s1

лексикографическое сравнение  строк на >=

8

<

s2 < s1

лексикографическое сравнение  строк на <

9

<=

s2 <= s1

лексикографическое сравнение  строк на <=

10

[]

s1[i]

индексация (обращение к элементу строки)

11

>>

cin >> s1;

ввод строки (лучше метод getline)

12

<<

cout << s2;

вывод строки


ПРИМЕР 1. Инициализация С-строки

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 const int MAX = 8;     

//нулевой символ добавляется к концу строки автоматически

 char str1[MAX] = "stroka1";   

//нулевой символ добавляется к концу строки автоматически

 char str2[] = "stroka2";   

                                 //  нет \0

 char str3[] = {'s', 't', 'r', 'o', 'k', 'a', '3'};  

                            

   char str4[] = {'s','t','r','o','k','a','4','\0'};   

 char str5[MAX];   

 char *str6 = "stroka6";

cout << " 1 " << str1 << endl;

cout << " 2 " << str2 << endl;

cout << " 3 " << str3 << endl;

cout << " 4 " << str4 << endl;

             //  !!!    нельзя  константный указатель   

str5 = "stroka5";

cout << " 5 " << str5 << endl;

cout << " 6 " << str6 << endl;

                //  !!!     можно  !!!

str6 = "stroka";   

cout << " 6 " << str6 << endl;

}

ПРИМЕР 2. Ввод С-строки. Инструкция cin

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 const int MAX =  80;              

 char str[MAX];   

cout << "   Enter a string: ";

       //ввод выполняется до первого пробельного символа                                        

cin >> str;             

cout << "You entered: " << str << endl;

}

ПРИМЕР 3. Ввод С-строки. Функция gets

#include <stdio.h>             // for gets puts

#include <iostream>            // for cin cout

using namespace std;

void main()

{

 const int n =  80;

 char s[n];

cout << "   Enter a string: ";

gets(s);             // gets_s(s);

cout << "You entered: ";

puts(s);             // puts_s (s);

}

ПРИМЕР 4. Ввод С-строки. Метод get

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 const int MAX = 80;              

 char str [MAX];   

   char c;

cout << "  1     Enter a string: ";

// символ перевода строки '\n' остается в потоке

 // в строковую переменную добавляется '\0'

cin.get (str, MAX);     

cout << " 1   You entered: " << str << endl;

cin.get();        // удаление из потока символа ‘\n’.

cout << "\n   2   Enter a string:\n";

            //   свой разделитель для ввода строки

cin.get(str, MAX,  '$');         

cout << "   You entered:\n" << str << endl;

c = cin.get();   // удаление из потока символа ‘$’.

   cout<<c<<endl;

   c = cin.get();    // удаление из потока символа ‘\n’.

   cout<<int(c)<<endl;

cout << "\n      3     Enter a string: ";

  //символ перевода строки '\n' остается в потоке

  //в строковую переменную добавляется '\0'

cin.get (str, MAX);     

cout << "3   You entered: " << str << endl;

cin.get();     // удаление из потока символа ‘\n’.

}

ПРИМЕР 5. Ввод С-строки. Метод  getline

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 const int MAX = 80;              

 char str [MAX];   

 

cout << "\n   1   Enter a string: ";

//при этом '\n' также считывается (удаляется) из потока

//и вместо него в строковую переменную записывается '\0'

cin.getline (str, MAX);  

cout << "1   You entered: " << str << endl;

cout << "\n   2   Enter a string: ";

//свой разделитель для ввода строки    

//при этом '\n' также считывается (удаляется) из потока

//и вместо него в строковую переменную записывается '\0'

cin.getline (str, MAX, '&');   

cout << "2   You entered: " << str << endl;

}


ПРИМЕР 6. Ввод С-строки с русскими буквами

#include <windows.h> 

#include <iostream>   // cin cout

using namespace std;

void main()

{

    char buff[80];

    cin.getline(buff,80);        // "русский текст"

    cout << "Моя программа"<< endl;

                          // на экране набор знаков                           

    cout << buff << endl;

                       // на экране : "русский текст"

 setlocale(LC_ALL, "rus");

    cout << "Моя программа"<< endl;

                   // на экране: "Моя программа"

    cout << buff << endl;        

                     // на экране набор знаков

    OemToAnsi(buff, buff);

    cout << "Моя программа"<< endl;  

                      // на экране: "Моя программа"

    cout << buff << endl;

                     // на экране : "русский текст"

                        

}


ПРИМЕР 7. Ввод С-строк. Метод  getline

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 const int n = 80;

 char s[n];

       //  выход из цикла – конец файла – Ctrl+z

 while (cin.getline(s, n))    

{   

 if (! strcmp(s,""))

                      break;

 cout << s << endl;

 //          ..........               обработка строки

}

}


ПРИМЕР 8. Преобразование двоичного числа в десятичное. 

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void main ()

{

 char str[80];   

 long int dec;   

 int i, v = 1;

          // двоичное число задаем в виде строки

cout << "  Enter number v 2 ss ";

cin.getline (str, 80);           

dec = 0;

 for (i = strlen(str)-1;  i >= 0;  i--)

{           // значение элемента строки 0 или 1

 if (str[i] == '1' )

 {

  dec += v;       // добавляем к результату

  cout<<v<<" ";

 }

 v *= 2;         //   вес следующего разряда

}               

cout<<endl<<" result v 10 ss =" <<dec<<endl;

}

ПРИМЕР 9. Преобразование десятичного числа в двоичное. 

#include <iostream>  // for cin cout

using namespace std;

void main ()

{

 char str[80];   

 int n, r;                        

cout<<" vvedite number v 10 ss"<<endl;

cin>>n;

 int i = 0;

 do

{  

    r = n  %  2; //остаток от деления на основание с/с

     n = n  / 2; //  частное от деления на основание с/с

     str[i] = char('0' + r);                    

  i++;

}

 while (n > 0);

    //  цифры результата в строке str в обратном порядке

 for(int j = 0; j < i / 2; j++)

                //  меняем порядок цифр на обратный

{ int c = str[j];

 str[j] = str[i – j – 1];

 str[i – j – 1] = c;

}

         // конец строки i – номер позиции    

str[i] = '\0';  

cout<<" result v 2 ss=  " <<str<<endl;

}

ПРИМЕР 10. Работа с символами С-строки 

Задана строка символов. Получить новую строку из исходной, удалив символы ‘*’ и удвоив букву  A (а).

#include <string.h>

#include <iostream>   // for cin cout

using namespace std;

void main()

{

 const int MAX = 80;              

 char  str1 [MAX], str2 [MAX];

   unsigned int   i, k = 0;  

 

cout << "   Enter a string: ";

cin.getline (str1, MAX);

 for (i = 0; str1[i]; i++)

   {

     if (str1[i] == '*')    // если * пропускаем

        continue;

                 // если А или а удваиваем

     if (str1[i] == 'A'|| str1[i] == 'a')

str2[k++] = str1[i];

// в остальных случаях записываем в результирующую строку

     str2[k++] = str1[i];   

  }

   str2[k] = '\0';           // конец строки

cout << " Rezult = " << str2<< endl;

}


ПРИМЕР 11. Копирование С-строк. Функции strcpy, strcpy_s 

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 char st [20] = "*******************";    // 19 '*'

   int i, err;

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

      cout << st[i];                             

cout << endl<< st << " " << strlen (st) << endl;          

strcpy(st, "Good Morning");

  

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

      cout << st[i];                    

cout << endl<< st << " " << strlen (st) << endl;      

err = strcpy_s(st, 20, "Hello World");

   if (!err)

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

          cout << st[i];                    

cout << endl<< st << " " << strlen (st) << endl;      

strcpy(st, "Hello");

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

            cout << st[i];                         

cout << endl<< st << " " << strlen (st) << endl;         

cout << endl;

}

ПРИМЕР 12. Сравнение С-строк. Функции strcmp и  strlen

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

 const int MAX = 80;                

 char buffer[MAX] = "";            

 int count = 0;                           

 while (true)

{

   cout << "Enter a string of less than 80

               characters:\n";

      cin.getline(buffer, MAX);      

   if (! strcmp(buffer, ""))

         break;

 

      for (count=0; buffer[count] != '\0'; count++);

      cout << count << "  " << strlen(buffer) <<endl;

}

}


ПРИМЕР 13. Объединение С-строк. Функции strcat, strncat, strcat_s, strcncat_s

#include <string.h>        // for strcat strncat

#include <iostream>           // for cin cout

using namespace std;

void  main()                                       

{ const int MAX = 80;                

char s1[MAX] = "1", s2[MAX] = "22222", s3[MAX] = "333";

 char* s4;

   int err;

cout<<" 1 "<<endl;

cout<<" str1="<< s1<<endl;

cout<<" str2="<< s2<<endl;

cout<<" 2 "<<endl;

cout<<"str1+str2="<< strcat(s1, s2)<<endl;

cout<<" str1="<< s1<<endl;

cout<<" 3 "<<endl;

cout<<" str1="<< s1<<endl;

s4 = strcat(s1, s2);

cout<<" str1="<< s1<<endl;

cout<<"s4=str1+str2="<< s4<<endl;

cout<<" 4 "<<endl;

err = strcat_s(s1, MAX, s2);

   if (!err) cout<<"str1+str2="<< s1<<endl;

cout<<" 5 "<<endl;

cout<<" str3="<< s3<<endl;

cout<<"str3+str2 ="<<strncat(s3, s2, 2)<<endl;

cout<<" str3="<< s3<<endl;

cout<<" 6 "<<endl;

s4 = strncat(s3, s2, 2);

cout<<" str3="<< s3<<endl;

cout<<"str4=str3+str2="<< s4<<endl;

cout<<" 7 "<<endl;

  err = strncat_s(s3, MAX, s2, 2);

   if (!err) cout<<"str1+str2="<< s3<<endl;

}

ПРИМЕР 14. Вхождение символа в С-строку. Функция strchr

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

   const int MAX = 80;                

 char s[MAX] = "1234567890abcdefghABCDEFGH";

 char c;

 char* str;

 int n;

cout<<" c =  "<<endl;

cin>>c;

 while(c !=  '!')

{

  str = strchr(s, c);

  if (str != NULL)

  {     //  определение позиции найденного символа

       n = int (str – s) ;

      cout<<" simvol ="<<c<< " v"<<n<<"pozicii"<< endl;

   }

   else 

 cout<<" simvola ="<<c<< " net "<<endl;

   cout<<" c=  "<<endl;

   cin>>c;

}

}


ПРИМЕР 15. Вхождение  С-подстроки  в С-строку. Функция strstr   

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

 const int MAX = 80;                

 char s1[MAX], s2[MAX];

 char* str;

 int n;

cout << " s1= \n";

cin.getline(s1, MAX);      

 while(true)

{

 cout << " s2= \n";

 cin.getline(s2, MAX);  

 if (! strcmp(s2, ""))   

         break;

 str=strstr(s1, s2);

 if (str != NULL)

 {

           //  определение позиции найденной подстроки

  n = int (str - s1);  

  cout<<" s2 v s1 c ="<<n<<"pozicii"<<endl;

 }

 else 

          cout<<" s2 no s1"<<endl;

}

}

 

ПРИМЕР 16. Вхождение символов в С-строку. Функции strspn, strcspn

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

 const int MAX =  80;                

 char s1[MAX], s2[MAX];

 int n1, n2;

cout << " s1= \n";

cin.getline(s1, MAX);      

 while(true)

{

 cout << " s2= \n";

 cin.getline(s2, MAX);  

 

       if (! strcmp(s2,""))

         break;

 n1 = strspn(s1, s2);

 cout<<" dlina first part s1 only iz simvolov

               s2 = "<< n1<<endl;

 n2 = strcspn(s1, s2);

 cout<<endl<<" dlina first part  no  simvolov

                     s2 = "<< n2<<endl;

}

}


ПРИМЕР 17. Определение  С-подстроки  из С-строки. Функция strpbrk   

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

 const int MAX = 80;                

 char s1[MAX], s2[MAX];

 char* str;

cout << " s1= \n";

cin.getline(s1, MAX);      

 while(true)

{

 cout << " s2= \n";

 cin.getline(s2, MAX);  

 if (! strcmp(s2,""))

          break;

 str = strpbrk(s1,s2);

 if (str != NULL)

    cout<<" podstroka s1 "<<str<<endl;

 else 

   cout<<" v s1 net simvolov iz s2 "<<endl;

}

}


ПРИМЕР 18. Замена символов в С-строке из нижнего регистра в верхний. Функции strupr, _strupr_s

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

 const int MAX = 80;                

 char str[MAX];

 char *s;

int err;

cout << "  str= ";

cin.getline(str, MAX);

s = strupr(str);

cout<<str<<"    rezult = "<< s <<endl;

cout << "  str= ";

cin.getline(str, MAX);

err = _strupr_s(str, MAX);

   if (!err)

     cout<<"    rezult = "<< str <<endl;

}


ПРИМЕР 19. Замена символов в С-строке из верхнего регистра в нижний. Функции strlwr,_strlwr_s

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void  main()                                       

{

 const int MAX =  80;                

 char str [MAX];

 char * s;

int err;

  cout << "  str= ";

cin.getline(str, MAX);

s = strlwr(str);

cout<<str<<"   rezult = "<<s<<endl;   

cout << "  str= ";

cin.getline(str, MAX);

err = _strlwr_s (str, MAX);

   if (!err)

     cout<<"    rezult = "<< str <<endl;

}


ПРИМЕР 20.  Преобразование С-строки в число. Функции atoi, atof

#include <string.h>       // for strcmp  

#include <stdlib.h>       // for atoi atof

#include <iostream>  // for cin cout

using namespace std;

void main()                                       

{

 const int MAX = 80;                

 char str[MAX] = "abcd";            

 int i;

 double f;

i = atoi(str);

cout<<i<<endl;

 while (true)

{

 cout << "1 Enter a string \n";

 cin.getline(str, MAX);     

 if (! strcmp(str,""))   

          break;

 i = atoi(str);

 cout<<i<<endl;

}

 while (true)

{

 cout<<"2 Enter a string \n";

 cin.getline(str, MAX);     

 if (! strcmp(str,""))

          break;

 f = atof(str);

 cout<<f<<endl;

}

}

ПРИМЕР 21.  Преобразование С-строки в число. Функция strtol

#include <string.h>       // for strcmp  

#include <stdlib.h>       // for strtol

#include <iostream>  // for cin cout

using namespace std;

void main()                                       

{

 const int MAX = 80;                

 char  str[MAX] = "abcd";            

 char  *err;

 long  l;

 int   base;

cout<< "   1   " <<endl;

l = strtol(str, &err, 10);

cout<<l<<endl; // полученное число в 10-ой с/с

 cout<<err<<endl;      

        // строка, содержащая ошибочное значение, если  

        // перевод выполнен некорректно

        // = NULL, если перевод выполнен корректно   

 cout<< "   2   " <<endl;

 l = strtol(str, &err, 16);

 cout<<l<<endl;     // полученное число в 16-ой с/с

 cout<<err<<endl;

 while (true)

{

 cout << "1 Enter a string \n";

 cin.getline(str, MAX);     

 if (! strcmp(str,""))   

          break;

 cout << endl<< " Enter a base \n" ;

 cin >> base;     

                        // число по основанию base

     l = strtol(str, &err, base);

 cout<<l<<endl;

     cout<<err<<endl;

 }

}


ПРИМЕР 22.  Преобразование С-строки в число. Функция strtod

#include <string.h>       // for strcmp  

#include <stdlib.h>       // for strtol

#include <iostream>  // for cin cout

using namespace std;

void main()                                       

{

 const int MAX = 80;                

 char  *str, *err;

 double  d;

cout<< "   1   " <<endl;

 str = "1.1";

d = strtod(str, &err);

 cout<<d<<endl;    // полученное число

 cout<<err<<endl;      

        // = NULL, если перевод выполнен корректно   

 cout<< "   2   " <<endl;

 str = "1,1";

   d = strtod(str, &err);

 cout<<d<<endl;     // полученное число 

cout<<err<<endl;

        // строка, содержащая ошибочное значение, если  

        // перевод выполнен некорректно

 cout<< "   3   " <<endl;

str = "1e-3";

   d = strtod(str, &err);

 cout<<d<<endl;     // полученное число

 cout<<err<<endl;

           // = NULL, если перевод выполнен корректно   

 cout<< "   4   " <<endl;

str = "e-3";

   d = strtod(str, &err);

 cout<<d<<endl;     // полученное число

 cout<<err<<endl;

        // строка, содержащая ошибочное значение, если  

        // перевод выполнен некорректно

}

ПРИМЕР 23.  Преобразование числа в С-строку. Функции itoa, _itoa_s, ltoa, _ltoa_s, utoa, _utoa_s

#include <string.h>

#include <stdlib.h>

#include <iostream>  // for cin cout

using namespace std;

void main()                                       

{ const int MAX =  80;                

 char str[MAX] = "";            

  int a;

// преобразование целого числа в строку

// функции

//  char* itoa(int value,char *string,int radix);

//  char* ltoa(long value, char *string, int radix );

//  char* ultoa(unsigned long val,char *str,int radix );

// 2<=radix<=36 - основание с/с в которой получим число

cout << "Enter number \n";   

    cin>>a;

itoa(a, str, 2);

// _itoa_s(a, str, 2);

cout<<" number in 2 s/s ="<<str<<endl;

ltoa(a, str, 10);

// _ltoa_s(a, str, 10);

cout<<" number in 10 s/s ="<<str<<endl;

ultoa(a, str, 16);

// _ultoa_s(a, str, 16);

cout<<" number in 16 s/s  ="<<str<<endl;

 

   itoa(a, str, 22);

// _itoa_s(a, str, 22);

cout<<" number in 22 s/s ="<<str<<endl;

}


ПРИМЕР 24.  Преобразование числа в С-строку. Функция fcvt, _fcvt_s

#include <string.h>

#include <stdlib.h>

#include <iostream>  // for cin cout

using namespace std;

void main()                                       

{

// преобразование вещественного числа в строку

//char* fcvt(double value,int count,int *dec,int *sign );

//  count - число цифр дробной части

//  dec   - количество цифр целой части

//  sign   - знак числа (0 или 1)

 const int MAX =  80;

 int  decimal, sign, err;

 char *buffer;

 double source;

 cout << "Enter number \n";

 cin>>source;

 buffer = fcvt(source, 7, &decimal, &sign);  

                            // результат в buffer

cout<<source<<" "<<buffer<<" "<<decimal<<" "<<sign<<endl;

 err = _fcvt_s(buffer, MAX, source, 7, &decimal, &sign);

           // результат в buffer

           // вслучае успеха возвращает 0 в err

 if (err != 0)

{

    cout<<"error"<<err<<endl;

}

else

cout<<source<<" "<<buffer<<" "<<decimal<<" "<<sign<<endl;

}

ПРИМЕР 25. Выделение лексем. Функции strtok, strtok_s

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 char str[80];

                    //строка из разделителей

 const char razd[] = " ,?!;-.";

 char *Ptr, *Ntr;

cout << "  Enter a string: ";

cin.getline (str, 80);                    

  // первый вызов функции первый параметр – строка,

  // второй – строка из разделителей лексем

Ptr = strtok (str, razd);

// Ptr = strtok_s(str, razd, &Ntr);

 int i = 0;

 while (Ptr != NULL)

{   

 cout << Ptr << endl;   // очередная лексема

 i++;             // количество лексем

      // вызов функции для выделения следующей лексемы

 // первый параметр NULL !!!

 Ptr = strtok(NULL, razd);  

// Ptr = strtok_s(NULL, razd, &Ntr);  

}

cout<<" vvedeno "<<i<<" lecsem"<<endl;

cout<<str<<endl;

                //  изменилась ли исходная строка ???

}

ПРИМЕР 26. Указатели и  С-строки

#include <string.h>

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 char str1[] = "stroka - array";

 char *str2 = "stroka - pointer";

 char *p;

 int i;

cout << str1 << endl;    

cout << str2 << endl;

    //  вычисление значения функции  strlen

    //  на каждой итерации цикла             

 for (i = 0;  i < strlen (str1);  i++)

      cout << str1[i];         //  вывод посимвольно  

cout<<endl;

    //  вычисление значения функции  strlen

    //  на каждой итерации цикла             

 for (i = 0; i < strlen (str2);  i++)

      cout << str2[i];              // вывод посимвольно              

cout<<endl;

           // вывод посимвольно через указатель  !!!      

           //  эффективнее предыдущего   

 for (p = str1; *p;  p++)

      cout << *p;    

cout<<endl;

           // вывод посимвольно через указатель  !!!      

           //  эффективнее предыдущего   

 for (p = str2; *p;  p++)

      cout << *p;  

cout<<endl;

//  str1++;  //   !!!    нельзя  константный указатель

str2++;  //   !!!    можно     

cout << str2 << endl; //  строка без первого символа   

str2 = "new stroka - pointer";    //  !!!   можно

cout << str2 << endl;                     

                 //  !!! нельзя  константный указатель

// str1 = "new stroka - array";

}

ПРИМЕР 27. Массивы  С-строк

#include <iostream>  // for cin cout

using namespace std;

void main()

{

 char* pointer[ ] =

{"11111", "22222222", "33333333333","44444444444"};

 char array [ ][12]  =

{"11111", "22222222", "33333333333", "44444444444"};

     

   int i;

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

 cout<<pointer[i]<<endl;

cout<<endl;

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

 cout<<array[i]<<endl;

cout<<endl;

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

{

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

  cout<<pointer[i][j];

 cout<<endl;

}

cout<<endl;

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

{

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

  cout<<array[i][j];

 cout<<endl;

}

}

ПРИМЕР 28. *** Массивы  С-строк

Запустите программу и объясните результаты.

#include <iostream>  // for cin cout

using namespace std;

void main()

{

      char   *c[ ]     =

{"11111", "22222222", "333333333333", "444444444444"};

      char **cp[]    = {c+3,c+2,c+1,c};

      char ***cpp  =  cp;

      int i;

cout <<"    1   "<<endl;

cout <<"  &cpp= "  <<    &cpp<<endl;

cout <<"   cpp= "  <<     cpp<<endl;

cout <<"  *cpp= "  <<    *cpp<<endl;

cout <<" **cpp= "  <<   **cpp<<endl;

cout <<"***cpp= "  <<  ***cpp<<endl;

cout<<endl<<"   2   "<<endl;

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

{

 cout<<" i= "<<i<<endl;

 cout<<"  *cpp[i]= " <<  *cpp[i] <<endl;

 cout<<" **cpp[i]= " << **cpp[i] <<endl;

 cout<<"  *cp[i]=  " <<  *cp[i]  <<endl;

 cout<<" **cp[i]=  " << **cp[i]  <<endl;

 cout<<"   c[i]=   " <<   c[i]   <<endl;

 cout<<"  *c[i]=   " <<  *c[i]   <<endl<<endl;

}

cout<<endl<<"   3   "<<endl;

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

{

 cout <<" i= "<<i<<endl;

 cout<<"  **(cpp+i)= " <<  **(cpp+i) <<endl;

 cout<<" ***(cpp+i)= " << ***(cpp+i) <<endl;

 cout<<"  **(cp+i)=  " <<  **(cp+i)  <<endl;

 cout<<" ***(cp+i)=  " << ***(cp+i)  <<endl;

 cout<<"   *(c+i)=   " <<   *(c+i)   <<endl;

 cout<<"  **(c+i)=   " <<  **(c+i)   <<endl;

}

}


ПРИМЕР 29. Объявление и инициализация строки string

#include <iostream>

#include <string>               // строковый класс

using namespace std;

void main()

{

string s1;           //создаем пустую строку

string s2("aaaa"); // создаем строку из C-строки

           // создаем строку из C-строки 10 символов

string s3("abcdefghijklmnopqrstuvwxyz",10);

           // создаем строку из 5 одинаковых символов

string s4(5,’!’);

              // создаем строку-копию из строки s3

string  s5(s3);

            // создаем строку-копию из строки s3

            //  начиная с индекса 5 не более 3 символов

string  s6(s3,5,3);

 

cout<<"s1= "<<s1<<endl;

cout<<"s2= "<<s2<<endl;

cout<<"s3= "<<s3<<endl;

cout<<"s4= "<<s4<<endl;

cout<<"s5= "<<s5<<endl;

cout<<"s6= "<<s6<<endl;

}


ПРИМЕР 30. Инициализация строки string. Оператор =. Метод assign 

#include <iostream>

#include <string>               // строковый класс

using namespace std;

void main()

{

string s1, s2, s3;                     

// в классе string определены три оператора присваивания:

// string & operator = (const string& str);

// string & operator = (const char* s);  

// string & operator = (char c);  

s1 = '1';

s2 = "bbbbbb";

s3 = s2;

cout<<"s1= "<<s1<<endl;

cout<<"s2= "<<s2<<endl;

cout<<"s3= "<<s3<<endl;

                              //   метод assign

s2.assign("ccccccc");      //  s2=”cccccccc”

s3.assign(s2);             //  s3=s2

cout<<"s1 = "<<s1<<endl;

cout<<"s2 = "<<s2<<endl;

cout<<"s3 = "<<s3<<endl;

s2.assign("1234");         //  s2=”1234”

           // в s3 из s2 3 символа, начиная с 1 позиции

s3.assign(s2,1,3);

cout<<"s2= "<<s2<<endl;

cout<<"s3= "<<s3<<endl;

 char s[]="56789";

               //  присваивает  s3  3 символа С-строки

s3.assign(s,3);

cout<<"s= "<<s<<endl;

cout<<"s3= "<<s3<<endl;

}

ПРИМЕР 31. Ввод строки string. Оператор >> 

#include <iostream>

#include <string>               

using namespace std;

void main()

{

string s1;                   

cout << "   Enter a string: ";

     //ввод выполняется до первого пробельного символа                                        

cin >> s1;     

cout << "You entered: " << s1 << endl;

}

ПРИМЕР 32. Ввод строки string. Метод  getline 

#include <iostream>

#include <string>               

using namespace std;

void main()

{

string s1;                   

 

cout << "Enter a string: ";

getline(cin,s1);             //ввод   строки                                                 

cout << "You entered: " << s1 << endl;

cin.get();      // удаление из потока символа ‘\n’.

cout << "   Enter a string: ";

              // свой разделитель для ввода строки    

getline(cin,s1,'&');

cout << "You entered: " << s1 << endl;

cin.get();      // удаление из потока символа ‘&’.

}

ПРИМЕР 33. Длина строки string. Методы length, size 

#include <iostream>

#include <string>               

using namespace std;

void main()

{

string st("*******************");                           

cout << " " << st.length()<< " " << st.size() <<

           "  "<<st.max_size()<<endl;          

st = "Good Morning";

cout << " " << st.length()<< " " << st.size() <<

           "  "<<st.max_size()<<endl;          

st = "Hello";

cout << " " << st.length()<< " " << st.size() <<

           "  "<<st.max_size()<<endl;          

}

ПРИМЕР 34. Доступ к элементу строки string. Оператор []. Метод at 

#include <iostream>

#include <string>               

using namespace std;

void main()

{

string st("*******************");

   int i;                           

 for (i = 0; i < st.length(); i++)

 cout << st[i];  

                   // если i выходит за пределы строки,

                   // то поведение не определено

st = "Good Morning";

 for (i = 0; i < st.length(); i++)

 cout << st.at(i);  

        // если i выходит за пределы строки,

       // метод возвращает исключение типа out_of_rang

st = "Hello";

 for (i = 0; i < st.length(); i++)

 cout << st[i];   

}

ПРИМЕР 35. Сравнение строк. Операторы  сравнения

Вводим строки в цикле, выход – ввод “пустой” сроки.

Вывод на экран результатов сравнения двух строк.

#include <iostream>

#include <string>               

using namespace std;

void main()

{

string st1, st2;     

cout << "Enter a string \n";

getline(cin,st1);          //  ввод 1 строки

 

 while (true)

{

 cout << "Enter a string \n";

 getline(cin,st2);      //  ввод 2 строки

 cin.get();    

 if ( st2 == "")   

           break;              //  выход из цикла

 

 cout  << endl<< st2 ;

    // операторы лексикографического сравнения строк

 if (st2 == st1)

          cout << "  =  ";        

 else

  if (st2 < st1)

              cout <<"  <  ";

  else 

              cout  << " > ";          

 cout  << st1<<endl ;

 st1 = st2;

}

}


ПРИМЕР 36. Сравнение строк. Метод compare

Вводим строки в цикле, выход – ввод “пустой” сроки.

Вывод на экран результатов сравнения двух строк.

#include <iostream>

#include <string>               

using namespace std;

void main()

{

string st1, st2;     

cout << "Enter a string \n";

getline(cin,st1);          //  ввод 1 строки

 while (true)

{

 cout << "Enter a string \n";

 cin.get();    

 getline(cin,st2);          //  ввод 2 строки

 if ( !st2.compare("")) break; // выход из цикла

 cout  << endl<< st2 ;

   // лексикографическое сравнение строк

 if (!st2.compare(st1)) cout <<"  =  ";   

 else

       if (st2.compare(st1)<0) cout <<"  <  ";

  else      cout  << " > ";          

 cout  << st1<<endl ;

 cout  << endl <<st2[1]<<st2[2];

      // лексикографическое сравнение подстрок

 if (!st2.compare(1,2,st1,2,3))

          cout <<"  =  ";     

 else

  if (st2.compare(1,2,st1,2,3)<0)

              cout <<"  <  ";

            else 

               cout  << " > ";          

 cout  << st1[2]<<st1[3]<<st1[4]<<endl ;

 st1 = st2;

}

}

ПРИМЕР 37. Объединение строк. Оператор +. Метод append

#include <iostream>

#include <string>               

using namespace std;

void  main()                                       

{

string s1("11");;                   

string s2("2222");

string s3 ("333333");

string s4("44444444");

s1 += s2;                     // добавить s2 к s1

cout<<"s1 = s1 + s2 = "<<s1<<endl;

 

s4 = s1 + s2;                // добавить s1 к s2

cout<<"s4 = s1 + s2 = "<<s4<<endl;

s4 = s4 + '!';              // добавить s1 к s2

cout<<"s4 = s4 + ! = "<<s4<<endl;

s2.append(s1);             // добавить s1 к s2

cout<<"s2 + s1 = "<< s2<<endl;

    //  добавить к  s3  2 символа строки s1 со 1 позиции

s3.append(s4,1,2);

cout<<"s3 + s4 = "<< s3<<endl;

 char s[] = "56789";

               //  добавить к  s3  2 символа С-строки s

s3.append(s,2);   

cout<<"s3 + s = "<< s3<<endl;

}


ПРИМЕР 38. Вставка строки (подстроки) в строку. Метод insert

#include <iostream>

#include <string>               

using namespace std;

void  main()     

{

string s1("1111111");;                   

string s2("23456789");

s1.insert(3,s2);    // вставить s2 в s1 с 3 позиции

cout<<"s1="<< s1<<endl;

s1 = "1111111";

s2 = "23456789";

 // вставить 4 символа s2 со 2 позиции в s1 с 3 позиции

s1.insert(3,s2,2,4);

cout<<"s1="<< s1<<endl;

s1 = "1111111";

 char s[] = "23456789";

         // вставить 4 символа s  в s1 с 3 позиции

s1.insert(3,s,4);      

cout<<"s1 = "<< s1<<endl;

}


ПРИМЕР 39. Замена строки (подстроки) в строке. Метод replace

#include <iostream>

#include <string>               

using namespace std;

void  main()                                           

{

string s1("1111111");;                   

string s2("23456789");

 // замена  2 символов в s1 с 3 позиции элементами s2

   s1.replace(3,2,s2);  

cout<<"s1="<< s1<<endl;

s1 = "1111111";

s2 = "23456789";

 // замена  2 символов в s1 с 3 позиции 1 символом

   //  из 4 позиции строки  s2

s1.replace(3,2,s2,4,1);

cout<<"s1="<< s1<<endl;

s1 = "1111111";

 char s[] = "23456789";

   // замена  2 символов в s1 с 3 позиции 4 символами s

s1.replace(3,2,s,4);

cout<<"s1="<< s1<<endl;

}

ПРИМЕР 40. Удаление подстроки в строке. Метод erase

#include <iostream>

#include <string>               

using namespace std;

void  main()                                           

{

string s1("123456789");

         // удаление   2 символов в s1 с 3 позиции

s1.erase(3,2);

cout<<"s1="<< s1<<endl;

 

         // удаление   всех символов в s1 с 3 позиции

   s1 = "123456789";

s1.erase(3);   

cout<<"s1="<< s1<<endl;

 

s1 = "123456789";

s1.erase();          // удаление   всех символов  s1  

cout<<"s1="<< s1<<endl;

}

ПРИМЕР 41. Выделение подстроки в строке. Метод substr

#include <iostream>

#include <string>               

using namespace std;

void  main()                                           

{

string s1("123456789");

string s2;

        // s2 – подстрока  s1 из 2 символов  с 3 позиции

s2 = s1.substr(3,2);

cout<<"s2="<< s2<<endl;

s1 = "123456789";

         // s2 – подстрока s1 всех символов  с 3 позиции

s2 = s1.substr(3);   

cout<<"s2="<< s2<<endl;

s1 = "123456789";

s2 = s1.substr();                     // s2=s1  

cout<<"s2="<< s2<<endl;

}

ПРИМЕР 42. Обмен содержимого строк. Метод swap

#include <iostream>

#include <string>               

using namespace std;

void  main()                                           

{

string s1("123456789");

string s2("abcdef");

 

s1.swap(s2);                     

cout<<"s1="<< s1<<endl;

cout<<"s2="<< s2<<endl;

}

ПРИМЕР 43. Поиск подстроки в строке. Метод find

#include <iostream>

#include <string>               

using namespace std;

void  main()                                           

{

string s1("123123123");

string s2("12");

 unsigned k;

     //  поиск подстроки s2 в строке s1 с 4 позиции

k = s1.find(s2,4);    

cout<<"   "<< k<<endl;

     //  поиск подстроки s2 в строке s1 с 7позиции

   k = s1.find(s2,7);      

cout<<"   "<< k<<endl;

       //  поиск символа '1'  в строке s1 с 4 позиции

   k = s1.find('1',4);  

cout<<"   "<< k<<endl;

      //  поиск символа '1'  в строке s1 с 4 позиции

    k = s1.rfind('1',4);   

cout<<"   "<< k<<endl;

}

ПРИМЕР 44. Строки С и С++. Методы copy, c_str

#include <iostream>

#include <string>               

using namespace std;

void  main()                                           

{

string str("1234567890");

 char s[80];

 int k;

      // копируем 3 символа str c 5 позиции в s

k = str.copy(s,3,5);  

cout<<s<<"   "<<k<<endl;

        // копируем 3 символа str c 5 позиции в s

   k = str.copy(s,3,5);    

s[3]='\0';

cout<<s<<"   "<<k<<endl;

cout<<str.c_str()<<endl;        

}

Правила перевода чисел из одной системы счисления в другую

1.  2  10

Для перевода двоичного числа в десятичное необходимо его записать в виде многочлена, состоящего из произведений цифр числа и соответствующей степени числа 2, и вычислить по правилам десятичной арифметики:

Степени числа 2

n (степень)

0

1

2

3

4

5

6

7

8

9

10

2 n

1

2

4

8

16

32

64

128

256

512

1024

 

Пример. Число 11101000.012 перевести в десятичную систему счисления.


2.  16  10

Для перевода шестнадцатеричного числа в десятичное необходимо его записать в виде многочлена, состоящего из произведений цифр числа и соответствующей степени числа 16, и вычислить по правилам десятичной арифметики:

Степени числа 16

n (степень)

0

1

2

3

4

5

6

16 n

1

16

256

4096

65536

1048576

16777216

  Пример . Число FDA116 перевести в десятичную систему счисления.


3.  10 2

Вещественное число, в общем случае содержит целую и дробную часть, всегда   можно представить в виде суммы целого числа и правильной дроби.

Для перевода целого десятичного числа в двоичную систему его необходимо последовательно делить на 2 до тех пор, пока не останется остаток, меньший или равный 1. Число в двоичной системе записывается как последовательность последнего результата деления и остатков от деления в обратном порядке.

Пример. Число 2210 перевести в двоичную систему счисления.

 

2210=101102

Алгоритм перевода правильных дробей  из 10 в другую систему р.

  1.  умножить исходную дробь в 10-ной системе счисления на основание р,       выделить целую часть - она будет первой цифрой новой дроби;
  2.  отбросить целую часть;
  3.  для оставшейся дробной части операцию умножения с выделением целой и  дробной части повторить, пока в дробной части не окажется 0 или не  будет достигнута желаемая точность конечного числа;
  4.  записать дробь в виде последовательности цифр после ноля с      разделителем в порядке их появления.

Пример. Число 0.310 перевести в двоичную систему счисления.

0.310 =  0.010011...2

0.3*2=0.6          0

0.6*2=1.2          1

0.2*2=0.4          0

0.4*2=0.8          0

0.8*2=1.6          1

0.6*2=1.2          1

...


4. 10 16

Для перевода целого десятичного числа в шестнадцатеричную систему его необходимо последовательно делить на 16 до тех пор, пока не останется остаток, меньший или равный 15. Число в шестнадцатеричной системе записывается как последовательность цифр последнего результата деления и остатков от деления в обратном порядке.

Пример. Число 746710  перевести в шестнадцатеричную систему счисления.

746710=1D2B16

Алгоритм перевода правильных дробей  из 10 в другую систему р .

  1.  умножить исходную дробь в 10-ной системе счисления на основание р,       выделить целую часть - она будет первой цифрой новой дроби;
  2.  отбросить целую часть;
  3.  для оставшейся дробной части операцию умножения с выделением целой и  дробной части повторить, пока в дробной части не окажется 0 или не  будет достигнута желаемая точность конечного числа;
  4.  записать дробь в виде последовательности цифр после ноля с      разделителем в порядке их появления.

Пример. Число 0.12510 перевести в шестнадцатеричную систему счисления.

0.12510 =  0.216

0.125*16=2       2


5.  2 16

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

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

Пример. Число перевести в шестнадцатеричную систему счисления.

6. 16 2

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

Пример. Число    перевести в двоичную систему счисления.


Значения двоичных кодов для  шестнадцатеричных цифр

цифра

код

цифра

Код

0

0000

8

1000

1

0001

9

1001

2

0010

A

1010

3

0011

B

1011

4

0100

C

1100

5

0101

D

1101

6

0110

E

1110

7

0111

F

1111


Словарь понятий, используемых в заданиях 

Текст – непустая последовательность символов.

Слово – непустая последовательность любых символов, кроме символов-разделителей.

Предложение – последовательность слов, разделенных одним или несколькими символами-разделителями.

Символы-разделители:  «пробел», «.», «,», «:», «;», «!», «?», «-»,  «’», «(», «)».

Подслово – непустая  подпоследовательность слова.

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

Вхождением слова (последовательности) v в слово (последовательность) w называется любая часть слова (последовательности) w, которая является подсловом (подпоследовательностью) v слова (последовательности) w.

Слова-серии – слова, составленные из повторяющихся подслов. Например,  123123123 – слово-серия.

9

8

7

6

5

4

3

2

1

0

s

\0

0

l

l

e

H




1. тематичної оцінки- Що таке лінза Які ви знаєте типи лінз Яку лінзу називають збиральною розсіювальн
2. Реферат- Исследование устойчивости и качества процессов управления линейных стационарных САУ
3. СОГЛАСОВАНО Руководители курсового проектирования Кудрявцева Т
4. Метатеорія держави і права
5. Маркетинг Набережные Челны ~ 2008 УДК 339
6. I. Римская семья. Агнатическое и когнатическое родство
7. Задание 1 В лаборатории механических испытаний металлургического комбината производят испытания листовог
8. Особенности педагогической деятельности на примере Бийского колледжа
9. Культурно-просветительская деятельность в России 18 века
10. Южный Ветер Спасский пер.html
11. на тему- ldquo; Вживання складних слів і абревіатур у текстах з бухгалтерського облікуrdquo;
12. Персонал стенда
13. на тему Регулирование занятости трудовых ресурсов Украины
14. Лабораторная работа ’ 101 ИЗМЕРЕНИЕ УСКОРЕНИЯ СВОБОДНОГО ПАДЕНИЯ Студент- Сергейчук А
15. строительной части Локальная смета 1 на общестроительные работы подземной части Составлена в цена
16. Учет расчетов по налогу на добавленную стоимость
17. Энциклопедию или Толковый словарь наук искусств и ремёсел 1751
18. Реферат- Общение мужчины и женщины
19. Ваш ребенок ведет себя агрессивно
20. КАЛАЧЕВСКИЙ ТЕХНИКУМИНТЕРНАТ МИНИСТЕРСТВА ТРУДА И СОЦИАЛЬНОЙ ЗАЩИТЫ РОССИЙСКОЙ ФЕДЕРАЦИИ