У меня есть вопрос относительно этой метрики.
Например, если у меня есть следующий код, сколько путей имеет функция main
?
void main()
{
int i = 0, j = 0, k = 0;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
for (k=0; k<10; k++)
{
if (i < 2 )
printf("value is more than 2\n");
if (i > 5)
printf("value is less than 5\n");
}
}
}
}
Первые три цикла for должны иметь 3 пути и один дополнительный, который обходит все операторы потока управления, тогда как насчет вложенного оператора if? Это 1x1 = 1 путь?
Всем, у кого нет учетной записи Matlab, на сайте есть следующее описание:
A control flow statement introduces branches and adds to the original one path.
if-else if-else: Each if keyword introduces a new branch. The contribution from an if-else if-else block is the number of branches plus one (the original path). If a catch-all else is present, all paths go through the block; otherwise, one path bypasses the block.
For instance, a function with an if (..) {} else if (..) {} else {} statement has three paths. A function with one if () {} only has two paths, one that goes through the if block and one that bypasses the block.
for and while: Each loop statement introduces a new branch. The contribution from a loop is two - a path that goes through the loop and a path that bypasses the loop.
If more than one control flow statement are present in a sequence without any nesting, the number of paths is the product of the contributions from each control flow statement.
For instance, if a function has three for loops and two if-else blocks, one after another, the number of paths is 2 × 2 × 2 × 2 × 2 = 32.
void func()
{
int i = 0, j = 0, k = 0;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
for (k=0; k<10; k++)
{
if (i < 2 )
;
else
{
if (i > 5)
;
else
;
}
}
}
}
}
In this example, func has six paths: three from the for statements, two from the if statements plus the original path that bypasses all control flow statements.
@Mairon о да, нам нужна учетная запись, чтобы увидеть сайт. Загружать фото с сайта или что делать?
@naomikim Скопируйте и вставьте вопрос сюда как текст. Изображения не рекомендуются.
3 пути... а) вывести "значение больше 2" или б) вывести "значение меньше 5" или в) ничего не делать. Кстати: обратите внимание, как напечатанный тест противоречит условию в операторе if... хм...
пожалуйста, смотрите описание, которое я только что отредактировал. Спасибо
Если я что-то не так понял, это не вложенный if, а всего 2 отдельных?
Согласно описанию:
Если в последовательности присутствует более одного оператора потока управления без какой-либо вложенности, количество путей является произведением вкладов каждого оператора потока управления.
и
Вклад блока if-else — это количество ветвей плюс один (исходный путь).
ваши два оператора if вносят по 2 пути каждый, так что 2 x 2 = 4 пути, а затем каждый из ваших циклов добавляет один дополнительный путь, поэтому всего будет 7 путей.
Однако это описание не имеет для меня особого смысла, так как этот код имеет только один возможный путь:
if (true) {
// this part is always executed
}
Это может показаться очевидным, но более сложные ситуации могут легко уменьшить количество возможных путей, как в вашем примере, где есть только три возможности: либо i < 2
, либо i > 5
, либо i >= 2 && i <= 5
.
Я полагаю, что описание метрики имело бы смысл как верхняя граница количества путей.
«... является результатом вклада каждого оператора потока управления» и «ваши два оператора if вносят по 2 пути каждый, так что 2 x 2 = 4 пути» хм... Я не думаю, что это правильно здесь. Два оператора if не являются независимыми, поэтому не может быть 4 путей. В этом случае никогда не может быть ситуации, когда оба if-условия истинны.
@SupportUkraine Я не вижу в описании упоминания о независимости. Я следую за этим к письму. Однако я объясняю, как это не совсем правильно сразу после этого предложения.
ваша метрическая ссылка ведет на страницу входа в Matlab.