June 12, 2012

Redundant code

const int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int month, day, year;
int day_of_year;

bool leapYear(int testYear)
{
	if (testYear % 400 == 0
		|| (testYear % 100 != 0 && testYear %4 == 0)) {
		return true;
	} else {
		return false;
	}
}

int dayOfYear()
{
	int numberOfDays;
	if (month == 1) {
		day_of_year = day;
	}

	else if (month > 2 && leapYear(year)) {
		numberOfDays = day + 1;
		for (int i = 1; i < month; i++) {
			numberOfDays += days[i];
		}
		day_of_year = number_of_days;
	}

	else {
		numberOfDays = day;
		for (int i = 1; i < month; i++) {
			numberOfDays += days[i];
		}
		day_of_year = number_of_days;
	}

	return day_of_year;
}
const int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int month, day, year;
int day_of_year;

bool leapYear(int testYear)
{
	return testYear % 400 == 0
		|| testYear % 100 != 0 && testYear %4 == 0;
}

int dayOfYear()
{
	int n = day + (month > 2 && leapYear(year) ? 1 : 0);

	for (int i = 1; i < month; ++i) {
		n += days[i];
	}

	return n;
}

The function will run faster without a loop.

const int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

//How many days are in the year ahead of the given month?

const int pre[] = {
	0,
	0,		//January
	pre[ 0] + 31,	//February
	pre[ 1] + 28,	//March
	pre[ 2] + 31,	//April
	pre[ 3] + 30,	//May
	pre[ 4] + 31,	//June
	pre[ 5] + 30,	//July
	pre[ 6] + 31,	//August
	pre[ 7] + 31,	//September
	pre[ 8] + 30,	//October
	pre[ 9] + 31,	//November
	pre[10] + 30	//December
};

int month, day, year;
int day_of_year;

bool leapYear(int testYear)
{
	return testYear % 400 == 0
		|| testYear % 100 != 0 && testYear %4 == 0;
}

int dayOfYear()
{
	const int n = day + (month > 2 && leapYear(year) ? 1 : 0);
	return n + pre[month];
}

Unnecessary subtraction during each iteration

There’s no reason to keep the variable number alive before and after the for loop.

	const int NO_OF_EMP = 3;
	int vacation[NO_OF_EMP], number;

	for (number = 1; number <= NO_OF_EMP; ++number)
	cin     >> vacation[number - 1];
	const size_t NO_OF_EMP = 3;
	int vacation[NO_OF_EMP];

	for (size_t number = 0; number < NO_OF_EMP; ++number) {
		cin >> vacation[number];
	}

Unnecessary array

	int numArr[5];
	float total = 0;

	cout << "Enter 5 numbers and receive their average."
		<< "Enter each value one at a time: " << "\n";

	for(int i = 0; i <= 4; i++){
		cout << "Enter number " << i << ": ";
		cin >> numArr[i];
		cout << "\n";
	}

	for (int i = 0; i <= 4; i++)
		total += numArr[i];

	cout << "The average was: " << total / 5.0 << "\n";

Write the number 5 only once. Don’t output whitespace immediately before a newline. Do as much of the arithmetic as possible with ints.

	const size_t n = 5;

	cout << "Enter " << n
		<< " numbers and receive their average.  "
		<< "Enter each value one at a time:\n";

	int numArr[n];
	int total = 0;

	for (size_t i = 0; i < n; ++i) {
		cout << "Enter number " << i << ": ";
		cin >> numArr[i];
		cout << "\n";
		total += numArr[i];
	}

	cout << "The average was: " <<
		static_cast<double>(total) / n << "\n";
	const size_t n = 5;

	cout << "Enter " << n
		<< " numbers and receive their average.  "
		<< "Enter each value one at a time:\n";

	int total = 0;

	for (size_t i = 0; i < n; ++i) {
		cout << "Enter number " << i << ": ";
		int x;
		cin >> x;
		cout << "\n";
		total += x;
	}

	cout << "The average was: " <<
		static_cast<double>(total) / n << "\n";

Fails to detect overflow or underflow

The variables year and distance_year are ints. The data type of the expressions year + distance_year - 1 and year + distance_year + 1 is also int. The values of the expressions are therefore ≥ INT_MIN and ≤ INT_MAX. The if is always true.

	if (year+distance - 1 < INT_MAX && year+distance_year + 1 > INT_MIN) {

The variables year and years are ints. The data type of the expression year + years is also int. The value of the expression is therefore ≤ INT_MAX. The if is always false.

	if (static_cast<long>(year + years) >= INT_MAX) {

How can we tell if it’s safe to add an integer n to years?

	if (n > 0) {
		if (years <= INT_MAX - n) {
			years += n;
		} else {
			cerr << "Adding " << n << " to " << years
				<< "would result in a sum greater than "
				<< INT_MAX << ".\n";
		}
	}

	else if (n < 0) {
		if (years >= INT_MIN - n) {
			years += n;
		} else {
			cerr << "Adding " << n << " to " << years
				<< "would result in a sum less than "
				<< INT_MIN << ".\n";
		}
	}