Раздел: Задачи / Простейшие /
Генератор наборов символов
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
В задачах по программированию довольно часто попадаются задачи по работе со строками и символами, и, в частности - задачи по работе с наборами символов (с предложениями, словами). Эти наборы символов можно создавать вручную. Но это утомительно. Поэтому лучше их генерировать программно.
В этой статье я предлагаю вам решить задачу “для решения задач” с наборами символов. То есть сделать программу, которая будет генерировать предложения, состоящие из “псевдо” слов.
Условие задачи 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), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |