Do-While Loops, но значения для оператора while находятся внутри оператора Do - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь выучить C#, создав программу, которая находит два значения, в которых система становится равновесной. Я попробовал Do-While l oop, но не могу установить sh оператор while, поскольку значения для оператора while находятся внутри оператора Do. Он просто говорит: «Переменные не существуют в текущем контексте». Надеюсь, у меня есть смысл.

Обновление: полный код размещен ниже. Я попробовал оператор while (true) и добавил оператор if-break. Я действительно не знаю, так ли это, как работает оператор if-break. L oop продолжается и продолжается без конца. Я попытался напечатать значения, но с самого первого l oop он уже удовлетворяет условиям.

Ниже мой код:

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

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Я поместил ваш код в dotnetfiddle. net, и ошибка, возникающая при изменении оператора while на

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

, равна Use of unassigned local variable 'Px'. Чтобы не получить эту ошибку, вам нужно присвоить значение Px sumRx Py и sumRy перед запуском l oop. Выше l oop вы можете просто изменить инициализацию на

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

Кроме того, ваш оператор break не работает, потому что оператор break применяется к вашему текущему блоку l oop, который является вашим самым внутренним для l oop, так что вы выходите из самого внутреннего на l oop, а не вырываетесь на время l oop.

0 голосов
/ 21 января 2020

Общий ответ на вопрос о том, почему l oop продолжается и заключается в том, что вы в течение l oop будете проверять каждое условие, что означает, что оно будет l oop nrow * ncol количество раз, даже если оно действительно находит ответ в первый раз. Это предполагает, что в коде, который вы запускаете, эта строка не закомментирована. (в то время как истина будет полностью навсегда).

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

Оператор break там выдает внутреннюю часть для l oop. Если вы хотите продолжать прерывание пораньше, вам также нужно написать логик прерывания c для всех циклов. В общем, это довольно уродливо, и это отличный пример того, почему вложенные циклы и операторы могут стать очень уродливыми очень быстро. :)

Надеюсь, это поможет.

0 голосов
/ 21 января 2020

Если вы замените

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

на

while (true)

, код скомпилируется?

Если нет, убедитесь, что вы объявили переменные Px, Py, sumRx, sumRy до начала do-while l oop.

double Px, Py, sumRx, sumRy;
do
{
...
...