Раздел: Задачи / Простейшие /
Генератор наборов символов
|
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
В задачах по программированию довольно часто попадаются задачи по работе со строками и символами, и, в частности - задачи по работе с наборами символов (с предложениями, словами). Эти наборы символов можно создавать вручную. Но это утомительно. Поэтому лучше их генерировать программно.
В этой статье я предлагаю вам решить задачу “для решения задач” с наборами символов. То есть сделать программу, которая будет генерировать предложения, состоящие из “псевдо” слов.
Условие задачи 0.2
Задача 0.2
Написать программу, которая генерирует (создаёт) N наборов символов (слов). Набор символов - это "слово", то есть последовательность символов без пробелов. Наибольшая длина слова - 8 символов, наименьшая - 1. Объединить все полученные N наборов в строку (предложение) и вывести её на экран. "Слова" должны разделяться одним пробелом. Используются только английские символы. Предложение должно начинаться с заглавной буквы. В конце предложения точка.
Решение долго описывать не буду - всё достаточно подробно есть в комментариях.
Возможно, программа получилась излишне сложной. Однако в будущем для решения задач со строками всё это может пригодиться. В любом случае новичкам будет полезно поразбираться с исходными кодами и попытаться понять, почему всё сделано именно так, а не иначе.
Примеры программ на Паскале и С++.
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.
#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;
}
Обратите внимание, что в примере на С++ я использовал глобальные переменные. Дело в том, что функции в С++ не могут возвращать массивы так просто, как это делается в Паскале. Вернуть массив из функции в С++ можно только с помощью указателей. Но указатели - это не всем новичкам знакомая тема, и не для всех она проста. Поэтому я использовал глобальные переменные, что, конечно, нежелательно делать (особенно в больших программах, библиотеках и т.п.).
ВНИМАНИЕ!
Если вам что-то осталось непонятно, то советую почитать книги
“Основы программирования” и
“Основы С++”.
|
Вступить в группу "Основы программирования"
Подписаться на канал в РУТУБ Подписаться на Дзен-канал Подписаться на рассылки по программированию |
|
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |