清除数组和计算数组?

Netsid

会员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
我正在做一个学校项目,到目前为止我已经设法做到了,但是现在我再次陷入困境,我无法弄清这最后两件事。这是我在C#中的第一个项目,完全是编程。我想做的是获取用于"emptying bus" and "calcpass"正常工作,但我就在这里。第42和59行是起点,我真的很感谢我能获得的任何帮助! =)

thebus:
using System;

namespace ConsoleApp8
{
    class Program
    {
        static void Main(string[] args)     //main method, runs Bus
        {   //visuals
            Console.BackgroundColor = ConsoleColor.White;
            Console.ForegroundColor = ConsoleColor.Black;
            Console.SetWindowSize(63, 39);
                                                //runs bus class
            var runbus = new Bus();
            runbus.Run();
        }
    }
    class Bus
    {
        private const int V = 25;                            //variable for max passengers
        private int Y = 0;                                  //variable for keeping track of passengers
        private Passenger[] passengers = new Passenger[V]; // Initializing array of passengers

        public void addpass()                            //method for adding passengers
        {
            if (Y < 25)                                  //if statement informs if bus is full
            {
                Console.WriteLine("Type name of the passenger and press [Enter]");
                string nname = Console.ReadLine();
                Console.WriteLine("Type age of the passenger and press [Enter]");
                double nage = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("Type sex m/f of the passenger and press [Enter]");
                string nsex = Console.ReadLine();
                passengers[Y] = (nname, nage, nsex);
                Y++;
            }
            else
            {
                Console.WriteLine("The bus is full");
            }

        }
        public void emptybus()                        //method for 排空巴士 XXXXXX not working
        {
            if (Y > 0)
            {
                 数组 .Clear(passengers, 0, Y);
                Console.WriteLine("Press any key to continue");
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("Bus is empty");
                Console.WriteLine("Press any key to continue");
                Console.ReadKey();
            }

        }
        //  public double calc_age() =>  / Bus.Y;
        public void calcpass()                           //method for calculating passenger average age XXXXXXX not working
        {
            double totage = 0;
            for (double i = 0; i < passengers.Length; i++)
            {
                Console.WriteLine(passengers[Y]);
                totage = passengers[Y].age;
                double midage = (double)totage / passengers.Length;

                Console.WriteLine($"midage is {midage}");
                Console.WriteLine("Press any key to continue.");
                Console.ReadKey();
                this.Run();
            }
        }
        public void showlist()                          //method with forloop to show passenger list
        {
            for (int i = 0; i < Y; i++)
            {
                Console.WriteLine($"Name: {passengers[i].name} Age: {passengers[i].age} Sex: {passengers[i].sex}");
            }
            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
        }
        public void Run()
        {
            int choice = 0;
            var _exiter = new Exit();                     //variable for starting class for exiting program 
            do                                            //do-while to loop menu
            {
                Console.Clear();                         //keeps menu clean
                Console.WriteLine("" + Y + " passengers on bus.");
                Console.WriteLine("Welcome, what do you need to do?");
                Console.WriteLine("Please choose a number from the menu and press enter.");
                Console.WriteLine("1. Add passenger");
                Console.WriteLine("2. Empty bus");
                Console.WriteLine("3. Show passenger list");
                Console.WriteLine("4. Calculate average age");
                Console.WriteLine("5. Close Program");
                try                                       // try block to catch bad input
                {
                    choice = int.Parse(Console.ReadLine());
                }
                catch
                {
                    Console.WriteLine("Please choose 1-4");
                }                                        //switch statement menu
                switch (choice)
                {
                    case 1:
                        this.addpass();
                        break;
                    case 2:
                        this.emptybus();
                        break;
                    case 3:
                        this.showlist();
                        break;
                    case 4:
                        this.calcpass();
                        break;
                    case 5:
                        _exiter.Run();
                        break;
                    default:
                        Console.WriteLine("Try again.");
                        break;
                }
            } while (choice != 0);
        }
    }
    class Passenger                                    //passenger class containing variabels, parameters and constructor
    {
        public string name;
        public double age;
        public string sex;

        public Passenger(string name, double age, string sex)          //constructor passenger
        {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
        public double getage()                                  //method to return age
        {
            return age;
        }

                                                            //Tuple constructor for returning values
        public static implicit operator Passenger((string nname, double nage, string nsex) v)
        {
            return new Passenger(v.nname, v.nage, v.nsex);
        }

    }
    class Exit                                   //Class for closing program
    {
        public void Run()
        {
            Console.Clear();
            Console.Write("Press any key to exit.");
            Console.ReadKey();
            Environment.Exit(0);
        }
    }
}
 

Netsid

会员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
Emptying bus: 什么 does variable Y represent? 什么 is the value of Y after 排空巴士? Is "Y"这样的变量的好名字?

计算平均值:计算所有乘客的平均年龄需要两个值?

Y代表当前在公交车上的乘客人数,我不确定这是一个好名字,因为我对此表示非常陌生。
我只需要计算所有乘客的平均年龄即可。我知道它确实很有意义,但是它适合学校,所以我猜它也没有! =)
感谢您的回答。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
If you are adding passengers, you are incrementing Y. (See line 34.) Wouldn't it stand to reason that if you empty the bus, then there would be no more passengers and therefore you need to set Y back to zero?

Using good names for variables is very important. It makes it easier for you and others to understand the code. Right now with your use of Y, you and readers of your code need to mentally translate that as "count of passengers". So why not just name the variable PassengerCount instead?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
至于 @约翰·H 关于要计算平均年龄需要使用哪两个值的问题,他正试图让您考虑需要采取的步骤。如果您在纸上进行此操作,您将如何计算平均年龄?您将对代码执行相同的过程。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
变更:
C#:
        private int Y = 0;
至 :
C#:
        private int Y { get { return Get_PassengerCount(); } set { value = Get_PassengerCount(); } }

Then add this to your Bus class :
C#:
        private int Get_PassengerCount()
        {
            int num = 0;
            foreach (Passenger _passenger in passengers)
            {
                if (_passenger != null)
                num++;
            }
            return num;
        }
然后更改第34行以及从以下位置递增整数的任何其他位置:
C#:
Y++;
至 :
C#:
                Y = Get_PassengerCount();
您会发现这将有助于从旅客的舱位对象中获取旅客总数,但您仍有很大的整理空间。

编辑:固定文字错字
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
You will also notice that the code changes I provided will also change your Y value to equal exactly how many passengers are actually on the bus instead of minus &整数的加法运算,因为这会将每个乘客从您的乘客对象中拉出。
 

Netsid

会员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
好的,谢谢即时消息,我可以在这里编辑我的原始帖子吗?找不到按钮。我在清除数组后忘了重设Y,请确保重命名,以确保多数民众赞成!
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
您无权编辑原始帖子。而且只有在达到特定帖子阈值时,您才可以编辑原始帖子。您还只能在回复主题之前编辑原始帖子以进行较小的更正。否则,如果您在发布错误代码的方式上犯了一个错误。然后,您需要发布更新的代码作为对初始主题的答复。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
通常,在基于主题的论坛中编辑原始帖子的礼节很差,特别是在人们对原始帖子中的内容发表评论之后。现在,看起来做出响应的人正在失去理智,因为他们评论了不存在的东西(不再)。是的,在StackOverflow上,通常会随着注释(和答案)的出现而迭代原始问题的多个版本,以提出更好的问题。

While you are renaming variables, be sure to also rename V. Here's the general rule of thumb: if you need to write a comment to explain what a variable (or method, or property, or class) is used for, you should rename it so that you don't need the comment.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
Wouldn't it stand to reason that if you empty the bus, then there would be no more passengers and therefore you need to set Y back to zero?
The changes I suggested will help with this. Being new, I assume OP didn't know how to acquire the total 乘客人数 from passenger[]和cast the value to their int value Y. Using something like : private int Y { get { return Get_PassengerCount(); } set { value = Get_PassengerCount(); } } will prevent the need to increment or decrease Y as this will pull the total users on the bus from the passenger object where they are stored.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
But there's really no need to increment Y anymore, if the setter just ignores the value that is being passed to it. All you would need would be the getter.

But then the getter just calls a method called Get_PassengerCount. So the property Y:
C#:
int Y { get return Get_PassengerCount(); }
可能只是:
C#:
int PassengerCount
{
    get
    {
        int count = 0;
        foreach (Passenger p in passengers)
        {
            if (p != null)
                count++;
        }
        return count;
    }
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
Anyway, taking a closer look at the average calculation, there's multiple errors. At first there's line 65 which always access the same element because V doesn't change. Then there's the logic error in the for loop which iterates over all items in the array without discriminating between null and non-null passenger objects. Than after that there is computation of the average on line 66 which uses the size of the entire array as the denominator for the average instead of just the non-null passengers.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
But there's really no need to increment Y anymore, if the setter just ignores the value that is being passed to it. All you would need would be the getter.
运行原始代码,您将明白为什么我在这里留下了设置呼叫。尽管我只是在几分钟前写过,但我不记得自己为什么这么做。大声笑。

我目前还有其他四个正在进行的工作项目正在上班,现在回头看看我有点儿超负荷。这就是为什么我说:
但是您还有很多整理空间。
您看到的是与我正在看的相同的房屋,我没有时间编辑,因为我没有时间。

实际上,这似乎是一个有趣的小任务。我希望我有更多的时间来玩。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
运行原始代码,您将明白为什么我在这里留下了设置呼叫。
Yes, because line 34 tries to increment Y. 您将需要二传手。由于设置器只是忽略设置的任何值,因此您最好删除第34行。

(我现在意识到,当我私下向您发送消息时,我只提到删除第34行,而在上面的第12个帖子中并未提及。)
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
Anyway, it seems that the better data structure for the task at hand would be a 清单 <Passenger> instead of an array of Passenger, but I assume that the teacher for this class has a method to his/her madness.

顺便说一句,您真的需要这个吗:
C#:
//Tuple constructor for returning values
public static implicit operator Passenger((string nname, double nage, string nsex) v)
{
    return new Passenger(v.nname, v.nage, v.nsex);
}
只是为了使您可以拥有以下代码行:
C#:
passengers[Y] = (nname, nage, nsex);
什么时候可以简单地写成:
C#:
passengers[Y] = new Passenger(nname, nage, nsex);
该代码具有同样的可读性。

是的,在某些地方元组很有用(更不用说很酷了),但是在这种情况下,似乎只是为了使用该功能而使用了该功能。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
需要将88到97移到第87行之前。这些行的重写没有意义。实际上,该循环没有意义。

您将需要二传手。由于设置器只是忽略设置的任何值,因此您最好删除第34行。

@跳伞 乍一看,我认为这是我将其留在此处的原因之一,因此OP可以确定并最好地决定如何处理它。
 

Netsid

会员
已加入
2020年2月10日
留言内容
21
编程经验
Beginner
我想起您听到有关您编辑原始帖子的说法,这有点奇怪!我尝试用重写Y变量"Y = Get_PassengerCount();"现在array.clear方法可以正常工作了!我知道calcage的计算看起来很奇怪,因为它只是在atm上放了一些东西,所以我可以运行该程序而无需注释任何部分。
真的很喜欢帮助人员!非常感谢=)
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
不客气乐意效劳  (y)
 
最佳 底部