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

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

26.06.2019
Новые видео и статья Функция Eof.

19.06.2019
Новая задача Генератор наборов символов.

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

27.04.2019
Новые видео и статья Процедура Dispose.



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

Генератор наборов символов

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

В этой статье я предлагаю вам решить задачу “для решения задач” с наборами символов. То есть сделать программу, которая будет генерировать предложения, состоящие из “псевдо” слов.

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

Задача 0.2
Написать программу, которая генерирует (создаёт) N наборов символов (слов). Набор символов - это "слово", то есть последовательность символов без пробелов. Наибольшая длина слова - 8 символов, наименьшая - 1. Объединить все полученные N наборов в строку (предложение) и вывести её на экран. "Слова" должны разделяться одним пробелом. Используются только английские символы. Предложение должно начинаться с заглавной буквы. В конце предложения точка.

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

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

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

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

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const
  MAX_WORDS = 16;     //Наибольшее количество слов в предложении
  MAX_SIMBOLS = 8;    //Наибольшее количество символов в слове
  MIN_SIMBOLS = 1;    //Наименьшее количество символов в слове
  MIN_ASCII = 97;     //Наименьшее значение ASCII-кода
  MAX_ASCII = 122;    //Наибольшее значение ASCII-кода

//****************************************************************
// ТИПЫ ДАННЫХ
//****************************************************************

//Слово
type TWordString = string[MAX_SIMBOLS];

//Предложение
type TSentenceWords = array[1..MAX_WORDS] of TWordString;

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Создаёт слово
//****************************************************************
function CreateWord : TWordString;
var i, j, n : byte;
    str     : TWordString;
begin
  str := '';
  n := Random(MAX_SIMBOLS) + MIN_SIMBOLS; //Количество букв в слове
  for i := 1 to n do                      //Создать слово из случайных символов
    begin
      j := MIN_ASCII + Random(MAX_ASCII - MIN_ASCII + 1);
      str := str + Chr(j);
    end;
  Result := str;
end;

//****************************************************************
// Создаёт предложение (строку)
//****************************************************************
function CreateSentence : string;
var i, n  : byte;
    str   : string;
begin
  str := '';
  n := Random(MAX_WORDS) + 1;     //Количество слов в предложении
  for i := 1 to n do              //Создать предложение из случайных слов
    begin
      if i = 1 then  //Первое слово
        begin
          str := CreateWord;
          str[1] := UpCase(str[1]);
        end
      else
        str := str + ' ' + CreateWord;
    end;
  Result := str + '.';
end;

//****************************************************************
// Создаёт предложение (массив слов)
//****************************************************************
function CreateSentenceWords : TSentenceWords;
var i, n  : byte;
    str   : TSentenceWords;
begin
  for i := 1 to MAX_WORDS do str[i] := '';
  n := Random(MAX_WORDS) + 1;     //Количество слов в предложении
  for i := 1 to n do              //Создать массив случайных слов
    str[i] := CreateWord;
  Result := str;
end;

//****************************************************************
// Преобразует массив слов в предложение
//****************************************************************
function WordsToSentence(M : TSentenceWords) : string;
var i     : byte;
    str   : string;
begin
  str := '';
  for i := 1 to MAX_WORDS do
    begin
      if M[i] = '' then Break;
      if i = 1 then //Первое слово
        begin
          str := M[i];
          str[1] := UpCase(str[1]);
        end
      else
        str := str + ' ' + M[i];
    end;
  Result := str + '.';
end;

//****************************************************************
// Выводит массив слов на экран
//****************************************************************
procedure ArrayToScreen(M : TSentenceWords);
var i : byte;
begin
  for i := 1 to MAX_WORDS do
    begin
      if M[i] = '' then Break;
      WriteLn(M[i]);
    end;
end;

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
var
  WordsArray : TSentenceWords;

//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
begin
  Randomize;

  //Создать массив слов
  WordsArray := CreateSentenceWords;

  //Вывести слова из массива
  ArrayToScreen(WordsArray);

  //Вывести предложение из массива
  WriteLn(WordsToSentence(WordsArray));

  //Создать и вывести предложение
  WriteLn(CreateSentence);

  WriteLn(#10#13'The end. Press ENTER...');

  ReadLn;
end. 

Решение задачи 0.2 на С++
#include <cstdlib>
#include <iostream>

#include <ctime> //!!! Подключить этот модуль, если ругается на srand


using namespace std;

//****************************************************************
// КОНСТАНТЫ
//****************************************************************
const unsigned char MAX_WORDS = 16;   //Наибольшее количество слов в предложении
const unsigned char MAX_SIMBOLS = 8;  //Наибольшее количество символов в слове
const unsigned char MIN_SIMBOLS = 1;  //Наименьшее количество символов в слове
const unsigned char MIN_ASCII = 97;   //Наименьшее значение ASCII-кода
const unsigned char MAX_ASCII = 122;  //Наибольшее значение ASCII-кода

//****************************************************************
// ТИПЫ ДАННЫХ
//****************************************************************

//Слово
typedef string TWordString;

//Предложение
typedef TWordString TSentenceWords[MAX_WORDS];

//****************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//****************************************************************
TWordString WordString;
TSentenceWords WordsArray;

//****************************************************************
// ФУНКЦИИ И ПРОЦЕДУРЫ
//****************************************************************

//****************************************************************
// Создаёт слово
//****************************************************************
string CreateWord()
{
  unsigned char i, j, n;
  string str;

  str = "";
  WordString.clear();
  n = (rand() % MAX_SIMBOLS) + MIN_SIMBOLS;
  for (i = 0; i < n; i++)    //Создать слово из случайных символов
    {
      j = MIN_ASCII + (rand() % (MAX_ASCII - MIN_ASCII + 1));
      str = str + char(j);
    }
  return(str);
}

//****************************************************************
// Создаёт предложение (строку)
//****************************************************************
string CreateSentence()
{
  int i, n;  
  char chLetter('a');
  string str;
  
  str = "";
  n = (rand() % MAX_WORDS) + 1;
  
  for (i = 0; i < n; i++) //Создать предложение из случайных слов
    {
      if (0 == i)         //Первое слово
        {
          str = CreateWord();
          chLetter = str[0];
          chLetter = chLetter - 32;
          str[0] = chLetter;
        }
      else
        str = str + " " + CreateWord();
    }
    
  return(str + ".");
}

//****************************************************************
// Создаёт предложение (массив слов)
//****************************************************************
void CreateSentenceWords()
{
  int i, n;
  
  for (i = 0; i < MAX_WORDS; i++) WordsArray[i] = "";
  n = (rand() % MAX_WORDS) + 1;
  
  for (i = 0; i < MAX_WORDS; i++)  //Создать массив случайных слов
    WordsArray[i] = CreateWord();
    
  return;
}

//****************************************************************
// Преобразует массив слов в предложение
//****************************************************************
string WordsToSentence()
{
  char chLetter('a');
  string str;
  
  str = "";
  for (int i = 0; i < MAX_WORDS; i++)
    {
      if ("" == WordsArray[i]) break;
      if (0 == i)         //Первое слово
        {
          str = WordsArray[i];
          chLetter = str[0];
          chLetter = chLetter - 32;
          str[0] = chLetter;
        }
      else
        str = str + " " + WordsArray[i];
    }
    
  return(str + ".");
}

//****************************************************************
// Выводит массив слов на экран
//****************************************************************
void ArrayToScreen()
{
  for (int i = 0; i < MAX_WORDS; i++)
    {
      if ("" == WordsArray[i]) break;
      cout << WordsArray[i] << endl;
    }
  return;
}


//****************************************************************
// ОСНОВНАЯ ПРОГРАММА
//****************************************************************
int main(int argc, char *argv[])
{
  srand(time(0));      //Запустить генератор случайных чисел

  //Создать массив слов
  CreateSentenceWords();

  //Вывести слова из массива
  ArrayToScreen();

  //Вывести предложение из массива
  cout << WordsToSentence() << endl;

  //Создать и вывести предложение
  cout << CreateSentence() << endl;            
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Генератор слов из букв

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

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


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

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

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