Почему программа не видит else? - C (СИ)
Формулировка задачи:
Программа не исполняет else как нужно было бы мне. Хотел бы узнать, где я допустил ошибку и причину почему "не работает", чтобы в дальнейшем не допустить подобную проблему. Проблемный фрагмент выделен и прикреплен в вложения (миниатюры). Чую, что сделал легкую проблему, но не могу заметить где она.
Заранее благодарю за любую помощь или совет.
/* Пiдключення бiблiотек */
#include <cstdlib> // кольори для системи, викликає функцiю як system
#include <windows.h> // кольори, робота з консолью
#include <stdio.h> // вивiд/ввiд
#include <conio.h> // _getch
#include <locale.h> // для кодування
#include <math.h> // математичнi операцiї
#include <process.h> // функцiї управлiння сопроцесiв
#define E 2.71828182846 // замiна e (натуральне число)
int main(int argc, char* argv[])
{
setlocale (LC_ALL,""); // пiдключення кодування
system("color F0"); // вивiд буде чорного кольору; робимо фон бiлим
HANDLE hndl=GetStdHandle(STD_OUTPUT_HANDLE); // викликає пiдтримку редугавача вивiда (колiр)
int p; // вибiр задачi
p = atoi(argv[1]); // atoi - integer
if ( argc == 1 ) // перевiрка наявностi параметрiв
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf (" Помилка! Причина:\n У командному рядку вiдсутнi параметри!\n");
} else
{
// ПЕРША ЗАДАЧА:
if (p != 1 && p!=2 && p!=3) // перевiрка правильність параметрiв
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf (" Помилка! Причина:\n Такi параметри вiдсутнi. Iснують такi: 1, 2, 3.\n");
} else
{
if (p == 1)
{
if (argc == 4)
{
// Умова:
printf ("%s", " Умова першої задачi:\n"
"\t Г\t A*ln(X),\tякщо 7 > X ; \n" // перший випадок
" Y =\t {\t lg(A*X),\tякщо 7 <= X <= 15 ; \n " // другий випадок
"\t L\t e^(A*X), \tякщо 15 < X ;\n\n"); // третiй випадок
// Задаємо аргумент Х та константу А за допомогою параметрiв:
double y, x, a;
x = atof(argv[3]); // atof - double
a = atof(argv[2]);
// Другий випадок:
if ((x>=7) && (x<=15))
{
if (x*a<=0) // недопустиме значення (пояснена причина) у другому випадку
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf ("%s\n %g %s %g %s",
"\n Помилка! Причина:\n"
" [lg(X*A)], X * A <= 0;",
x, " * ", a, " <= 0");
} else // вирiшення функцiї у другому випадку та вивiд результату
{
y = log10(x*a);
printf ("%s %g\n %s %g\n %s %g\n",
"\n Y = lg(A*X); \n\n "
" Значення Y = ", y,
" Значення A = ", a,
" Значення X = ", x);
}
} else
{
// Третiй випадок:
if (x>15) // вирiшення функцiї у третьому випадку та вивiд результату
{
y = pow(E, a*x);
printf ("%s %f%s %g\n %s %g\n %s %g\n",
"\n Y = e^(A*X); [e = ",E,"]\n\n "
" Значення Y = ", y,
" Значення A = ", a,
" Значення X = ", x);
} else
{
// Перший випадок:
if (x<=0) // недопустиме значення (пояснена причина) у першому випадку
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf ("%s\n %g %s",
"\n Помилка! Причина:\n"
" [ln(X)], X <= 0;",
x, " <= 0");
} else // вирiшення функцiї у першому випадку та вивiд результату
{
y = a * log(x);
printf ("%s %g\n %s %g\n %s %g\n",
"\n Y = A * ln(X)\n\n "
" Значення Y = ", y,
" Значення A = ", a,
" Значення X = ", x);
}
}
}
} else // помилка, параметрiв недостатньо/перебiльшення
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf (" Помилка! Причина:\n У командному рядку недостатньо/перебiльшення параметрiв. Необхiдно: 1, X, A\n");
}
}
// ДРУГА ЗАДАЧА
if (p == 2)
{
if (argc == 7)
{
// Умова:
printf("%s", " Умова другої задачi:\n"
" Y = (A + B)^2 * [(A + X)/(B + x)]^(1/2) * ln(A + X)\n\n");
// Задаємо: аргументи початку XP та кiнцю XK; крок аргументу DX; константи А та B за допомогою параметрiв:
double y, xp, xk, dx, b, x, a;
a = atof(argv[2]);
b = atof(argv[3]);
xp = atof(argv[4]);
xk = atof(argv[5]);
dx = atof(argv[6]);
// Будуємо таблицю + винятки, які повязані з кроком:
if ( dx == 0 || xk < xp )
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf (" Помилка! Причина:\n DX = 0, або XK<XP");
} else
{
x = xp;
printf("%s",
"-------------------------\n" // "шапка" таблиці
"| X | Y |\n"
"-------------------------\n" );
while (x < xk) // умова існування циклу
{
if ( (b + x > 0) && (a + x > 0 ))
{
y = pow(a+b, 2) * sqrt((a+x)/(b+x)) * log(a+x); // коли існує функція
printf(
"| %8.4lf | %8.4lf |\n", x, y);
} else
{
printf("| %8.4lf | не iснує |\n", x); // коли функції не існує
}
x = x + dx; // наступний крок
};
printf("%s %g %s %g %s %g %s %g %s %g",
"-------------------------\n\n" // кінець таблиці (циклу)
"A = ",a,", B = ",b,", XP = ",xp,", XK = ",xk,", DX = ",dx); // використанні аргументи, константи та крок
}
} else // помилка, параметрiв недостатньо/перебiльшення
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf (" Помилка! Причина:\n"
" У командному рядку недостатньо/перебiльшення параметрiв. Необхiдно:\n"
" 2, A, B, XP, XK, DX. \n");
}
}
// ТРЕТЯ ЗАДАЧА
if (p == 3)
{
if (argc == 3)
{
// Умова:
printf("%s", " Умова третьої задачi:\n"
"\t\t 6\n"
" Y = [sin(x+i)/x] * П [(x^2 - x^(2/3))*n/(n-0,5)]\n"
"\t\t n=2 \n\n");
// Задаємо: аргумент X, константи I та N за допомогою параметрiв:
double y, w, i, x, m; // w, m - "множники"
int n;
i = atof(argv[2]);
x = -1;
// Будуємо таблицю + винятки, які повязані з кроком:
printf("%s",
"---------------------\n" // "шапка" таблиці
"| X | Y |\n"
"---------------------\n" );
while (x < 1) // умова існування циклу
{
n = 2;
w = 1;
while ( n < 6 )
{
m = ((pow(x,2)-pow(x,2/3))*n)/(n-0.5);
n++;
w = w * m;
};
if ( x != 0 ) // коли існує функція
{
y = (sin(x+i)/x) * w;
printf("| %5.1f | %8.4lf |\n", x, y);
} else { printf("| %5.1f | не iснує |\n", x); } // коли не існує функція
x = x + 0.2 - 0.1; // наступний крок
};
printf("%s %g","---------------------\n\n" // кінець таблиці (циклу)
"I = ",i); // використанні аргументи, тощо
} else // помилка, параметрiв недостатньо/перебiльшення
{ // вивiд буде iнтесивно-червоного кольору + бiлий фон
SetConsoleTextAttribute(hndl,FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY);
printf (" Помилка! Причина:\n"
" У командному рядку недостатньо/перебiльшення параметрiв. Необхiдно:\n"
" 3, I. \n");
}
}
}
}
/* printf("\n\n Натиснiть на будь-яку кнопку на клавiатурi для виходу з програми"); */
_getch(); // затримка програми (вихiд)
return 0;
}Решение задачи: «Почему программа не видит else?»
textual
Листинг программы
if(fabs(x)<0.000000001) // здесь равно 0 else // здесь не равно 0
Объяснение кода листинга программы
В данном коде выполняется проверка значения переменной x на равенство нулю. Если это условие выполняется, то программа выполняет действия, указанные после else. Вот список элементов кода с их номерами:
- В начале кода есть условие
if(fabs(x)<0.000000001). Здесь используется функцияfabs(), которая возвращает абсолютное значение числа, и сравнивается с очень маленьким числом (0.000000001). Если значениеxменьше этого числа, то выполняется следующий блок кода. - Если условие в
ifне выполняется, то программа переходит к блоку кода послеelse. Таким образом, в данном коде послеelseнаходятся действия, которые выполняются, если значение переменнойxне равно нулю.