Практическая работа №5. Работа со строками 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Практическая работа №5. Работа со строками



Цель работы: изучение принципов работы со строковыми данными в С++.

 

Задачи:

1. Изучить теоретический материал

2. Написать программу согласно индивидуальному варианту задания.

3. Ответить на контрольные вопросы.

4. Оформить отчет.

 

Теоретический материал

С++ не содержит стандартного типа данных «строка». Вместо этого он поддерживает массивы символов, заканчивающиеся нуль-символом. Нуль–символ – это символ с кодом, равным 0, что записывается в виде управляющей последовательности ‘\0’. По положению его определяется фактическая длина строки. Пример описания строки:

char str[10] = “Vasia”;       //выделено 10 элементов с номерами от0 до 9

// первые элементы –‘v’,’a’,’s’,’i’,’a’,’\0’.

Если строка при определении инициализируется, ее размерность можно опускать.

char str[] = “Vasia”; //выделено и заполнено 6 байт

Оператор char *str = “Vasia”;

создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно.

Знак равенства перед строковым литералом означает инициализацию, а не присваивание. Операция присваивания одной строки другой не определена (поскольку строка является массивом) и может выполняться с помощью циклов или функций стандартной библиотеки. Библиотека C (заголовочный файл <string.h> или <csting.h>) представляет возможности копирования, сравнения, объединения строк, поиска подстроки, определения длины строки и т.д., а также ввод и вывод строк – функции gets и puts.

Функция считывания строки gets получает строку от устройства ввода (клавиатуры). Поскольку строка не имеет заранее заданной длины, функции gets должна знать, когда ей прекратить работу. Она читает символы до тех пор, пока ей не встретится символ новой строки (‘\n’), который вы создаете, нажимая [Ввод]. Функция берет все символы до символа новой строки, присоединяя к ним 0-символ.

Пример:

char name [81];

printf("как вас зовут? \n",name);

gets (name);

printf ("хорошее имя,%s. \n", name);

Функция примет любое имя до 80 символов.

Функции вывода строки puts имеет один аргумент. Например,

puts("Это аргумент функции puts().");

Функция прекращает работу, когда встретится нуль-символ.

Также для ввода и вывода строк используются объекты cin и cout класса iostream.

# include <iostream.h>

int main() {

const int n=80;

char s[n];

cin >> s;

cout << s << endl;

return 0;

}

Эта программа выполнится правильно, если ввести строку, состоящую из одного слова. Это связано с тем, что ввод выполняется до первого пробельного символа (то есть пробела, знака табуляции или символа перевода строки “\n”).

Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используют методы getline или get класса iostream, объектом которого является cin. После имени объекта ставится точка, а затем пишется имя метода:

#include<iostream.h>

int main() {

const int n=8;

char s[n];

cin.getline(s,n);

cout << s << endl;

cin.get(s,n);

cout << s << endl;

return 0;

}

Метод getline считывает из входного потока n-1 символов или менее и записывает их в строковую переменную s. Символ перевода строки также считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размещается завершающий 0. Метод get работает аналогично, но оставляет в потоке символ перевода строки.

Не обращайтесь к методу get с двумя аргументами два раза подряд, не удалив \n из входного потока. Возможное решение этой проблемы - вызов метода get без параметров (cin.get()).

Более простое решение – использовать метод getline, который после прочтения строки не оставляет во входном потоке символ \n.

Если в программе требуется ввести несколько строк, метод getline удобно использовать в заголовке цикла, например:

#include<iostream.h>

int main() {

const int n=80;

char s[n];

while(cin.getline(s, n)) {

   cout << s << endl;

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

}

return 0;

}

Для ввода-вывода строк используются как уже известные вам объекты cin и cout, так и функции, унаследованные из библиотеки С.

Рассмотрим первый способ.

#include <iostream.h>

 int main() {

  const int n=80;

char s[n];

cin >> s;

cout << s << endl;

return 0;

 }

Эта программа выполнится правильно, если ввести строку, состоящую из одного слова. Это связано с тем, что ввод выполняется до первого пробельного символа (то есть пробела, знака табуляции или символа перевода строки "\n").

Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используют методы getline или get класса iostream, объектом которого является cin. После имени объекта ставится точка, а затем пишется имя метода:

 

#include <iostream.h>

 int main() {

const int n=8;

char s[n];

cin.getline(s, n);

cout << s << endl;

cin.get(s, n);

cout << s << endl;

return 0;

 }

 

Метод getline считывает из входного потока n-1 символов или менее и записывает их в строковую переменную s. Символ перевода строки также считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размещается завершающий 0. Метод get работает аналогично, но оставляет в потоке символ перевода строки.

Не обращайтесь к методу get с двумя аргументами два раза подряд, не удалив \n из входного потока. Возможное решение этой проблемы - вызов метода get без параметров (cin.get()).

Более простое решение – использовать метод getline, который после прочтения строки не оставляет во входном потоке символ \n.

Если в программе требуется ввести несколько строк, метод getline удобно использовать в заголовке цикла, например:

 

#include <iostream.h>

 int main() {

const int n=80;

char s[n];

while(cin.getline (s, n)) {

    cout << s << endl; //обработка строки

}

return 0;

 }

 

Задача 4.1. Поиск подстроки

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

#include <fstream.h>

 #include <string.h>

 int main() {

const int len=81;

char word[len], line[len];

cout << "Введите слово для поиска: ";

cin >> word;

ifstream fin("text.txt", ios::in:: | ios:: nocreate);

if(!fin) {

    cout << "Ошибка открытия файла: " << endl;

    return 1;

}

while (fin.getline(line,len)) {

    if (strstr(line, word)){

        cout << "Присутствует!" << endl;

        return 0;

    }

}

cout << "Отсутствует!" << endl;

return 0;

 }

 

Функции над строками

Основные функции, используемые для работы со строками:gets()           считывает строку со стандартного устройства ввода

scanf() читает форматированные данные со стандартного устройства ввода

puts() выводит строку на стандартное устройство вывода

printf() выводит форматированные данные на стандартное устройство вывода

stpcpy()      копирует одну строку в другую

strcat() добавляет одну строку в конец другой

strchr() обнаруживает первое вхождение данного символа в строке

strcmp()      сравнивает две строки

strcpy()       копирует одну строку в другую

strcspn()     обнаруживает в строке первое вхождение символа из заданной последовательности символов

strlen() определяет длину строки

strlwr() преобразует строку в символы нижнего регистра (в строчные буквы)

strncat()      присоединяет к строке N символов

strncmp()    сравнивает N символов в двух строках

strncpy()     копирует N символов из одной строки в другую

strnset()      заполняет N символов строки заданным символом

 strpbrk()    обнаруживает первое вхождение символа из одной строки в другой строке

strrchr()      обнаруживает последнее вхождение данного символа в строке

strrev() реверсирует строку (записывает в обратном порядке)

strspn()       находит в строке первую подстроку из заданной последовательности символов

strstr() обнаруживает первое вхождение данной строки вдругой строке

strtok() находит очередную лексему в строке

strupr()       преобразует строку в символы верхнего регистра (в прописные буквы)

atoi() преобразовывает строку в значение типа int

atof() преобразовывает строку в значение типа double

itoa() преобразовывает значение типа int в строку символов

gcvt() преобразовывает значение типа double в строку символов

Основные моменты при работе со строками.

Длина динамической строки может быть переменной. Динамические строки нельзя инициализировать при создании.

Длина нединамической строки должна быть константным выражением.

При задании длины строки необходимо учитывать завершающий нуль – символ.

Присваивание строк выполняется с помощью функций библиотеки.

Для консольного вывода строк используются либо объекты cin и cout, либо функции библиотеки gets, scanf и puts, printf.

Ввод-вывод из файла может выполняться с помощью либо объектов классов ifstream и ofstream, либо функций библиотеки fgets, fscanf и fputs, fprintf.

Ввод строки с помощью операции >> выполняется до первого пробельного символа. Для ввода строки, содержащей пробелы, можно использовать либо методы getline или get класса istream, либо функции библиотеки gets и scanf.

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

Посимвольное чтение из файла неэффективно.

Разбивайте написание программы на последовательность шагов.

Выход за границы строки и отсутствие нуль - символа являются распространенными причинами ошибок в программах.

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

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

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

Индивидуальные варианты заданий

1. Написать программу, которая считывает 3 предложения и выводит их в обратном порядке.

2. Написать программу, которая считывает предложение и выводит на экран только слова, содержащие введенную с клавиатуры букву.

3. Написать программу, которая считывает предложение и выводит на экран только слова, содержащие двузначные числа.

4. Написать программу, которая считывает предложение на английском и выводит на экран слова, начинающиеся с гласных букв.

5. Написать программу, которая считывает предложение и выводит его на экран, меняя местами каждые 2 соседних слова.

6. Написать программу, которая считывает предложение и определяет, сколько в нем слов, состоящих из не более чем четырех букв.

7. Написать программу, которая считывает предложение и выводит на экран только слова, состоящие из заданного количества букв.

8. Написать программу, которая считывает предложение, находит самое длинное слово и определяет, сколько раз оно встретилось в предложении.

9. Написать программу, которая считывает предложение и выводит его на экран, после каждого слова добавляя, сколько раз оно встретилось в предложении.

10. Написать программу, которая считывает предложение и выводит на экран все слова в нем в обратном порядке.

 

Контрольные вопросы

1. Как осуществляется описание символьных строк?

2. Перечислите функции ввода-вывода строк.

3. Перечислите функции работы со строками. Какие заголовочные файлы используются для этого?

 

Содержание отчета

1. Титульный лист

2. Цели, задачи работы

3. Индивидуальное задание

4. Блок-схема алгоритма (для каждой задачи)

5. Листинг программы(для каждой задачи)

6. Результат выполнения программы – скриншот (для каждой задачи)

7. Ответы на контрольные вопросы

 



Поделиться:


Последнее изменение этой страницы: 2021-04-20; просмотров: 139; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.120.109 (0.053 с.)