Объявление переменных вне структур цикла / IF в C - PullRequest
0 голосов
/ 10 ноября 2018

Я новичок в языке C, скорее программирование в целом. Мне было интересно, почему, когда я объявляю переменную, которая будет использоваться в операторе if ВНЕ структуры, что полученный вывод неверен (в любом случае для этого фрагмента кода).

Вот мой код:

#include<stdio.h>
void grossPay();

int main()
{
    grossPay();
}

void grossPay()
{
int rate = 10, hours;
double tax, grosspay, netpay;

printf("Enter work hours this week: ");
scanf("%d", &hours);

grosspay = hours * rate;

if (grosspay <= 300 && grosspay > 0)
{
    tax = 0.10;
    netpay = grosspay - grosspay * tax;
    printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
    printf("Gross pay: $%.2f\n", grosspay);
    printf("Net pay: $%.2f\n", netpay);
}
else if (grosspay > 300 && grosspay <=1000)
{
    tax = 0.15;
    netpay = grosspay - grosspay * tax;
    printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
    printf("Gross pay: $%.2f\n", grosspay);
    printf("Net pay: $%.2f\n", netpay);
}
else if (grosspay > 1000)
{
    tax = 0.25;
    netpay = grosspay - grosspay * tax;
    printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
    printf("Gross pay: $%.2f\n", grosspay);
    printf("Net pay: $%.2f\n", netpay);
}
else 
{
    printf("Invalid input. Please try again.\n\n");
}
}

Редактировать: код, который я поместил, был моим «исправлением» для получения неправильного вывода. Я ожидал, что когда я объявлю переменную netpay за пределами всего оператора IF, что получу правильный вывод, тот же вывод из приведенного выше кода.

Редактировать 2: Предыдущая версия

#include<stdio.h>
void grossPay();

int main()
{
    grossPay();
}

void grossPay()
{
    int rate = 10, hours;
    double tax, grosspay, netpay;

    printf("Enter work hours this week: ");
    scanf("%d", &hours);

    grosspay = hours * rate;
    netpay = grosspay - grosspay * tax;

    if (grosspay <= 300 && grosspay > 0)
    {
        tax = 0.10;

        printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
        printf("Gross pay: $%.2f\n", grosspay);
        printf("Net pay: $%.2f\n", netpay);
    }
    else if (grosspay > 300 && grosspay <=1000)
    {
        tax = 0.15;
        printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
        printf("Gross pay: $%.2f\n", grosspay);
        printf("Net pay: $%.2f\n", netpay);
    }
    else if (grosspay > 1000)
    {
        tax = 0.25;
        printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
        printf("Gross pay: $%.2f\n", grosspay);
        printf("Net pay: $%.2f\n", netpay);
    }
    else 
    {
        printf("Invalid input. Please try again.\n\n");
    }
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Соответствующий код сводится к:

double tax;
netpay = grosspay - grosspay * tax;
tax = 0.10;
printf("Net pay: $%.2f\n", netpay);

Проблема в том, что операторы в программе выполняются в том порядке, в котором вы их написали (по крайней мере, внутри функции, за исключением специальных операторов потока управления, таких как continue или goto).

Таким образом:

  1. Сначала мы определим локальную переменную с именем tax, которая неинициализирована.
  2. Затем мы устанавливаем netpay на результат grosspay - grosspay * tax. Это уже неправильно, потому что tax не имеет определенного значения в этой точке, поэтому grosspay - grosspay * tax дает неопределенные результаты.
  3. Тогда мы установим tax. Это не влияет на значение netpay.
  4. Затем мы печатаем netpay.

Вещи происходят в неправильном порядке. Вам необходимо установить переменные перед их использованием.

Как будто вы говорите кому-то:

  1. Прочитайте книгу, которая у вас в руке.
  2. Взять Властелин колец .
  3. Откройте.

И вам интересно, почему они не читают «Властелин колец».

0 голосов
/ 10 ноября 2018

Возможно, вы пытаетесь удалить дублирующийся код. Поскольку разница между блоками if заключается в ставке налога, вы можете установить ее и в конце сделать один расчет.

#include<stdio.h>
void grossPay();

int main()
{
    grossPay();
}

void grossPay()
{
    int rate = 10, hours;
    double tax, grosspay, netpay;

    printf("Enter work hours this week: ");
    scanf("%d", &hours);

    grosspay = hours * rate;

    if (grosspay <= 300 && grosspay > 0)
    {
        tax = 0.10;
    }
    else if (grosspay > 300 && grosspay <=1000)
    {
        tax = 0.15;
    }
    else if (grosspay > 1000)
    {
        tax = 0.25;
    }
    else
    {
        printf("Invalid input. Please try again.\n\n");
        return;
    }
    netpay = grosspay - grosspay * tax;
    printf("Pay for %d hours of week with $%d per hour\n", hours, rate);
    printf("Gross pay: $%.2f\n", grosspay);
    printf("Net pay: $%.2f\n", netpay);
}
...