Почему программа не видит 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. Вот список элементов кода с их номерами:

  1. В начале кода есть условие if(fabs(x)<0.000000001). Здесь используется функция fabs(), которая возвращает абсолютное значение числа, и сравнивается с очень маленьким числом (0.000000001). Если значение x меньше этого числа, то выполняется следующий блок кода.
  2. Если условие в if не выполняется, то программа переходит к блоку кода после else. Таким образом, в данном коде после else находятся действия, которые выполняются, если значение переменной x не равно нулю.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы