Khubaib Khawar Ответов: 2

Программа зависает через некоторое время


Привет, ребята, я работал над своим университетским заданием, которое заключалось в том, чтобы написать программу, чтобы получать данные о сотрудниках, работающих в компании, от пользователя, а затем получать данные об их зарплатах от пользователя. Цель состояла в том, чтобы рассчитать чистую зарплату (вычесть сумму налога, объясните в кодировке ниже), а затем найти неудачливых людей, у которых была более высокая зарплата, но более низкая чистая зарплата. Ниже приведена кодировка, которую я написал. Теперь проблема в том, что когда я запускаю программу, она работает нормально и спрашивает сотрудников у пользователя, после того, как я даю номер, она снова работает нормально и спрашивает их зарплату, после того, как я дал зарплату, она ничего не делает и просто замирает, а черта продолжает мигать. Пожалуйста, помогите мне, в чем проблема? Это кодировка:

#include <iostream>
using namespace std;

void getInput(double [][2], int);
void calcSal(double [][2], int);
void locUnLucky (double [][2], int [], int);
void displayOutput (double [][2], int [], int);

int main()
{
	const int arraySize= 100;
	int totalEmps;
	int lucky[] = {0};
	double sal[arraySize][2];
	
	cout << "Please enter the total number of employees working in your company: ";
	cin >> totalEmps;

	getInput(sal, totalEmps);
	
	calcSal(sal, totalEmps);
	
	locUnLucky(sal, lucky, totalEmps);
	
	displayOutput(sal, lucky, totalEmps);
	
}

void getInput(double sal[][2], int totalEmps)
{
    for (int i = 0; i < totalEmps; i++)
    {
        cout << "Please enter the gross salary in dollars for employee #" << i << ": ";
        cin >> sal[i][0];
    }
}

void calcSal(double sal[][2], int totalEmps)
{
	for (int i = 0; i < totalEmps; i++)
	{
		if (sal[i][0] <= 5000)
		{
			// no tax deduction
			sal[i][1] = sal[i][0];
		}
		
		else
		{
			if(sal[i][0] <= 10000)
			{
				// 5% tax deduction
				sal[i][1] = sal[i][0] - (0.05 * sal[i][0]);
			}
			
			else
			{
				if(sal[i][0] <= 20000)
				{
					// 10% tax deduction
					sal[i][1] = sal[i][0] - (0.1 * sal[i][0]);
				}
				
				else
				{
					// 15% tax deduction
					sal[i][1] = sal[i][0] - (0.15 * sal[i][0]);
				}
			}
		}
	}
}

void locUnLucky (double sal[][2], int lucky[], int totalEmps)
{
	int i, j, grossSalary, netSalary;
	
	for (i = 0; i < totalEmps; i++)
	{
		grossSalary = sal[i][0];
		netSalary = sal[i][1];
		
		for (j = 0; i < totalEmps; j++)
		{
			if(grossSalary > sal[i][0] && netSalary < sal[i][1])
			{
				lucky[i] = 1;
			}
		}
	}
}

void displayOutput (double sal[][2], int lucky[], int totalEmps)
{
	for (int i = 0; i < totalEmps; i++)
	{
		if (lucky[i] == 1)
		{
			cout << "Enmployee #" << i+1 << " is unlucky with $" << sal[i][0] << " as gross salary whereas $" << sal[i][1] << "as net salary" << endl;
		}
	}
}


Что я уже пробовал:

Поскольку я не могу понять, в чем может быть проблема, я ничего не пробовал

RedDk

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

2 Ответов

Рейтинг:
6

CPallini

Использование отладчика, как это было предложено ppolymorphe Я смог обнаружить ошибку, вы возитесь с индексами циклов (i, j) в locUnLucky функция. Так и должно быть:

void locUnLucky (double sal[][2], int lucky[], int totalEmps)
{
	int i, j;
	double grossSalary, netSalary;
	
	for (i = 0; i < totalEmps; i++)
	{
		grossSalary = sal[i][0];
		netSalary = sal[i][1];
		
		for (j = 0; j < totalEmps; j++)
		{
			if(grossSalary < sal[j][0] && netSalary > sal[i][1])
			{
				lucky[i] = 1;
			}
		}
	}
}


Однако даже при таком исправлении у вашего кода есть логический недостаток: вы должны сравнить зарплату каждого сотрудника со средней зарплатой, чтобы получить значимую информацию.


Khubaib Khawar

Под средним значением вы подразумеваете среднюю заработную плату общего числа сотрудников, введенных пользователем?

Рейтинг:
19

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


CPallini

Действительно. 5.

Patrice T

Спасибо

Khubaib Khawar

Эй, спасибо за руководство. Я использую DevC++ в качестве IDE. Можете ли вы предложить, что было бы хорошим отладчиком для меня? Или у DevC++ уже есть встроенный отладчик?

Patrice T

Я не знаю DevC++, но похоже, что там встроен отладчик.
Просто " Google DevC++ debugger"

Khubaib Khawar

Спасибо :)