Programming Taskbook

English

E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

Электронный задачник по программированию

©  М. Э. Абрамян, 1998–2011

 

Решения | C++ | Обработка строк

PrevNext


Выполнение задания на обработку строк: String9

Особенности выполнения заданий на обработку символов и строк рассмотрим на примере задания String9.

String9°. Дано четное число N (> 0) и символы C1 и C2. Вывести строку длины N, которая состоит из чередующихся символов C1 и C2, начиная с C1.

Создание программы-заготовки и знакомство с заданием

Проект-заготовку для решения задания String9 можно создать с помощью модуля PT4Load. Приведем текст функции Solve из файла String9.cpp, входящего в созданный проект (именно в эту функцию требуется ввести решение задания):

void Solve()
{
  Task("String9");
}

После запуска программы на экране появится окно задачника следующего вида.

Символьные данные типа char и string в окне задачника заключаются в одинарные и двойные кавычки соответственно; это позволяет отличить числовые данные (например, 2) от символьных и строковых данных, содержащих цифры (например, символа '2'). Кроме того, кавычки дают возможность увидеть пробелы, находящиеся в начале или в конце строк.

Ввод исходных данных

Добавим в функцию Solve фрагмент, обеспечивающий ввод исходных данных. Для ввода данных типа char и int можно использовать функции GetC и GetN, однако проще воспользоваться специальным потоком ввода-вывода pt:

void Solve()
{
  Task("String9");
  int n;
  char c1, c2;
  pt >> c1 >> c2 >> n;
}

Мы намеренно ввели данные не в том порядке, в котором они указаны в окне задачника.

Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе выполняется ввод исходных данных. Так как порядок ввода исходных данных является ошибочным, этот вариант решения будет признан неверным и приведет к сообщению «Неверно указан тип при вводе исходных данных. Для ввода 1-го элемента (целого типа) использована переменная символьного типа».

Напомним правило, определяющее порядок ввода и вывода данных для задачника Programming Taskbook: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз.

Исправим функцию Solve, изменив в ней порядок ввода исходных данных:

  pt >> n >> c1 >> c2;

Теперь исходные данные вводятся правильно. Однако из-за того что в программе отсутствует вывод результирующих данных, решение снова будет признано ошибочным; при этом на информационной панели появится сообщение «Выведены не все результирующие данные. Количество выведенных данных: 0 (из 1)»

Формирование требуемой строки и ее вывод

Для хранения строки будем использовать переменную типа string. Заметим, что для возможности использования данного типа программа должна содержать следующую директиву:

using namespace std;

Однако добавлять данную директиву в начало файла String9.cpp необязательно, так как эта директива уже содержится в файле pt4.h, который подключается к файлу String9.cpp.

Формировать нужную строку будем с помощью операции «+» сцепления строк; для вывода полученной строки воспользуемся потоком вывода pt:

void Solve()
{
  Task("String9");
  int n;
  char c1, c2;
  pt >> n >> c1 >> c2;
  string s = "";
  for (int i = 0; i < n; i++)
    s = s + c1 + c2;
  pt << s;
}

При выполнении этой программы в области результатов будет выведена строка, оканчивающаяся особым символом — красной звездочкой, например:

"a1a1a1a1a1*

Красная звездочка, расположенная в конце строки, отображаемой на экране, означает, что длина полученной строки превышает длину контрольной (т. е. «правильной») строки. Для того чтобы увидеть на экране всю полученную строку, достаточно подвести курсор мыши к строке со звездочкой; при этом полный текст строки появится во всплывающей подсказке.

Примечание. Красная звездочка может появиться и при выводе ошибочных числовых данных. Например, если ожидается целое число в диапазоне от 1 до 99, а получено число 10000, то на экран будет выведена только первая цифра этого числа, за которой будет указана красная звездочка: 1*.

Правильное решение, его тестирование и просмотр результатов

Ошибка в предыдущей программе возникла из-за неверного указания количества итераций цикла. Действительно, на каждой итерации к строке добавляется по два символа, поэтому после n итераций строка будет содержать 2n символов (а не n, как требуется в задании).

Для исправления ошибки достаточно вдвое уменьшить число итераций, изменив заголовок цикла следующим образом:

  for (int i = 0; i < n / 2; i++)

После запуска исправленной программы мы получим сообщение «Верное решение. Тест номер 1 (из 5)», а после пяти подобных запусков — сообщение «Задание выполнено!». С помощью команды меню «Tools | PT4 Results» мы можем вывести на экран окно результатов, в котором будут перечислены все наши попытки решения задания (буква «c», которая указывается перед датой, означает, что при выполнении задания использовался язык C++):

String9   c24/03 11:37 Ознакомительный запуск.
String9   c24/03 11:48 Неверно указан тип при вводе исходных данных.
String9   c24/03 11:49 Выведены не все результирующие данные.
String9   c24/03 11:49 Ошибочное решение.
String9   c24/03 11:52 Задание выполнено!

Примечание. Для решения задания можно было бы использовать и тип char*, формируя результирующую строку как обычный символьный массив. Приведем соответствующий вариант решения:

void Solve()
{
  Task("String9");
  int n;
  char c1, c2;
  pt >> n >> c1 >> c2;
  char* s = new char[n + 1];
  for (int i = 0; i < n / 2; i++)
  {
    s[2 * i] = c1;
    s[2 * i + 1] = c2;
  }
  s[n] = 0;
  pt << s;
  delete[] s;
}

PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
11.10.2011