Programming Basics - Пробен изпит
Здравейте, кодът на последната задача от изпита (Multiply Table) по някаква причина (непонятна за мен :D ) реагира като безкарен цикъл. Може ли малко помощ? :)
string num = Console.ReadLine();
char a = num[0];
char b = num[1];
char c = num[2];
if (a > 0 && b > 0 && c > 0)
{
for (int i = 0; i < c; i++)
{
c++;
for (int j = 0; j < b; j++)
{
b++;
for (int g = 0; g < a; g++)
{
a++;
Console.WriteLine($"{a} * {b} * {c} = {a * b * c}");
}
}
}
}
Тъй като колегата aavramov оспори моето твърдение се почуствах длъжен да докажа думите си в предния коментар. Започнах да дебъгвам дадения код и ето какво открих. Трите вложени цикъла не са безкрайни защото типът char се превърта на 65535. Когато добавиш 1 към максималната стойност, стоиността на променливата от тип char става равна на 0.
Да разгледаме какво става в най-вътрешния цикъл когато променливата от тип char се превърти g е близо до максималната стойност и при условието g<a се излиза от цикъла като стойноста на а остава 0. Връщаме се в горния цикъл условието му е изпълнено и той завърта втора съпка, стига се до последния трети цикъл, той обаче инициализира променливата g=0 и се проверява условието g<a но то не е изпълнено и тялото му се прескача. Втория цикъл породължава докато превърти неговата char променлива без изобщо да се изпънява третия цикъл. По аналогичен начин завършва изпълнението си и първия цикъл без да се изпълняват другите вложени цикли. Така, че наистина не бях прав в първия коментар, че се завъртат 50*50*50 пъти = 125000, а само окло 65500 от които виждаме отпечатване на резултат и други 65500*2 от които няма резултат. Но и колегата не е прав с твърдението, че цикълите са безкрайни. Щяха да бъдат ако променливите a,b и c не бяха от тип char а от int.