В файл записан текст. Нужно вывести на экран все слова, которые заканчиваются такой буквой, на какую начинаются. Не использовать string. Не использовать STL и сторонние библиотеки

Строки в C++ могут быть представлены разными способами, отчего у начинающих часто возникают проблемы с понимаем разных примеров. Но как бы ни представлялась строка программистом — она всегда последовательность символов. Обычно со строками, как бы они ни были представлены, можно работать как с одномерными массивами. Это важное обстоятельство легко можно упускать из виду при недостатке опыта. Но если вы понимаете, что строками можно работать как с массивами, то и решать задачи становится резко легче.
Одна из проблем при работе со строковым представлением связана с выделением памяти для указателей, должных выполнять функции строк. При возможности не использовать указатели не нужно использовать указатели. Но иногда условием задачи может подразумеваться неиспользование удобных стредств для работы со строками (таких как std::string), что часто подразумевает использование в C++ строк в стиле C, но иногда это ещё означает, что строи должны быть только хранилищем и дополнительные строки создавать не нужно: что бы вы не использовали для строкового представления — это всегда выделение памяти с помощью new[] и работа delete [], а это долгие операции. Прямая работа с памятью — это всегда долго.
В этой статье показано решение задачи, в котором удачно избегается прямая работа с распределением памяти.
Задача:

  • В файл записан текст. Нужно вывести на экран все слова, которые заканчиваются такой буквой, на какую начинаются. Не использовать string. Не использовать STL и сторонние библиотеки.
Будем считать, что две одинакове буквы, имеющие разный регистр, одинаковые, а два одинаковых графических символа, принадлежащие разным языкам — разные (что латинская A и наша родная А — неодинаковы и т. д.). Можно, конечно, сделать регистронезависимое сравнение и сопоставление графисеских символов разных языков, но это немного раздует количество кода.
Первое действие — разработка некоторой стратегии решения. Задача может иметь уйму способов решений, но мы остановимся на одном. Можно посимвольно читать файл и по прочитанным символам составлять слово, после чего это слово проверять на равенство первой и последней буквы. Если равенство справедливо — то выводить слово на экран. Само по себе посимвольное чтение вполне можно использовать для разбиения на слова: для этого нужно только определиться, что считать разделителями. Прочитанное слово нужно где-то хранить. Для хранение достаточно объявить массив символов. Ничего придумывать не будем, дабы не осложнять сейчас то, что еще в принципе не особо-то и понимаем (если кто не понимает, конечно). Как-то нужно узнавать первый и последний символы слова. С первым проблем нет: если курсор, бегающий по строке, находится в начальной (нулевой) позиции и прочитан значащий символ-не_разделитель, то прочитанный символ — это первый символ; сложнее с последним символом слова. В примере я решил не мудрить и добавить одну переменную, в которую на каждой итерации будет записываться символ, если этот символ не является разделителем.
Вступление было написано для того, чтобы заложить базу понимания того, кода который я покажу.

Код был проверен по файлу с текстом:

текст для проверки
	слово барак кабак
	капитан, налим, махал
		

Последним символов в файле должен быть любой разделитель, иначе последнее слово не попадёт на обработку. Это связано с тем, что для выборки символов используется int ch;, а не char ch. Целое (int) преобразовывается в char. Использование int вместо char обусловлено тем, что так можно нормально прочитать файл посимвольно. Вступлением уже обозначен общий принцип работы кода, поэтому, надеюсь, пример окажется понятен и полезен.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/k-u-polyakov/konstruiruem-robotov-na-scratchduino-pervye-shagi-21630328/?lfrom=15589587
Яндекс.Метрика