D
D
Danya Kozlovskiy2020-11-20 01:59:15
C++ / C#
Danya Kozlovskiy, 2020-11-20 01:59:15

The program breaks. How to fix?

Hello, there is a problem. If, when entering a full name (in the constructor), enter them through a space, that is, Last Name First Name Middle Name, then the program, without asking anything else (other fields of the class) and without saying, jumps into a loop and loops there, again without asking for a menu item (goes against rules). How to pacify her?
PS: the code is written by a young mind and the dumbest mistakes are possible. When observing such, it is desirable to say what is wrong and show it as it should.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <time.h>
#include <Windows.h>
using namespace std;

class Payment {
public:
  string FIO;
  double oklad;
  double nalog;
  double nadbavka;
  double nalogPensionniy;
  int god;
  int otrabotal;
  int rabochieDni;
  double nachislennayaSumma;
  double yderjanayaSumma;

  Payment() {
    cout << "Введите данные плательщика: " << endl;
    cout << "ФИО: " << endl; cin >> FIO;
    cout << "Оклад ( за отработанный день ): "; cin >> oklad;
    cout << "Год поступления на работу: "; cin >> god;
    cout << "% надбавки: "; cin >> nadbavka;
    cout << "Кол-во отработаных дней в месяце: "; cin >> otrabotal;
    cout << "Кол-во рабочих дней в месяце: "; cin >> rabochieDni;
    nalog = 0.13;
    nalogPensionniy = 0.01;
    nachislennayaSumma = NachislennayaSumma();
    yderjanayaSumma = YderjannayaSumma();
  }

  double NachislennayaSumma();
  void Show();
  double YderjannayaSumma();
  void SummaNaRyki();
  void Staj();
};

//Стаж вычисляется : Полное кол - во лет прошедших от года поступления на работу до текущего года.
//Начисления: Сумма, начисленная за отработанные дни и надбавки т.е.доли от первой суммы.
//Удержания: Отчисления в пенсионный фонд(1 % от начисленной суммы) и подоходный налог(13 % от начисленной суммы без отчислений в пенсионный фонд..

double Payment::NachislennayaSumma() {
  double nachislennaya, nachislennayaNadbavka;
  nachislennaya = oklad * otrabotal;
  nachislennayaNadbavka = nachislennaya * (nadbavka/100);
  return nachislennaya + nachislennayaNadbavka;
}

void Payment::Show() {
  cout << "Данные плательщика: " << endl;
  cout << "ФИО: " << FIO << endl;
  cout << "Оклад ( за один отработанный день ): " << oklad << endl;
  cout << "Год поступления на работу: " << god << endl;
  cout << "% надбавки: " << nadbavka << endl;
  cout << "Кол-во отработаных дней в месяце: " << otrabotal << endl;
  cout << "Кол-во рабочих дней в месяце: " << rabochieDni << endl;
  cout << "Начисленная сумма: " << nachislennayaSumma << endl;
  cout << "Удержанная сумма: " << yderjanayaSumma << endl;
}

double Payment::YderjannayaSumma() {
  double summaPensyaNalog, summaNalog;
  summaPensyaNalog = nachislennayaSumma * nalogPensionniy;
  summaNalog = (nachislennayaSumma - summaPensyaNalog) * nalog;
  return summaNalog + summaPensyaNalog;
}

void Payment::SummaNaRyki() {
  cout << "Зарплата полученная плательщиком после налогов: " << nachislennayaSumma - yderjanayaSumma << endl;
}

void Payment::Staj() {
  time_t currentTime;
  struct tm* ct;
  time(&currentTime);
  ct = localtime(&currentTime);
  cout << "Стаж работы: " << (ct->tm_year + 1900) - god << endl;
}

int main() {
  setlocale(LC_ALL, "Russian");
  SetConsoleOutputCP(1251);
  SetConsoleCP(1251);
  Payment payment;
  int menu = 10;
  while (menu != 0) {
    cout << "Меня плательщика: \n 1.Показать данные плательщика. \n 2.Показать стаж плательщика. \n 3.Показать сумму полученную плательщиком на руки. \n 0 - Выход" << endl;
    cout << "> "; cin >> menu;
    if (menu == 1) payment.Show();
    if (menu == 2) payment.Staj();
    if (menu == 3) payment.SummaNaRyki();
  }
    
  return 0;
}

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question