Почему программа не видит 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
не равно нулю.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д