C # - Не сохраняет права в массиве - почему он сохранит первый, но не остальные? - PullRequest
0 голосов
/ 10 ноября 2009

Это проблема с домашним заданием, поэтому я был бы признателен, если бы вы сказали мне, что я делаю неправильно и как это исправить, соответственно. как оптимизировать мои методы программирования :). Спасибо!

Я построил это, чтобы сохранить employee в массиве - он сохранит первый справа, но когда он сохранит остальные, он отобразится пустым - прямо из конструктора. Почему?

    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;
    }

}

}

пример формата файла txt:
1
Джон МерриВезер
123 West Main Street
5,00 30
2
Андрей Кнопки
17 Ист Ривервью Драйв
12,00 40
3
Марта Вашингтон
1 Маунт Вернон Лейн
7,25 20
...

Пример из txt

Спасибо, ребята, и извините за отсутствие всего кода: P и файла txt. :))

Ответы [ 3 ]

2 голосов
/ 10 ноября 2009

Изменение:

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

Кому:

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

Вы увеличиваете i, только если temp может правильно проанализировать целое число, 1-я запись в файле примера была единственным сотрудником, который выполнил это условие.

1 голос
/ 16 ноября 2009

Вот переписанная версия, которая должна быть несколько понятнее. Я прокомментировал это о некоторых вещах.

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

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();
    }
}
0 голосов
/ 10 ноября 2009
do
            {
                emps[counter] = nd.getSaveEmpdataPrint(PathName, counter, tr );
                counter++;
            } while (counter != NUMBER_OF_EMPLOYEES);

В приведенном выше коде это должно быть

while (counter < NUMBER_OF_EMPLOYEES);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...