Потеря значения переменной после выхода из цикла в C - PullRequest
0 голосов
/ 23 сентября 2019

Я работаю над заданием, которое должно считывать информацию о сотруднике из текстового файла и вычислять такие вещи, как валовая заработная плата и сумма, подлежащая уплате в виде налога.Но я не могу выполнить бит вычисления w, потому что одна из моих переменных «часы» изменяется после того, как я выхожу из цикла, который читает из файла.

Я не уверен, почему я могу печатать правильные значения внутри, но невне цикла.

Я читаю фамилию, имя, выплату и часы, полученные из файла ниже:

Whittle Ed 11.50 25.50
Davidson Carl 8.75 38.00
Doe John 17.00 46.50
Marion Louise 13.00 40.00
Prentiss Paula 15.75 50.50

Вот мой прогресс:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXEMPLOYEES 5
#define TAXRATE .15


/************************************************************

    Program Decomposition
    1.0
        1.1 InputData(in lastName, firstName as string, in hours, payrate, as real)
        1.2 CalculatePay()
            1.2.1 CalculateOvertime(in hours, out regularHours, out otHours)
            1.2.2 CalculateGross()
            1.2.3 CalculateTax()
            1.2.4 CalculateNet()
*************************************************************/


/************************************************************

    Function Prototypes
************************************************************/

void InputData(FILE * reportFile, char * lastName, char * firstName, float *hours, float *payrate);
void CalculateOvertime(float hours, float * regularHours, float * otHours);




/************************************************************
 Record of employee information
 ***********************************************************/
typedef struct empRecord{

    char fullName[20];
    char lastName[8+1];
    char firstName[8+1];
    float tax, net;
    float payrate, hours, regularHours, otHours, gross;
}empRecord;

int main(void){

    FILE * reportFile;
    empRecord emp[MAXEMPLOYEES];

    int employeeCount = 0;

    reportFile = fopen("report.txt","r");
        if (reportFile == NULL)
            {
            printf("File failed to open!...\n");
            printf("Press a key to exit...\n");
            while (getchar() != '\n');
            exit (86);
            }
/*********************************************************
    Input Loop
*********************************************************/  
    for(int i = 0; i < MAXEMPLOYEES; i++){

        InputData(reportFile, emp[i].lastName, emp[i].firstName, &emp[i].hours, &emp[i].payrate);
        // Checking for correct inputs
        printf("%s, %s, %.2f, %.2f\n",emp[i].lastName, emp[i].firstName, emp[i].hours, emp[i].payrate);

        employeeCount++;
    }

    // Checking for input 
    for(int i = 0; i < MAXEMPLOYEES; i++){
    printf("%f\n",emp[i].hours);
    }
/**********************************************************
    Processing Loop
**********************************************************/
    for(int i = 0; i < MAXEMPLOYEES; i++){


        CalculateOvertime(emp[i].hours, &emp[i].regularHours, &emp[i].otHours);

    }

    return 0;
}

/********************************************

    1.1 InputData(in lastName, firstName as string, in hours, payrate, as real)
        This function reads inputs from the file and inputs that data into the Array of Records.

**********************************************/

void InputData(FILE * reportFile, char * lastName, char * firstName, float *hours, float *payrate){

    printf(" Reading  new employee data...\n");

    fscanf(reportFile, "%s", lastName);

    fscanf(reportFile, "%s", firstName);

    fscanf(reportFile, "%f", hours);

    fscanf(reportFile, "%f", payrate);


}

void CalculateOvertime(float hours, float * regularHours, float * otHours){


printf(" Hours are : ", "%f", hours);


    if (hours > 40)
    {

        *regularHours = 40;
        *otHours = (hours - 40);
    }
    else
    {

        *regularHours = hours;
        *otHours = 0;
    }

}

Я довольно новичок в программировании и чувствую, что это простое исправление, но я не смог понять, что случилось.Любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

2 голосов
/ 23 сентября 2019

Из того, что я могу сказать, похоже, что ваша программа (и здесь, и на repl.it) делает именно то, что вы запрограммировали.Когда я читаю описание ваших данных, оно говорит: «Фамилия, Имя, Payrate и Часы » Однако, когда вы читаете данные в своей программе, вы читаете: «emp [i].lastName, emp [i] .firstName, & emp [i]. часов , & emp [i]. payrate".Вы изменили поля payrate и hours в вашем чтении.Это просто ошибка, которую легко сделать.Мой опыт - самые легкие проблемы, которые часто труднее всего обнаружить.Я определенно провожу свою часть часов, озадаченную подобными ошибками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...