Do-While 循环,但 while 语句的值在 Do 语句内

Posted

技术标签:

【中文标题】Do-While 循环,但 while 语句的值在 Do 语句内【英文标题】:Do-While Loops but the values for the while statement is inside the Do Statement 【发布时间】:2020-05-07 09:55:02 【问题描述】:

我正在尝试通过编写一个程序来学习 C#,该程序可以找到系统达到平衡的两个值。我尝试了 Do-While 循环,但我无法建立 while 语句,因为 while 语句的值在 Do-statement 内。它只是说“变量在当前上下文中不存在”。我希望我说得通。

更新:完整代码发布在下面。我尝试了 while (true) 语句并添加了 if-break 语句。我真的不知道这是否是 if-break 语句的工作方式。循环不断地循环下去。我尝试打印值,但从第一个循环开始,它已经满足条件。

下面是我的代码:

using System;
using System.Linq;

public class BoltCoord

    public double x1;
    public double y1;


public class Program

    public static void Main()
    
        Console.Write("Number of Rows: ");
        int nrow = int.Parse(Console.ReadLine());

        Console.Write("Spacing of Rows: ");
        double srow = double.Parse(Console.ReadLine());

        Console.Write("Number of Columns: ");
        int ncol = int.Parse(Console.ReadLine());

        Console.Write("Spacing of Columns: ");
        double scol = double.Parse(Console.ReadLine());

        Console.Write("Eccentricity from CG: ");
        double ecc = double.Parse(Console.ReadLine());

        Console.Write("Rotation: ");
        double rot = double.Parse(Console.ReadLine());

        int totalbolts = nrow * ncol;

        var boltgroupCG = BoltCG(nrow, ncol, srow, scol); // bolt group cg from first bolt

        double[] xvaluesofbolts = new double[totalbolts]; //x-values of each bolt where first bolt is (0,0)
        for (int ctr = 0; ctr < totalbolts; ctr++)
        
            xvaluesofbolts[ctr] = (ctr % ncol) * srow;
        

        double[] yvaluesofbolts = new double[totalbolts]; //y-values of each bolt where first bolt is (0,0)
        for (int ctr = 1; ctr < totalbolts; ctr++)
        
            yvaluesofbolts[ctr] = (ctr / ncol) * srow;
        

        double[] FxOfBolts = new double[totalbolts];
        double[] FyOfBolts = new double[totalbolts];
        double[] MomOfBolts = new double[totalbolts];
        double[] XTransOfBolts = new double[totalbolts]; // Translated X
        double[] YTransOfBolts = new double[totalbolts]; // Translated Y

        double[] XLi = new double[totalbolts]; // Translated X
        double[] YLi = new double[totalbolts]; // Translated Y

        double[] BoltDist = new double[totalbolts]; // from IC
        double[] DeformBolts = new double[totalbolts];
        double[] ReactionForce = new double[totalbolts];
        double[] ReactionForceX = new double[totalbolts];
        double[] ReactionForceY = new double[totalbolts];
        double[] MomentBolt = new double[totalbolts];

        var IC = new BoltCoord(); // from CG

        double Px;
        double Py;
        double sumRx;
        double sumRy;
        double ctrX;
        double ctrY;

        do
        
            for (ctrX = 0; ctrX < 50; ctrX = ctrX + 0.1)
            
                for (ctrY = 0; ctrY < 50; ctrY = ctrY + 0.1)
                
                    for (int El = 0; El < totalbolts; El++)
                    
                        XTransOfBolts[El] = xvaluesofbolts[El] - boltgroupCG.x1;
                        YTransOfBolts[El] = yvaluesofbolts[El] - boltgroupCG.y1;
                        XLi[El] = XTransOfBolts[El] + ctrX;
                        YLi[El] = YTransOfBolts[El] + ctrY;
                        BoltDist[El] = Math.Sqrt(Math.Pow(XLi[El], 2) + Math.Pow(YLi[El], 2));

                        double MaxDist = BoltDist.Max();
                        // int MaxIndex = Array.IndexOf(BoltDist, MaxDist);
                        double delta = 0.34;
                        double Rult = 74;


                        DeformBolts[El] = delta * BoltDist[El] / MaxDist;
                        ReactionForce[El] = Rult * Math.Pow((1 - Math.Exp(-10 * DeformBolts[El])), 0.55);

                        ReactionForceX[El] = ReactionForce[El] * YLi[El] / BoltDist[El];
                        ReactionForceY[El] = ReactionForce[El] * XLi[El] / BoltDist[El];

                        MomentBolt[El] = ReactionForce[El] * BoltDist[El];

                        sumRx = ReactionForceX.Sum();
                        sumRy = ReactionForceY.Sum();
                        double sumMoment = MomentBolt.Sum();
                        double sumReax = ReactionForce.Sum();

                        double ro = (ecc + ctrX) * Math.Cos(Math.PI * rot / 180) + ctrY * Math.Sin(Math.PI * rot / 180);
                        Px = sumMoment / ro;
                        Py = Px * Math.Cos(Math.PI * rot / 180);

                        Console.WriteLine(Px + " " + sumRx + " " + Py + " " + sumRy); // tried printing the values to see if loop happens. 
                                                                                      // Px minus sumRx and Py minus sumRy are always less than 1000 but
                                                                                      // loop still continues?

                        if ((Px - sumRx <= 1000) && (Py - sumRy <= 1000))
                        
                            break;
                        

                    
                
            
         while (true); //((Px != sumRx) || (Py != sumRy));
    

    public static BoltCoord BoltCG(int nrow, int ncol, double srow, double scol)
    
         var BoltCGCoord = new BoltCoord
         
             x1 = (ncol - 1) * scol * 0.5,
             y1 = (nrow - 1) * srow * 0.5
         ;
         return BoltCGCoord;
    

【问题讨论】:

500 / 0.001 * 500 / 0.001 * totalbolts == 2.5e11 * totalbolts 机器人(至少 250 十亿)。你真的想要那么多吗? 可能很明显,但是 PX 和 PY 是否在循环开始之前定义并可用? 【参考方案1】:

我把你的代码放到 dotnetfiddle.net 中,将 while 语句更改为时出现的错误

while((Px != sumRx) || (Py != sumRy))

Use of unassigned local variable 'Px'。为了不出现此错误,您需要在开始循环之前为 Px sumRx PysumRy 分配一个值。在循环上方,您可以将初始化更改为

double Px = 0;
double Py = 0;
double sumRx = 0;
double sumRy = 0;
double ctrX = 0;
double ctrY = 0;

此外,您的 break 语句不起作用,因为 break 语句适用于您当前的循环块,这是您最内层的 for 循环,因此您要跳出最内层的 for 循环,而不是跳出 while 循环。

【讨论】:

【参考方案2】:

如果你替换

while ((Px != sumRx) || (Py != sumRy))

while (true)

代码可以编译吗?

如果不是,请确保在 do-while 循环开始之前声明了变量 Px、Py、sumRx、sumRy。

double Px, Py, sumRx, sumRy;
do

...

【讨论】:

嗨。感谢您的回复。我已经更新了我的帖子并发布了上面的完整代码。【参考方案3】:

为什么循环继续循环的一般答案是你的 for 循环会检查每个条件,这意味着它会循环 nrow * ncol 次数,即使它确实在第一次找到答案. 这是假设在您运行的代码中没有注释掉这一行。 (而 true 将永远永远循环)。

     while (true); //((Px != sumRx) || (Py != sumRy));

其中的 break 语句退出了最里面的 for 循环。如果您想保持早期突破,您还需要为所有循环编写突破逻辑。总的来说,这很丑陋,这是一个很好的例子,说明为什么嵌套循环和 if 语句会很快变得丑陋。 :)

希望对您有所帮助。

【讨论】:

以上是关于Do-While 循环,但 while 语句的值在 Do 语句内的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的do-while循环怎么用啊?给个例子呗。

实验三:分别用forwhile和do-while循环语句以及递归方法计算n!,并输出算式

do-while语句及for语句(初学者)

java循环语句while与do-while

IT兄弟连 Java语法教程 流程控制语句 循环结构语句4

do-while循环结构