Я пытаюсь написать схему программы, которая подсчитывает количество операторов if файл, содержащий код. Я знаю, как читать в файле, но я не знаю, как подсчитать количество операторов if.
Al8990 6 Май 2019 в 00:02
2 ответа
Лучший ответ
Это очень сложно без фактической реализации приведения языка к более примитивной форме. В качестве примера представьте это:
(count-ifs ‘(let ((if +)) (if 1 2 3))) ; ==> 0
0 — правильное количество, поскольку if — это теневое копирование if , а схема поддерживает теневое копирование, поэтому результатом этого выражения является 6 , а не 2 . let можно переписать так, чтобы вы могли проверить это вместо этого:
(count-ifs ‘((lambda (if) (if 1 2 3)) +)) ; ==> 0
Это может не выглядеть как улучшение, но здесь вы можете исправить это:
(define (count-ifs expr) (let helper ((expr expr) (count 0)) (if (or (not (list? expr)) (and (eq? (car expr) ‘lambda) (memq ‘if (cadr expr)))) count (foldl helper (if (eq? (car expr) ‘if) (add1 count) count) expr)))) (count-ifs ‘((lambda (if) (if 1 2 3)) (if #t + (if if if)))) ; ==> 2
Задача состоит в том, чтобы расширить макросы. На самом деле вам нужно сделать макроэкспандер, чтобы переписать код так, чтобы единственными привязками, создающими форму, были lambda . Это тот же объем работы, что и создание 80% компилятора Scheme, поскольку, как только вы его отключите, все остальное легко.
Урок 4 Переменные в Python. Оператор присваивания
Sylwester 6 Май 2019 в 22:00
Простой способ сделать это может быть структура рекурсии, как это:
(define (count-ifs exp) (+ (if-expression? exp 1 0))) (if (pair? exp) (+ (count-ifs (car exp)) (count-ifs (cdr exp)))) 0)))
Но это может быть чрезмерным.
Более правильный способ сделать это — обработать код, проверив каждый тип выражения, которое вы видите — и когда вы вводите лямбду, вам нужно добавить переменные, которые она связывает, со списком теневых символов.
Источник: question-it.com
Подсчет операторов в C++
Поэтому мне нужно посчитать количество условных операторов в исходном коде C++:
#include #include #include using namespace std; int main ()
Мне нужен поиск по строкам, а не семантический, так как это курсовая работа, и я не думаю, что они ожидают чего-то впечатляющего. Проблема в том, как мне strstr() функция для просмотра всего исходного кода вместо единственной переменной, переданной в качестве первого параметра? Кроме того, это хороший подход к решению задачи?
user3794668 02 июл ’14 в 23:56 2014-07-02 23:56
2014-07-02 23:56
2 ответа
Поэтому мне нужно посчитать количество условных операторов в программе на C++.
Проблема в том, как мне сказать функции strstr() просмотреть весь исходный код вместо одной переменной, переданной в качестве первого параметра?
Вы не можете указать strstr (или любой другой функции C/C++) выполнить поиск работающей / скомпилированной программы, потому что текст исходного кода больше не существует в этой точке.
23 Функция ЕСЛИ в Excel (IF)
Вместо этого вам нужно написать программу, которая может открывать ваши фактические исходные файлы (файлы.cpp, .h и т. Д.), Загружать текст в строковые переменные в памяти и затем искать в них то, что вы хотите найти.
user126027 03 июл ’14 в 00:31 2014-07-03 00:31
2014-07-03 00:31
Я думаю, что вам нужно было бы создать текстовый анализатор, который отделен от источника, который вы хотите исследовать. Для этого создайте новый проект C++, затем:
- Читать в файл в память
- Создайте таблицу поиска строк или символьных массивов, которые содержат условные операторы, существующие в C++, такие как: «if», «else», «goto» и т. Д.
- Переберите каждый символ в памяти и сравните найденный символ с таблицей поиска. Если вы нашли совпадение, увеличьте счетчик.
Источник: stackru.com
Метрики сложности потока управления программ
Метрики сложности потока управления программ принято определять на основе представления программ в виде управляющего ориентированного графа G=( V, E), где V — вершины, соответствующие операторам, а Е — дуги, соответствующие переходам между операторами. В дуге ( v, и) вершина v является исходной, а и — конечной. При этом и непосредственно следует за v, a v непосредственно предшествует и. Если путь от v до u состоит более чем из одной дуги, тогда и следует за v, а v предшествует и [2].
Частным случаем представления ориентированного графа программы можно считать детализированную схему алгоритма, в которой каждому блоку соответствует один оператор программы, построенную в соответствии с положениями стандарта ГОСТ 19.701-90 [1]. Аналогами вершин графа являются блоки алгоритма, причем данные блоки имеют разное графическое представление в зависимости от их назначения. Дугам графа соответствуют линии передачи управления между блоками алгоритма.
Ниже рассмотрены наиболее распространенные метрики сложности потока управления программ.
Метрика Маккейба (цикломатическая сложность графа программы, цикломатическое число Маккейба) предназначена для оценки трудоемкости тестирования программы. Данная метрика определяется по формуле:
Z( G) = e – ʋ + 2 p,
где е — число дуг ориентированного графа G; ʋ — число вершин; р — число компонентов связности графа.
Число компонентов связности графа – это количество дуг, которые необходимо добавить для преобразования графа в сильносвязный. Сильносвязным графом называется граф, любые две вершины которого взаимно достижимы. Для корректных программ, не имеющих недостижимых от начала программы участков и «висячих» точек входа и выхода, сильносвязный граф получается путем соединения дугой вершины, обозначающей конец программы, с вершиной, обозначающей начало этой программы.
Метрика Маккейба определяет минимальное количество тестовых прогонов программы, необходимых для тестирования всех ее ветвей (разветвлений).
Рассчитаем метрику Маккейба для программы, схема алгоритма которой приведена на рис. 1. Действия, выполняемые блоками программы, в примере не показаны. Внутри каждого блока помещены их номера. Компонент связности графа обозначен штриховой дугой. Число дуг е = 8, число вершин ʋ = 7, р = 1. Цикломатическое число Маккейба равно Z( G) = 8 – 7 +2 = 3.
Рис. 1. Пример схемы алгоритма программы
Значение метрики Маккейба показывает, что в схеме алгоритма (см. рис.1) можно выделить три базисных независимых пути (называемых также линейно независимыми контурами):
1-й путь. 1 – 2 (нет) – 4 (нет) – 5 – 7.
2-й путь. 1 – 2 (да) – 3 – 2 (нет) – 4 (нет) – 5 – 7.
3-й путь. 1 – 2 (нет) – 4 (да) – 6 – 7.
Вторым возможным вариантом совокупности базисных независимых путей является:
1-й путь. 1 – 2 (да) – 3 – 2 (нет) – 4 (нет) – 5 – 7.
2-й путь. 1 – 2 (нет) – 4 (нет) – 5 – 7.
3-й путь. 1 – 2 (да) – 3 – 2 (нет) – 4 (да) – 6 – 7.
Таким образом, для тестирования совокупности базисных независимых путей исследуемой программы необходимо выполнить минимально три тестовых прогона.
Метрика Джилба определяет логическую сложность программы как насыщенность программы условными операторами IF–THEN–ELSE. Обычно используются два вида метрики Джилба: CL — количество условных операторов, характеризующее абсолютную сложность программы; cl — насыщенность программы условными операторами, характеризующая относительную сложность программы; cl определяется как отношение CL к общему количеству операторов программы (здесь под оператором подразумевается оператор конкретного языка программирования в классическом представлении, а не в интерпретации Холстеда).
Расширением метрики Джилба является максимальный уровень вложенности условного оператора CLI.
Использование в программе оператора выбора (например, CASE) с n разветвлениями эквивалентно применению n – 1 оператора IF–THEN–ELSE с глубиной вложенности n – 2.
Например, на рис. 2 приведена схема алгоритма вычисления некоторой функции Y. В данной схеме используется выбор, обозначаемый символом «Решение» с пятью разветвлениями (n = 5). Эквивалентный алгоритм вычисления той же функции Y. использующий несколько операторов IF–THEN–ELSE, представлен на рис. 3. На данном рисунке количество операторов IF–THEN–ELSE равно четырем (n – 1), максимальный уровень вложенности оператора IF–THEN–ELSE равен трем (n – 2).
Рис. 2. Схема разветвляющегося алгоритма вычисления функции Y
(используется символ «Решение» с многими выходами)
Рис. 3. Схема разветвляющегося алгоритма вычисления функции Y
(используется символ «Решение» с двумя выходами)
Таким образом, для схем алгоритмов, приведенных на рис. 2 и 3, CL = 4, cl = 0,36 (количество операторов программы равно 11), CLI = 3.
Значения метрики Маккейба для данных алгоритмов также совпадают. Для схемы алгоритма, представленной на рис. 2,
Z( G) = 13 – 10 +2 = 5.
Для схемы алгоритма, приведенной на рис. 3,
Z( G) = 16 – 13 +2 = 5.
Следует отметить, что сложность программы с помощью метрики Джилба не всегда возможно посчитать на основе схемы алгоритма, так как схема алгоритма может быть представлена укрупнено. Поэтому значения метрики Джилба в программе в общем случае следует определять на основе ее исходного текста или детализированной схемы алгоритма, каждый блок которой содержит один оператор программы.
Метрика граничных значений базируется на определении скорректированной сложности вершин графа программы [2].
Пусть G=( V, E)—ориентированный граф программы с единственной начальной и единственной конечной вершинами. В этом графе число входящих в вершину дуг называется отрицательной степенью вершины, а число исходящих из вершины дуг — положительной степенью вершины. С учетом этого набор вершин графа можно разбить на две группы: вершины, у которых положительная степень меньше или равна 1; вершины, у которых положительная степень больше или равна 2. Вершины первой группы называются принимающими вершинами, вершины второй группы – вершинами выбора (или предикатными вершинами, условными вершинами, вершинами отбора).
Для оценки сложности программы с использованием метрики граничных значений граф G разбивается на максимальное число подграфов, удовлетворяющих следующим условиям: вход в подграф осуществляется через вершину выбора; каждый подграф включает вершину (нижнюю границу подграфа), в которую можно попасть из любой другой вершины подграфа.
Число вершин, образующих подграф (исключая вершину выбора, через которую осуществляется вход в подграф), равно скорректированной сложности вершины выбора. Каждая принимающая вершина имеет скорректированную сложность, равную 1. Конечная вершина имеет скорректированную сложность, равную 0.
Абсолютная граничная сложность программы Sa определяется как сумма скорректированных сложностей всех вершин графа G.
Относительная граничная сложность программы So определяется по формуле:
где So – относительная граничная сложность программы; Sa — абсолютная граничная сложность программы; ʋ – общее число вершин графа программы.
В таблице 3 представлены свойства подграфов программы, схема алгоритма которой приведена на рис. 3. Табл. 4 содержит скорректированные сложности вершин графа данной программы. Номера вершин графа соответствуют номерам соответствующих блоков на схеме алгоритма.
Свойства подграфов программы (рис. 3)
Свойства подграфов программы
Номер вершины выбора
Скорректированные сложности вершин графа программы (рис. 3)
Номер вершины графа программы | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
Скорректированная сложность вершины графа | 1 | 1 | 9 | 1 | 7 | 1 | 5 | 1 | 3 | 1 | 1 | 1 | Sa = 32 |
Таким образом, абсолютная граничная сложность Sa программы, схема алгоритма которой приведена на рис. 3, равна 32. Относительная граничная сложность данной программы равна
So = l – (13 – 1)/32 = 0,625.
В табл. 5 представлены свойства подграфов программы, схема алгоритма которой приведена на рис. 1. Табл. 6 содержит скорректированные сложности вершин графа данной программы.
Свойства подграфов программы (рис. 1)
Свойства подграфов программы
Номер вершины выбора
Скорректированные сложности вершин графа программы (рис. 1)
Номер вершины графа программы | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
Скорректированная сложность вершины графа | 1 | 3 | 1 | 3 | 1 | 1 | Sa = 10 |
Абсолютная граничная сложность Sa программы, схема алгоритма которой приведена на рис. 1, равна 10. Относительная граничная сложность данной программы равна
So = l – (7 – 1)/10 = 0,4.
Табл. 7 содержит метрики сложности потока управления для программ, схемы алгоритмов которых приведены на рис. 1 – 3.
Дата добавления: 2019-11-16 ; просмотров: 3662 ; Мы поможем в написании вашей работы!
Источник: studopedia.net