Задать вопрос
morto
@morto
вечный ученик

Ломается программа. Как починить?

Здравствуйте, возникла проблема. Если при вводе ФИО ( в конструкторе ) ввести их через пробел, то есть Фамилия Имя Отчество, то программа больше ничего не спрашивая ( другие поля класса ) и не говоря, прыгает в цикл и там зацикливается, опять же не спрашивая пункт меню ( идет против правил ). Как её усмирить?
P.S.: код написан юным умом и возможны наитупейшие ошибки. При наблюдении таковых желательно сказать, что не так и показать как надо.

#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;
}
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы