Согласие на обработку персональных данных.

09.07.2020
Новые видео и статья Операторы != и == против операторов !== и ===.

04.07.2020
Новый выпуск журнала Автоматизация и Программирование.

15.06.2020
Новые видео и статья JavaScript и CSS.

10.06.2020
Новые видео и статья Как в С++ получить от пользователя строку с пробелами.

08.06.2020
Новый выпуск журнала Автоматизация и Программирование.



Раздел: Задачи / Простейшие /

Найти в строке слова на букву А

Условие задачи 5.2

Задача 5.2
Дана последовательность символов, состоящая из слов. Удалить из текста все слова, начинающиеся на букву А (независимо от регистра). Вывести на экран исправленную строку. Если в тексте нет слов с указанным свойством, то вывести на экран сообщение НЕТ.

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

  1. Создать один текстовый файл и загружать текст из файла. Но тогда это будет всегда одно и то же предложение (или придётся создать несколько файлов). А такая одинаковость не есть хорошо для проверки работы программы.
  2. Автоматически генерировать текст со случайным наборов символов.

Я выбираю второй вариант. И я уже рассказывал о том, как это сделать (ссылка). Поэтому в данной статье я буду использовать готовые модули с готовыми функциями (как использовать модули я тоже уже рассказывал здесь).

Итак, чтобы найти в тексте все слова на букву А, можно воспользоваться разными способами. Например, искать с помощью стандартных функций в строке последовательность символов “ А” (то есть подстроку, состоящую из пробела и буквы А). Поскольку перед словом в правильном предложении всегда должен быть пробел (точнее, пробел может быть не всегда - например, перед словом может быть скобка, но чтобы не усложнять задачу, мы ограничимся этим условием).

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

  1. Если я нашёл пробел, то проверю следующий символ в строке.
  2. Если это не буква А, то я буду копировать символы в новую строку до следующего пробела.
  3. Если это “а” или “А” (то есть маленькая или большая буква А), то я НЕ буду копировать символы в новую строку.

То есть я поочерёдно буду копировать символы в новую строку, если это НЕ символы слова, начинающегося на букву А. Всё. А если у вас ещё остались вопросы, то см. примеры исходных кодов.

Примеры программ на Паскале и С++.

Решение задачи 5.2 на Паскале
program mytask;

uses gensim;

//*******************************************************************
// КОНСТАНТЫ
//*******************************************************************
const
  SEARCH_SIMBOL = 'A';

//*******************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//*******************************************************************
var
  i, k  : WORD;
  CRes  : boolean = TRUE; //Флаг разрешения копирования
  SText : string;         //Исходный текст
  EText : string;         //Исправленный текст
  SCount: WORD = 0;       //Количество найденных и удалённых слов

//*******************************************************************
// ОСНОВНАЯ ПРОГРАММА
//*******************************************************************
begin
  //Создать и вывести предложение
  SText := CreateSentence;
  EText := '';
  WriteLn(SText);
  //Перебираем буквы в цикле
  for i := 1 to (Length(SText)-1) do
    begin
      //Если это начало слова или первая буква в предложении
      if (SText[i] = ' ') or (i = 1) then
         begin
           CRes := TRUE; //Разрешить копирование для следующего слова
           if (i = 1) then k := 1
           else k := i + 1;
           //Если это искомая буква, то
           if (UpCase(SText[k]) = SEARCH_SIMBOL) then
             begin
               Inc(SCount);   //увеличить количество найденных слов
               CRes := FALSE; //запретить копирование
             end;
         end;
      //Если копирование разрешено, то скопировать букву
      if CRes then EText := EText + SText[i];
    end;
  //Последний символ
  if CRes then EText := EText + SText[i+1];
  //Удалить первый пробел, если есть
  if EText[1] = ' ' then Delete(EText, 1, 1);
  //Добавить точку, если нет
  if EText[Length(EText)] <> '.' then
    EText := EText + '.';

  //Вывод
  WriteLn(EText);
  WriteLn('Deleted words: ', SCount);
  WriteLn('The end. Press ENTER...');
  ReadLn;
end.
Решение задачи 5.2 на С++
#include <cstdlib>
#include <iostream>
#include <ctime>      //!!! Подключить, если будет ругаться на srand
#include "getsim.h"

using namespace std;

//*******************************************************************
// КОНСТАНТЫ
//*******************************************************************
const char SEARCH_SIMBOL = 'A';

//*******************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//*******************************************************************
unsigned int i, k = 0;
bool CRes = true;        //Флаг разрешения копирования
string SText;            //Исходный текст
string EText;            //Исправленный текст
unsigned int SCount = 0; //Количество найденных и удалённых слов   

//*******************************************************************
// ОСНОВНАЯ ПРОГРАММА
//*******************************************************************
int main(int argc, char *argv[])
{
	srand(time(0));       //Запустить генератор случайных чисел
  //Создать и вывести предложение
  SText = CreateSentence();
  EText = "";
  cout << SText << endl;
  //Перебираем буквы в цикле
  for (i = 0; (i < (SText.length()-1)); i++)
  {
  	//Если это начало слова или первая буква в предложении
  	if ((SText[i] == ' ') || (i == 0))
  	{
  	  CRes = true;   //Разрешить копирование для следующего слова
  	  if (i == 0) k = 0;
  	  else k = i + 1;
  	  //Если это искомая буква, то
  	  if (char(toupper(SText[k])) == SEARCH_SIMBOL) 
  	  {
  		SCount++;     //Увеличить количество найденных слов
          CRes = false; //Запретить копирование
	  }
	}
    //Если копирование разрешено, то скопировать букву
    if (CRes) EText = EText + SText[i];
  }
  //Последний символ
  if (CRes) EText = EText + SText[i];
  //Удалить первый побел, если есть
  if (EText[0] == ' ') EText.erase(0, 1);
  //Добавить точку, если нет
  if (EText[EText.length()-1] != '.') EText = EText + '.';
  
  //Вывод
  cout << EText << endl;
  cout << "Deleted words: " << SCount << endl;
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Найти в строке слова, начинающиеся на букву А

Ну вот и всё. Не так уж и сложно. Хотя уверен, если вы пытались решить задачку самостоятельно, то потратили на это немало сил и времени )))

Так что подписывайтесь на рассылки, чтобы не пропустить новые задачи с решениями...

ВНИМАНИЕ!
Если вам что-то осталось непонятно, то советую почитать книги “Основы программирования” и “Основы С++”.


Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика