views:

280

answers:

3

This is a homework problem - so I would appreciate if you could tell me what I am doing wrong and how to fix it, resp. how to optimize my programing techniques :). Thanks!

I built this to save the employee in the array - it will save the first one right but when it saves the others it shows up blank - right out of the constructor. Why?

    using System;
    using System.IO;

    class Driver
    {
        const int NUMBER_OF_EMPLOYEES = 10;

        // Main Method
        // Purpose: directs the program in what to do and loops the program while np.again != n
        // Parameters: none
        // Returns: nothing
        // Pre-conditions: none
        // Post-conditions: none
        public static void Main()
        {
            Driver nd = new Driver();
            char response = 'y';
            string PathName = "empdata" + ".txt";
            int counter = 0;

            do
            {
                employee[] emps = new employee[NUMBER_OF_EMPLOYEES];
                TextReader tr = new StreamReader(PathName);

                do
                {
                    emps[counter] = nd.getSaveEmpdataPrint(PathName, counter, tr );
                    counter++;
                } while (counter != 6);

                response = nd.again();
                Console.Clear();

            } while (response != 'n');
        }

        public employee getSaveEmpdataPrint(string PathName, int counter, TextReader tr)
        {

            employee tempEmployee = new employee();

            Driver nd = new Driver();
            double i = 1;
            string temp = "";

            do
            {
                temp = tr.ReadLine();
                if ((i % 1) == 0.5)
                    i += 0.5;

                try
                {
                if (temp != null)
                {
                    try
                    {
                        if ((int.Parse(temp)) == 1)
                        {
                            tempEmployee.empNumber = (int)(i - 0.5);
                            i += 0.5;
                        }
                    }
                    catch (FormatException){ }

                    if (i == 2)
                    {
                        string fn = "";
                        string ln = "";

                        nd.SplitString(temp, ref fn , ref ln);

                        tempEmployee.firstName = fn;
                        tempEmployee.lastName = ln;
                        i += 0.5;
                    }

                    if (i == 3)
                    {
                        tempEmployee.adress = temp;
                        i += 0.5;
                    }

                    if (i == 4)
                    {
                        double temphrwage = 0;
                        double temphrsworked = 0;
                        nd.SplitDouble(temp, ref temphrwage, ref temphrsworked);

                        tempEmployee.hrsWorked = temphrsworked;
                        tempEmployee.hrlyWage = temphrwage;
                        i += 0.5;
                    }



                }           
                }
                catch (NullReferenceException)
                    {
                        Console.WriteLine("The data in the text file was imcomplete or was formated wrong.");
                        Console.ReadLine();

                    }
            } while (temp != null && i != 4.5);

            return tempEmployee;
        }

        private void PrintEmployee(employee tempEmployee)
        {
            Console.WriteLine("-------------------------------------");
            Console.WriteLine("Employee Number: --- {0}", tempEmployee.empNumber);
            Console.WriteLine("           Name: --- {0}, {1}", tempEmployee.lastName, tempEmployee.firstName);
            Console.WriteLine("         Adress: --- {0}", tempEmployee.adress);
            Console.WriteLine("    Hourly wage: --- {0:f2} (USD per hour)", tempEmployee.hrlyWage);
            if (tempEmployee.hrsWorked == 1)
                Console.WriteLine("   Hours Worked: --- 1hr ");
            if (tempEmployee.hrsWorked != 1)
                Console.WriteLine("   Hours Worked: --- {0:f2}hrs", tempEmployee.hrsWorked);
            Console.WriteLine("-------------------------------------");
        }

        private void SplitString(string temp, ref string FirstName, ref string LastName)
        {
            char[] delimit = new char[] { ' ' };
            int counter = 0;

            foreach (string substr in temp.Split(delimit))
            {
                if (counter == 0)
                    FirstName = substr;
                if (counter == 1)
                    LastName = substr;
                counter++;
            }

        }

        private void SplitDouble(string temp, ref Double a, ref Double b)
        {
            char[] delimit = new char[] { ' ' };
            int counter = 0;

            string ta = "";
            string tb = "";

            foreach (string substr in temp.Split(delimit))
            {
                if (counter == 0)
                    ta = substr;
                if (counter == 1)
                    tb = substr;
                counter++;
            }

            a = double.Parse(ta);
            b = double.Parse(tb);

        }


        // again Method
        // Purpose: asks the user if they want to run the program again
        // Parameters: none
        // Returns: a char ( y or n )
        // Pre-conditions: none
        // Post-conditions: none
        public char again()
        {
            char response = 'y';
            Console.Write("\nWould you like run again? (y or n)");
            response = char.Parse(Console.ReadLine());
            response = char.ToLower(response);
            Console.Clear();
            return response;
        }
    }

    class employee
    {
        private int EmpNumber;
        private string FirstName;
        private string LastName;
        private string Adress;
        private double HrlyWage;
        private double HrsWorked;

        // Default Constructor
        public employee()
        {
            EmpNumber = 0;
            FirstName = "";
            LastName = "";
            Adress = "";
            HrlyWage = 0;
            HrsWorked = 0;
        }

        // Method empNumber
        // Porpose: get and set the EmpNumber
        // Pramereters: int
        // Returns: a int (employee Number)
        public int empNumber
        {
            get
            {
                return EmpNumber;
            }
            set
            {
                EmpNumber = value;
            }
        }

        // Method lastName
        // Porpose: get and set the name
        // Pramereters: string
        // Returns: a string (employee name)
        public string lastName

        {
            get
            {
                return LastName;
            }
            set
            {
                LastName = value;
            }
        }

        // Method firstName
        // Porpose: get and set the first name
        // Pramereters: string
        // Returns: a string (employee's first name)
        public string firstName
        {
            get
            {
                return FirstName;
            }
            set
            {
                FirstName = value;
            }
        }

        // Method adress
        // Porpose: get and set the adress of the employee
        // Pramereters: string
        // Returns: a string (employee adress)
        public string adress
        {
            get
            {
                return Adress;
            }
            set
            {
                Adress = value;
            }
        }

        // Method hrlyWage
        // Porpose: get and set the Hourly Wage
        // Pramereters: Double
        // Returns: a double (employee's Hourly Wage)
        public double hrlyWage
        {
            get
            {
                return HrlyWage;
            }
            set
            {
                HrlyWage = value;
            }
        }

        // Method hrsWorked
        // Porpose: get and set the Hours Worked
        // Pramereters: Double
        // Returns: a double (the number of hours the employee worked)
        public double hrsWorked
        {
            get
            {
                return HrsWorked;
            }
            set
            {
                HrsWorked = value;
            }
        }

        // Method reset
        // Porpose: reset everything to zero/default
        // Pramereters: none
        // Returns: nothing
        public void reset()
        {
            EmpNumber = 0;
            FirstName = "";
            LastName = "";
            Adress = "";
            HrlyWage = 0;
            HrsWorked = 0;
        }

    // Method empNumber
    // Porpose: get and set the EmpNumber
    // Pramereters: int
    // Returns: a int (employee Number)
    public int empNumber
    {
        get
        {
            return EmpNumber;
        }
        set
        {
            EmpNumber = value;
        }
    }

    // Method lastName
    // Porpose: get and set the name
    // Pramereters: string
    // Returns: a string (employee name)
    public string lastName

    {
        get
        {
            return LastName;
        }
        set
        {
            LastName = value;
        }
    }

    // Method firstName
    // Porpose: get and set the first name
    // Pramereters: string
    // Returns: a string (employee's first name)
    public string firstName
    {
        get
        {
            return FirstName;
        }
        set
        {
            FirstName = value;
        }
    }

    // Method adress
    // Porpose: get and set the adress of the employee
    // Pramereters: string
    // Returns: a string (employee adress)
    public string adress
    {
        get
        {
            return Adress;
        }
        set
        {
            Adress = value;
        }
    }

    // Method hrlyWage
    // Porpose: get and set the Hourly Wage
    // Pramereters: Double
    // Returns: a double (employee's Hourly Wage)
    public double hrlyWage
    {
        get
        {
            return HrlyWage;
        }
        set
        {
            HrlyWage = value;
        }
    }

    // Method hrsWorked
    // Porpose: get and set the Hours Worked
    // Pramereters: Double
    // Returns: a double (the number of hours the employee worked)
    public double hrsWorked
    {
        get
        {
            return HrsWorked;
        }
        set
        {
            HrsWorked = value;
        }
    }

    // Method reset
    // Porpose: reset everything to zero/default
    // Pramereters: none
    // Returns: nothing
    public void reset()
    {
        EmpNumber = 0;
        FirstName = "";
        LastName = "";
        Adress = "";
        HrlyWage = 0;
        HrsWorked = 0;
    }

}

}

sample txt file format:
1
John MerryWeather
123 West Main Street
5.00 30
2
Andrew Buttons
17 East Riverview Drive
12.00 40
3
Martha Washington
1 Mount Vernon Lane
7.25 20
...

Example from txt

Thanks, guys, and sorry about not having all the code :P and the txt file. :))

A: 
do
            {
                emps[counter] = nd.getSaveEmpdataPrint(PathName, counter, tr );
                counter++;
            } while (counter != NUMBER_OF_EMPLOYEES);

In the above code it should be

while (counter < NUMBER_OF_EMPLOYEES);
Jebli
if i do that it only runs once (saves the employee once) - i need it to do it "NUMBER_OF_EMPLOYEES" (10) times. right?
Wallter
That's just wrong, Jebli.
Dykam
Hi sorry i have edited the answer.
Jebli
But Walter you have edited the program.The program that is there now was not the one u posed initally.Now you have eited it to do { emps[counter] = nd.getSaveEmpdataPrint(PathName, counter, tr ); counter++; } while (counter != 6);
Jebli
You should delete this post, you'll earn a badge.
NickLarsen
+2  A: 

Change:

                if ((int.Parse(temp)) == 1)
                {
                    tempEmployee.empNumber = (int)(i - 0.5);
                    i += 0.5;
                }

To:

                if ((int.Parse(temp)) > 0)
                {
                    tempEmployee.empNumber = int.Parse(temp);
                    i+= 0.5;
                }

You are only incrementing i if temp can parse correctly to an integer, the sample file's 1st entry was the only employee that met that condition.

Mark
WOW - that's all it was :P THANKS!!!
Wallter
actually, it is all it took to make it work. As it was a homework question it def. was not enough to teach you how you would fix this in a decent way so that you actually learned what you are doing wrong. But hey, it works :). Be sure to read all the comments and replies nevertheless to learn more about how to program such things.
bastijn
+1  A: 

Here is a rewritten version that should be somewhat clearer. I commented it about some things.

My main complaint about your original code was that you made too much use of loops and counters when you didn't have to use them. It unnecessarily complicates the code which is never a good thing.

class Driver
{
    // Purpose: directs the program in what to do and loops the program while np.again != n
    public static void Main()
    {
        //No need to split this into two strings just to concatenate them together immediately
        string pathName = "empdata.txt";

        do
        {
            //Use a list instead of an array to allow for a variable amount of employees
            List<Employee> employees = new List<Employee>();
            TextReader tr = new StreamReader(pathName);

            //This while statement is a common pattern for reading data from a stream.
            //Reademployee was changed to return null when no more employees are present.
            Employee employee;
            while ((employee = Employee.Read(tr)) != null)
            {
                employees.Add(employee);
            }

        } while (again() != 'n');
    }

    // Make the method static if it doesn't have any relation to any specific object
    // Purpose: asks the user if they want to run the program again
    // Returns: a char ( y or n )
    public static char again()
    {
        char response = ' ';
        while (response != 'y' && response != 'n')
        {
            Console.Write("\nWould you like run again? (y or n)");
            response = char.Parse(Console.ReadLine());
            response = char.ToLower(response);
            Console.Clear();
        }
        return response;
    }
}

class Employee
{
    //This is a nice syntax if using c# 3.5. It allows for simple properties with minimal code.
    public int EmployeeNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Adress { get; set; }
    public double HourlyWage { get; set; }
    public int HoursWorked { get; set; }

    public Employee()
    {
        //Avoid code duplication by calling the reset method
        Reset();
    }

    public void Reset()
    {
        EmployeeNumber = 0;
        FirstName = "";
        LastName = "";
        Adress = "";
        HourlyWage = 0;
        HoursWorked = 0;
    }

    //This method fits better directly inside the employee class
    public static Employee Read(TextReader tr)
    {
        Employee employee = new Employee();

        string line = tr.ReadLine();
        //We exit as soon as we detect that the file has ended.
        //This makes the code cleaner than having nested if-else.
        //(I personally don't use the {} on single lines, but many do.
        if (line == null) {return null;} //No more posts

        //The whole do-while loop was removed. Unnescessary while loops should always
        //be avoided as they are one of the most difficult code constructs to follow,

        employee.EmployeeNumber = int.Parse(line);

        //Your helpmethod just complicated things. It also contained an unnesscesary loop
        string[] splitName = tr.ReadLine().Split(' ');
        employee.FirstName = splitName[0];
        employee.LastName = splitName[1];

        employee.Adress = tr.ReadLine();

        //Same as above. Also, changed HoursWorked to integer.
        string[] splitHours = tr.ReadLine().Split(' ');
        //InvariantCulture should always be used when dealing with data of a well defined format.
        //Otherwise the code won't work on computers with different culture settings.
        //(Like ones that use "," instead of ".")
        employee.HourlyWage = double.Parse(splitHours[0], System.Globalization.CultureInfo.InvariantCulture);
        employee.HoursWorked = int.Parse(splitHours[1]);

        return employee;
    }


    public void Print()
    {
        Console.WriteLine("-------------------------------------");
        Console.WriteLine(this.ToString());
        Console.WriteLine("-------------------------------------");
    }

    public override string ToString()
    {
        System.Text.StringBuilder sb = new StringBuilder();
        sb.AppendFormat("Employee Number: --- {0}", EmployeeNumber);
        sb.AppendFormat("           Name: --- {0}, {1}", LastName, FirstName);
        sb.AppendFormat("         Adress: --- {0}", Adress);
        sb.AppendFormat("    Hourly wage: --- {0:f2} (USD per hour)", HourlyWage);
        if (HoursWorked == 1)
            sb.AppendFormat("   Hours Worked: --- 1hr ");
        else
            sb.AppendFormat("   Hours Worked: --- {0:f2}hrs", HoursWorked);
        return sb.ToString();
    }
}
Marcus Andrén