Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 - Лекция7_Строки.docx
Скачиваний:
8
Добавлен:
16.11.2019
Размер:
64.57 Кб
Скачать

Определение длины строки – метод length()

Для определения длины строки служит метод length().

string my_string;

cout << "введите строку:\n";

getline(cin, my_string);

cout << "Длина введенной строки равна ";

cout << my_string.length() << endl;

Метод length() удобно использовать в цикле при обработке строк, например, следующая программа выводит строку наоборот:

string my_string;

cout << "Введите строку:\n";

getline(cin, my_string);

cout << "Строка наоборот:\n";

int l = my_string.length();

for (int i=str.length()-1; i>=0; i--) {

cout << my_string[i];

}

cout << endl;

Объединение двух строк

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

string name, surname, patronymic;

cout << "Введите имя:\n";

cin >> name;

cout << "Введите фамилию:\n";

cin >> surname;

cout << "Введите отчество:\n";

cin >> patronymic;

string fullname = name + " " +

patronymic + " " + surname;

cout << "Полное имя:\n";

cout << fullname << endl;

Передача строк в качестве аргументов функций

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

//Создаем процедуру с аргументом-строкой

void printReverseString(string str) {

for (int i=str.length()-1; i>=0; i--) {

cout << str[i];

}

cout << endl;

}

int main() {

string my_string;

cout << "Введите строку:\n";

getline(cin, my_string);

cout << "Введенная строка наоборот:\n";

//Вызываем созданную процедуру и передаем

//в нее введенную строку

printReverseString(my_string);

//Вызываем созданную процедуру и передаем

//в нее другие строки

printReverseString("Язык программирования C++");

printReverseString("Передаем строку аргументом");

return 0;

}

Возврат строки в качестве значения функции

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

//Создаем функцию, которая принимает строку

//и возвращает ее, записанную наоборот

string getReverseString(string str) {

string result = "";

for (int i=str.length()-1; i>=0; i--) {

result += str[i];

}

return result;

}

int main() {

string my_string;

cout << "Введите строку:\n";

getline(cin, my_string);

cout << "Введенная строка наоборот:\n";

//Вызываем созданную процедуру и передаем

//в нее введенную строку

cout << getReverseString(my_string) << endl;

//Вызываем созданную процедуру и передаем

//в нее другие строки

cout << getReverseString("Программа") << endl;

cout << getReverseString("Аргумент") << endl;

return 0;

}

ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ

Задача 1. Создайте процедуру, которая принимает в качестве аргумента строку и выводит ее на экран, дублируя все латинские строчные гласные буквы. Например, eagle – eeaaglee. Используя созданную процедуру, продублируйте такие буквы в строках language и university.

#include "stdafx.h"

#include <iostream>

#include <string>

using namespace std;

//Функция, которая проверяет, является ли

//символ латинской строчной гласной буквой

bool isLatinVowel(char ch) {

return ch=='a' || ch=='e' || ch=='i' ||

ch=='o' || ch=='u' || ch=='y';

}

//Процедура, дублирующая латинские строчные

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

void duplicateLatinVowels(string str) {

for (int i=0; i<str.length(); i++) {

//Выводим очередной символ

cout << str[i];

//Выводим символ еще раз, если он является

//латинской строчной гласной буквой

if (isLatinVowel(str[i])) {

cout << str[i];

}

}

cout << endl;

}

int main() {

//Проверяем тестовый пример

duplicateLatinVowels("eagle");

//Дублируем гласные в требуемых словах

duplicateLatinVowels("language");

duplicateLatinVowels("university");

system("pause");

return 0;

}

Задача 2. Создайте функцию, которая принимает в качестве аргументов две строки, являющиеся двоичными записями некоторых чисел, а возвращает расстояние Хэмминга между этими числами. Расстояние Хэмминга – это количество двоичных разрядов, в которых числа различаются. Например, расстояние Хэмминга между числами 10101 и 11100 равняется 2. Используя созданную функцию, определите расстояние Хэмминга между числами 1111 и 101010.

#include "stdafx.h"

#include <iostream>

#include <string>

using namespace std;

//Функция, дополняющая строку нулями

string addZeros(string str, int n_zeros) {

string zeros = "";

for (int i=0; i<n_zeros; i++) {

zeros += "0";

}

return zeros+str;

}

//Функция, вычисляющая расстояние Хэмминга

int hammingDistance(string str1, string str2) {

int l1 = str1.length();

int l2 = str2.length();

//Дополняем более короткую строку нулями

string s1, s2;

if (l1 < l2) {

s1 = addZeros(str1, l2-l1);

s2 = str2;

} else {

s1 = str1;

s2 = addZeros(str2, l1-l2);

}

//Вычисляем расстояние Хэмминга

int result = 0;

for (int i=0; i<s1.length(); i++) {

if (s1[i] != s2[i]) {

result++;

}

}

return result;

}

int main() {

//Проверяем тестовый пример

cout << hammingDistance("10101", "11100") << endl;

//Вычисляем расстояние для требуемых значений

cout << hammingDistance("1111", "101010") << endl;

system("pause");

return 0;

}

Задача 3. Создайте функцию, которая принимает в качестве аргумента строку и возвращает количество цифр в ней. Цифра – это один из символов от ‘0’ до ‘9’. Например, в строке «Сочи-2014» содержится четыре цифры. Используя созданную функцию, определите количество цифр в строке «31 декабря 2012 года».

#include "stdafx.h"

#include <iostream>

#include <string>

using namespace std;

//Функция, которая проверяет, является ли

//символ цифрой

bool isDigit(char ch) {

string digits = "0123456789";

for (int i=0; i<digits.length(); i++) {

if (digits[i]==ch) {

return true;

}

}

return false;

}

//Функция определения количества цифр в строке

int n_digits(string str) {

int result = 0;

for (int i=0; i<str.length(); i++) {

if (isDigit(str[i])) {

result++;

}

}

return result;

}

int main() {

//Проверяем тестовый пример

cout << n_digits("Сочи-2014") << endl;

//Вычисляем количество цифр в требуемой строке

cout << n_digits("31 декабря 2012 года") << endl;

system("pause");

return 0;

}

Задача 4. Создайте функцию, которая принимает в качестве аргумента строку и возвращает true, если в этой строке есть две подряд идущие одинаковые буквы, и false – иначе. Например, в слове коммуникатор есть две такие буквы, а в слове машинист – нет. Используя созданную функцию, проверьте наличие двух подряд идущих одинаковых букв в словах лайнер и антенна.

#include "stdafx.h"

#include <iostream>

#include <string>

using namespace std;

//Требуемая функция

bool hasRunningEquals(string str) {

for (int i=0; i<str.length()-1; i++) {

if (str[i] ==str[i+1]) {

return true;

}

}

return false;

}

int main() {

//Проверяем тестовые примеры

hasRunningEquals("коммуникатор") ?

cout << "Yes\n" : cout << "No\n";

hasRunningEquals("машинист") ?

cout << "Yes\n" : cout << "No\n";

//Проверяем требуемые строки

hasRunningEquals("лайнер") ?

cout << "Yes\n" : cout << "No\n";

hasRunningEquals("антенна") ?

cout << "Yes\n" : cout << "No\n";

cout << endl;

system("pause");

return 0;

}

Задача 5. Создайте процедуру, которая принимает аргументом строку и выводит ее, дублируя все цифры. Например, «Сочи-2014» – «Сочи-22001144». Используя созданную функцию, продублируйте цифры в следующей строке: «1 сентября 2012 года».

#include "stdafx.h"

#include <iostream>

#include <clocale>

#include <string>

using namespace std;

//Функция, которая проверяет, является ли

//символ цифрой

bool isDigit(char ch) {

string digits = "0123456789";

for (int i=0; i<digits.length(); i++) {

if (digits[i]==ch) {

return true;

}

}

return false;

}

//Процедура, дублирующая цифры в строке

void duplicateDigits(string str) {

for (int i=0; i<str.length(); i++) {

//Выводим очередной символ

cout << str[i];

//Выводим символ еще раз, если он - цифрой

if (isDigit(str[i])) {

cout << str[i];

}

}

cout << endl;

}

int main() {

setlocale(LC_ALL, "Russian");

//Проверяем тестовые примеры

duplicateDigits("Сочи-2014");

//Проверяем требуемые строки

duplicateDigits("1 сентября 2012 года");

system("pause");

return 0;

}

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Какие функции для ввода строк с клавиатуры и вывода строк на экран существуют? Приведите примеры.

  2. Объясните использование кавычек и апострофов применительно к строкам и символам.

  3. Как передавать строки в качестве аргументов функций? Приведите пример.

  4. Почему передавать длину строки в функцию вместе с самой строкой не нужно?

  5. Как передавать массивы строк в качестве аргументов функций? Приведите пример.

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