MR Hones
MR Hones

Reputation: 61

Why is if statement returning false when it should be true?

For example When I input a 8 3 2020 that should make the if statement true as 8 3 2020 are values that can be found in the array but instead it returns false

Here is main

/*
 * Homework 4  --  UPDATE as needed
*/ 

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

#include "Appointment.h"
using namespace std;

                             
void callPrint (Time &TimeOrApptObject) { TimeOrApptObject.print();} 
int main(){
    int month, day, year, hour, minute,howLong;
    Appointment  myAppointments[19];

    ifstream HW4DataFileHandle;

    HW4DataFileHandle.open("Lab6Data.txt");
    while (!HW4DataFileHandle.eof( )) {
        for (int i = 1; i < 20;  i++) {
            HW4DataFileHandle>>month;
            HW4DataFileHandle>>day;
            HW4DataFileHandle>>year;
            HW4DataFileHandle>>hour;
            HW4DataFileHandle>>minute;
            HW4DataFileHandle>>howLong;
            myAppointments[i] = Appointment( month, day, year, hour, minute, howLong);
        }
        cout <<"enter a month" <<endl;
        cin >> month;
        cout <<"enter a day" <<endl;
        cin >> day;
        cout <<"enter a year"<<endl;
        cin >> year;
        Date myDate( month, day, year);

        cout <<"Appointments for" << month <<"/" << day <<"/" << year <<":"<< endl;

        for (int i = 0; i <13; i++){
            if ( friendTorCompare2Dates(myAppointments[i], myDate))
            { Time thisTime = myAppointments[i];
                thisTime.print();
                cout << endl;
            } 
        }
    }
}

Date.h

// Date.h -- Class Date    UPDATE  as needed
#ifndef DATE_H
#define DATE_H
class Date  {  
private:
    int month;
    int day;
    int year;
public:
Date(int m, int d, int y) : month(m), day(d), year(y)
    {
    }
    Date() = default;
    friend  bool friendTorCompare2Dates (const Date&,const Date& );

};
bool friendTorCompare2Dates (const Date& Right, const Date& Left)
{
    if (Right.month == Left.month && Right.day == Left.day && Right.year== Left.year)
        return true;
    else
        return false;
}

#endif

Time.h

//Time.h -- Class Time UPDATE  as needed
#ifndef TIME_H
#define TIME_H
using namespace std;
#include<iostream>

class Time {
private :
    int hour; int minute;
public:
Time(int h, int m) : hour(h)
    {
    }
    Time() = default;
    virtual void print() {
        cout << hour << " " << minute <<" "  ;
    }


};
#endif

Appointment.h

// Appointment.h -- Class Appointment   UPDATE as needed
//
#include "Time.h"
#include "Date.h"
#ifndef APPOINTMENT_H
#define APPOINTMENT_H
using namespace std;
class Appointment:  public Date, public Time {  
private:
    int howLong;
public:
Appointment(int month, int day, int year, int hour, int minute, int howLong) : 
    Date(month, day, year), Time(hour, minute), howLong(howLong)
    {
    }
 
    Appointment() = default; 
};

#endif

What do I need to change about my code so that when I input the correct values it will return true? Please provide an example in your answer it would be greatly appreciated. Thank you for your time.

Upvotes: 0

Views: 99

Answers (1)

Swift - Friday Pie
Swift - Friday Pie

Reputation: 14614

The bug here is not in incorrect condition within if (which should work perfectly), it's due to incorrect behavior of program. You're going out of bounds here:

for (int i = 1; i < 20;  i++) {
            HW4DataFileHandle>>month;
            HW4DataFileHandle>>day;
            HW4DataFileHandle>>year;
            HW4DataFileHandle>>hour;
            HW4DataFileHandle>>minute;
            HW4DataFileHandle>>howLong;
            myAppointments[i] = Appointment( month, day, year, hour, minute, howLong);
}

As you declared myAppointments as array of 19 elements, it got index with legal range from 0 to 18. Not from 1 to 20. myAppointments[0] never got assigned, 19th and 20th records disappeared in the Great Undefined Unknown.

And here you check only part of array, the first 13 elements (including unassigned one), is that intended?

    for (int i = 0; i <13; i++){
        if ( friendTorCompare2Dates(myAppointments[i], myDate))
        { Time thisTime = myAppointments[i];
            thisTime.print();
            cout << endl;
        } 
    }

This is an example of "magic number" fallacy.

Upvotes: 3

Related Questions