-
Notifications
You must be signed in to change notification settings - Fork 0
Solution_algorithm
Roman edited this page Jun 20, 2019
·
1 revision
- Цель проекта: создание программы, которая:
- 1. Определение максимальной степени вложенности циклов
- Запускаем цикл и сравниваем индекс символа строки и первое вхождение одного из трёх циклов (do…while, while, for).
- При совпадении текущего индекса и индекса первого вхождения одного из трёх циклов:
- Сравниваем количество знаков табуляций перед циклом. Если их количество меньше инициализированного, то запоминаем это число. Если же количество табуляций больше, то увеличиваем степень вложенности цикла. Так же для того, чтобы мы могли просмотреть все циклы, нам нужно заменить первый символ ключевого слова цикла заменить на другой, отличный от оригинального, например ‘0’. В конце первой строки цикла мы обнуляем количество табуляций.
- Если мы наткнулись на цикл do…while, то инкрементируем значение переменной dos, хранящей количество частей do цикла do…while, и ищем наибольшее количество табуляций перед началом данного цикла.
- Если нам встретится while, то мы проверяем, количество табуляций перед его началом. Если их количество меньше, либо равно максимальной степени вложенности do, то мы декрементируем значение переменной dos и значение переменной, хранящей степень вложенности циклов.
- После окончания подсчёта максимальной степени вложенности циклов, нам нужно отменить все изменения с циклами, мы заменили первые символы ключевых слов циклов на ‘0’. Для этого мы запускаем функцию cancel_changes(code) Её смысл в том, чтобы вместо “0o”, “0or”, “0hile” мы увидели “do”, “for”, “while” соответственно. Если коротко, то мы просто ищем вхождение каждого из трёх изменённых ключевых слов циклов в цикле и заменяем на оригинальные символы.
- Если мы вышли внешнего цикла, то мы сравниваем степень вложенности циклов с максимальной. Если она превышает её, то она будет считаться максимальной до следующей проверки, либо до окончания программы.
- Пример выполнения метода:
- Для примера возьмём пару циклов с разной степенью вложенности.
- Ход выполнения метода:
- 2. Подсчёт количества строк и символов, отличный от пробела
- Запускаем цикл.
- Если символ не является пробелом, то инкрементируем переменную symbols, хранящую в себе количество символов, отличных от пробела.
- Если мы находим символ конца строки, то увеличиваем значение переменной lines, обозначающей количество строк в тексте исследуемой программы, на единицу.
- Посмотрим, как выполняется данный метод по шагам:
- 3. Удаление комментариев
- Запускаем цикл и ищем индекс первого вхождения простого комментария, либо многострочного.
- Если мы нашли простой комментарий, то заменяем символ, индекс которого соответствует индексу первого вхождения символа простого комментария (“//”), на пробел и меняем значение логической переменной simple_comment на true, то есть мы даём программе понять, что простой комментарий открыт. Пока мы не дойдём до символа ‘\n’, происходит замена символов на ‘ ‘. Когда мы окажемся в конце строки (символ ‘\n’), мы меняем значение логической переменной simple_comment на false, то есть мы даём программе понять, что простой комментарий закрыт.
- Если же мы нашли многострочный комментарий, то алгоритм действия примерно такой же, как и при работе с простым комментарием. За исключением того, что в начале многострочного комментария должен быть символ “/*”, мы общаемся с программой посредством логической переменной complex_comment и ждём не завершения строки, а символа закрытия многострочного комментария. О последнем поподробнее. Если мы находим символ конца многострочного комментария (“*/”) мы заменяем текущий и следующий символы на ‘ ‘, а так же меняем значение логической переменной complex_comment на false, то есть мы даём программе понять, что многострочный комментарий закрыт.
- После успешного выполнения метода мы должны увидеть следующее:
- А теперь посмотрим подробнее, как исчезли один простой и один многострочный комментарии.
- Исчезновение простого комментария.
- Исчезновение многострочного комментария.
- • прочитав файл с текстом программы – объекта обработки (в дальнейшем, просто – программа-объект), выводит оригинальный код,
- • находит и просматривает все операторы циклы, сравнивает их степени вложенности и выводит на экран максимальную,
- • подсчитывает и выводит количество строк и количество символов, отличных от пробела,
- • удаляет комментарии и выводит измененный текст программы на консоль.
- Для реализации проекта необходимо начать разработку с составления контрольных примеров.
- Текст контрольного примера
- Была составлена контрольная программа-объект, удовлетворяющая всем требованиям ЕСПД, которая и используется в качестве данных для обработки разрабатываемого проекта:
// Объявляем и инициализируем переменные.
int a=0, b=0, n=5;
// Цикл с наименьшей вложенностью.
for (int i = 0; i < a; i++)
b++;
// Цикл со средней вложенностью.
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
a++;
// Цикл с наибольшей вложенностью.
while (a == b)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < a; k++)
{
b++;
do
for (int l = 0; l < n; l++)
b /= a * b;
while (a > b);
}
}
// Цикл со средней вложенностью.
do
{
for (int i = 0; i < 1; i++)
while (a > b)
{
b /= a * b;
}
} while (0);
/* Многострочный
комментарий*/
- В этом тексте программы разрабатываемое ПО будет искать максимальная степень вложенности циклов, количество строк и символов, отличных от пробела, в ней производилось удаление комментариев. Согласно требованиям ЕСПД, перед операторами внутри метода стоит как минимум один знак табуляции. Представленный текст хранится в файле example.cpp.
- Рассмотрим основные методы, необходимые для решения наших задач.
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
a++;
do
{
for (int i = 0; i < 1; i++)
while (a > b)
{
b /= a * b;
}
} while (0);