问题 清除阵列和计算阵列?

Netsid.

成员
加入
2月10日,2020年
消息
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 emptying bus XXXXXX not working
        {
            if (Y > 0)
            {
                Array.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);
        }
    }
}
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
排空总线:变量Y代表什么?排空巴士后Y的值是多少?是"Y"这样一个变量的好名字?

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

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
排空总线:变量Y代表什么?排空巴士后Y的值是多少?是"Y"这样一个变量的好名字?

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

Y代表了当前在公共汽车上的乘客数量,我不确定是一个好名字,因为我对此非常新的。
我只需要计算所有乘客的平均年龄,没有别的。我知道它是多么感觉,但它为学校而且我猜这也没有有过! =)
谢谢你的回答。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
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,892
地点
切萨皮克,va.
编程经验
10+
至于 @Johnh.对计算平均年龄需要的两个值的问题,他正试图让您思考您需要采取的步骤。如果你在纸上做到这一点,你会如何计算平均年龄?您可以使用代码执行相同的过程。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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:

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
好的,谢谢伙计们要尝试这个,可以在这里编辑我的原始帖子吗?找不到按钮。我忘了在清除数组后重置y,否则肯定会响应它,肯定会很大的输入!
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
您无权编辑原始帖子。当您击中某个帖子阈值时,您只能允许编辑原始帖子。您也只允许编辑原始帖子,以便在回复您的主题之前进行小修正。否则,如果您在发布错误代码的方式犯了错误。然后,您需要将更新的代码发布为对初始主题的回复。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
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.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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 count of passengers 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,892
地点
切萨皮克,va.
编程经验
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,892
地点
切萨皮克,va.
编程经验
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.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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,892
地点
切萨皮克,va.
编程经验
10+
运行原始代码,您将看到为什么我在那里离开设置。
Yes, because line 34 tries to increment Y. 你需要设定者。由于Setter忽略了设置为它的任何值,因此您可能也可能删除第34行。

(我现在意识到,当我私下向您邮件时,我只提到了删除线34,但在#12帖子中没有提到它。)
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
Anyway, it seems that the better data structure for the task at hand would be a List<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);
代码不太可读。

是的,有些地方有用(更不用说COOL),但在这种情况下,它似乎只是为了使用该功能而被使用。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
88至97需要在第87行之前移动。这些线路重写没有必要。实际上,该循环中没有任何点。

你需要设定者。由于Setter忽略了设置为它的任何值,因此您可能也可能删除第34行。

@skydiver. 在重新上看,我认为这是我把它留在那里的原因之一,因为所以OP可以确定并最好地决定与它有关。
 

Netsid.

成员
加入
2月10日,2020年
消息
21
编程经验
Beginner
我听到你对编辑原来的帖子的说法,当我想到它时,有点像帖子!我尝试用y变量重写"y = get_passengercount();"而现在阵列。核方法正常工作!我知道计算的计算看起来很奇怪,因为我只是把东西放在那里,所以我可以在没有评论任何零件的情况下运行程序。
真的是帮助家伙!谢谢很多=)
 
最佳 底部