【问题标题】:C# - Not saving right in Array - why will it save the first one but not the rest?C# - 没有保存在数组中 - 为什么它会保存第一个而不是其余的?
【发布时间】:2009-11-10 17:34:13
【问题描述】:

这是一个家庭作业问题 - 如果您能告诉我我做错了什么以及如何解决它,我将不胜感激。如何优化我的编程技术:)。谢谢!

我构建它是为了将 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 号
5.00 30
2
安德鲁·巴顿
17东江景大道
12.00 40
3
玛莎华盛顿
弗农山巷 1 号
7.25 20
...

txt 中的示例

谢谢,伙计们,很抱歉没有所有代码 :P 和 txt 文件。 :))

【问题讨论】:

  • 你确定有足够的代码吗?
  • 哇。从哪里开始? Wallter:您能提供一些 empdata.txt 文件中的示例吗?也许添加一些cmets? getSaveEmpdataPrint() 方法是一个野兽。
  • 哇...对不起,我有点间隔为 txt 文件添加示例 :) 抱歉,谢谢您的快速反馈 :)
  • 这段代码有很多问题,这只是冰山一角。它令人困惑,令人费解,而且在很多地方都没有任何意义。例如,为什么要使用令人困惑的模数来四舍五入?为什么要使用舍入?您似乎只是将其用作某种标志。为什么要在驱动程序中分配新的驱动程序?您可以从当前实例中访问这些函数。

标签: c# .net arrays object


【解决方案1】:

变化:

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

如果 temp 可以正确解析为整数,则仅增加 i,示例文件的第一个条目是唯一满足该条件的员工。

【讨论】:

  • 实际上,这就是让它工作的全部。因为这是一个家庭作业问题,所以它定义。不足以教您如何以体面的方式解决此问题,以便您真正了解自己做错了什么。但是,嘿,它有效:)。尽管如此,请务必阅读所有 cmets 和回复,以了解有关如何对此类事物进行编程的更多信息。
【解决方案2】:

这是一个重写的版本,应该更清楚一些。我评论了一些事情。

我对您的原始代码的主要抱怨是,当您不必使用它们时,您过多地使用了循环和计数器。它不必要地使代码复杂化,这绝不是一件好事。

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

【讨论】:

    【解决方案3】:
    do
                {
                    emps[counter] = nd.getSaveEmpdataPrint(PathName, counter, tr );
                    counter++;
                } while (counter != NUMBER_OF_EMPLOYEES);
    

    在上面的代码中应该是

    while (counter < NUMBER_OF_EMPLOYEES);
    

    【讨论】:

    • 如果我这样做,它只运行一次(保存员工一次) - 我需要它执行“NUMBER_OF_EMPLOYEES”(10)次。对吗?
    • 但是沃尔特你已经编辑了程序。现在的程序不是你最初提出的程序。现在你已经编辑它来做{ emps[counter] = nd.getSaveEmpdataPrint(PathName, counter , tr);计数器++; } 而(计数器!= 6);
    • 您应该删除此帖子,您将获得徽章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2022-11-06
    • 2021-04-28
    • 2019-12-17
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多