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

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

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Условие задачи 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;
}

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

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

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

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


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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