Неправильные значения сложения

#c #addition

Вопрос:

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

 #include<iostream.h>
#include<conio.h>
class Employee
{
    char name[30];
    int id;
    public:
    void Getdata()
    {
        cout<<"Enter Name: ";
        cin>>name;
        cout<<"Enter ID: ";
        cin>>id;
    }
    Employee()
    {
    }
    void Putdata()
    {
        cout<<name<<endl;
        cout<<id<<endl;
    }
};
class Salary : public Employee
{
    int sal;
        int basic, hra, da, cla;
    public:
    void set()
    {
        cout<<"Enter Basic Pay: ";
        cin>>basic;
        cout<<"Enter HRA: ";
        cin>>hra;
        cout<<"Enter Da: ";
        cin>>da;
        cout<<"Enter CLA: ";
        cin>>cla;
    }
    Salary() : Employee()
    {
        sal = (basic hra da cla) ;
    }
    void show()
    {
        cout<<"Salary: "<<sal;
    }
};
void main()
{
    clrscr();
    Salary s;
    s.Getdata();
    s.set();
    s.Putdata();
    s.show();
    getch();
}
 

Я ожидал, что зарплата составит 13000, но вместо этого получил Зарплату: 11172 в результате.

Комментарии:

1. Похоже, вам, возможно, потребуется научиться использовать отладчик для пошагового выполнения кода. С хорошим отладчиком вы можете выполнять свою программу построчно и видеть, где она отклоняется от того, что вы ожидаете. Это необходимый инструмент, если вы собираетесь заниматься каким-либо программированием. Дальнейшее чтение: Как отлаживать небольшие программы и руководство по отладке

2. Не связано с вашей проблемой, но зарплата, получаемая от сотрудника, кажется действительно странной иерархией классов. Я имею в виду, в каком смысле зарплата такая же, как у работника?

3. Кроме того, вы случайно не используете TurboC ? void main и заголовки, которые вы используете, будут/не должны компилироваться в стандартном компиляторе жалоб.

4. sal = (basic hra da cla) ; вычисляет немедленное значение и устанавливает sal это значение. Это не создает отношения, изменение любого из операндов, используемых постфактум, не приведет к ретроактивному обновлению sal до нового значения. Вам придется выполнить расчет после того, как вы воспользуетесь данными пользователя.

5. В конструкторе по умолчанию Salray вы написали: sal = (basic hra da cla) ; но эти переменные-члены еще не инициализированы!

Ответ №1:

Вы вычисляете значение sal из неинициализированных элементов в конструкторе по умолчанию: sal = (basic hra da cla); . Таким образом, ваша программа выполняет неопределенное поведение.

Это происходит потому, что конструктор запускается раньше любого другого элемента. Чтобы решить эту проблему, вы должны сначала получить значения, а затем рассчитать следующие:

 Salary() : Employee(){
//  cout << basic << ", " << hra << ", " << da << ", " <<  cla << endl; // this line proves that hra, basic... are not initialized.
    set(); // assign values before calculate.
    sal = (basic   hra   da   cla);
}
 
  • Что я рекомендую, так это удалить эту строку из конструктора по умолчанию: sal = (basic hra da cla); и вставить ее set . так set() будет выглядеть:
     void set(){
        cout << "Enter Basic Pay: ";
        cin >> basic;
        cout << "Enter HRA: ";
        cin >> hra;
        cout << "Enter Da: ";
        cin >> da;
        cout << "Enter CLA: ";
        cin >> cla;
        sal = (basic   hra   da   cla); // after getting values it is a good place here to process the sal.
    }
     
  • Еще одна вещь, которую следует учитывать, — это то, что main должно возвращать целое число, а не пустоту. Возвращаться void — неправильно.
  • Также не используйте символьные строки, но используйте std::string их достойно использования:
     class Employee{
        std::string name;
        int id;
        // ...
    };
     
  • Также создание Salary производных от Employee не имеет значения:
    Спросите себя: «Является ли салрей сотрудником?» Поэтому важно наладить Has-a отношения, а Is-a не потому, что у сотрудника есть зарплата, но он не является наемным работником.

     class Salary {
        public:
            Salary() :
                sal{}, basic{}, hra{}, da{}, cla{} {
            }
            void set() {
                std::cout << "Enter Basic Pay: ";
                std::cin >> basic;
                std::cout << "Enter HRA: ";
                std::cin >> hra;
                std::cout << "Enter Da: ";
                std::cin >> da;
                std::cout << "Enter CLA: ";
                std::cin >> cla;
                sal = basic   hra   da   cla;
            }
            void show() {
                std::cout << "Salary: " << sal << std::endl;
            }
        private:
            int sal, basic, hra, da, cla;
    };
    
    class Employee {
        public:
            Employee() :
                name{}, id{}, sal{} {
            }
            void Getdata() {
                std::cout << "Enter Name: ";
                std::getline(std::cin, name);
                std::cout << "Enter ID: ";
                std::cin >> id;
                sal.set();
            }
            void Putdata() {
                std::cout << name << std::endl;
                std::cout << id << std::endl;
                sal.show();
            }
        private:
            std::string name;
            int id;
            Salary sal;
    };
    
    int main(){
        Employee emp{};
        emp.Getdata();
        emp.Putdata();
    
    }
     
  • ПРИМЕЧАНИЕ: Код, который я написал, не компилируется на «Turbo C «. Пожалуйста, откажитесь от этого старого и ошибочного компилятора и используйте его, если появятся новые сложные.