嵌套While循环和重复结果

Nested While Loops and Duplicate results?

本文关键字:结果 While 循环 嵌套      更新时间:2023-09-26

在你说这是一个老问题之前,我花了24个小时试图解决并阅读所有内容。我发誓。

该代码应该接收一个系统id,然后在该系统的各个方向上扫描,每个方向都有自己的长度。这就像扫描一个围绕系统的矩形,其中9*9=81个系统。

代码运行得很好;但问题来了。我得到了8个重复的结果,结果中缺少一整行。中间一排正上方的那个。我认为问题出在topsystem整数上,但我不知道它出了什么问题

这是代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" verticalAlign="middle">

<mx:Script>
    <![CDATA[

        private function startscan():void {
            var startsystem:int = int(system.text);
            var resultsys:String = systemsaround.text;
            var leftsystem:int = -4;
            var rightsystem:int = 4;
            var topsystem:int = -400;
            var downsystem:int = 400;
            var mediumsys:int = 0;
            var tempdownsystem:int = 0;
            var temptopsystem:int = 0;

            if(startsystem + downsystem > 10000){
                downsystem = 400 -((startsystem + downsystem) - 10000);
                downsystem = Math.floor(downsystem/100)*100;
                topsystem = topsystem - (400 - downsystem);
            }
            if(startsystem + topsystem < 1){
                topsystem = -400 + (1+(-1*(startsystem + topsystem)));
                topsystem = Math.ceil(topsystem/100)*100;
                downsystem = downsystem + (400 - (topsystem * -1));
            }
            if(startsystem + leftsystem < 1){
                leftsystem = -4 + (1+(-1*(startsystem + leftsystem)));
                rightsystem = rightsystem + (4 - (leftsystem * -1));
            }
            if(startsystem + rightsystem > 10000){
                rightsystem = 4 -((startsystem + rightsystem) - 10000);
                leftsystem = leftsystem - (4 - rightsystem);
            }
            resultsys = systemsaround.text;
            systemsaround.text = resultsys + "down" + downsystem + "top" + topsystem + "left" + leftsystem + "right" + rightsystem + ":" + startsystem + "'r";
            resultsys = systemsaround.text;
            while (rightsystem > 0) {
            resultsys = systemsaround.text;
            mediumsys = startsystem + rightsystem;
            systemsaround.text = resultsys + mediumsys + "'r";
            resultsys = systemsaround.text;
            tempdownsystem = downsystem;
            temptopsystem = topsystem;
            rightsystem--;
                        while (downsystem > 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + downsystem;
                            systemsaround.text = resultsys + mediumsys + "'r";
                            resultsys = systemsaround.text;
                            downsystem = downsystem - 100;

                        }
                        while (topsystem < 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + topsystem;
                            systemsaround.text = resultsys + mediumsys + "'r";
                            resultsys = systemsaround.text;
                            topsystem = topsystem + 100;

                        }
            downsystem = tempdownsystem;        
            topsystem = temptopsystem;

            }


            while (leftsystem < 0) {
            resultsys = systemsaround.text;
            mediumsys = startsystem + leftsystem;
            systemsaround.text = resultsys + mediumsys + "'r";
            resultsys = systemsaround.text;
            tempdownsystem = downsystem;
            temptopsystem = topsystem;
            leftsystem++;
                        while (downsystem > 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + downsystem;
                            systemsaround.text = resultsys + mediumsys + "'r";
                            resultsys = systemsaround.text;
                            downsystem = downsystem - 100;

                        }
                        while (topsystem < 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + topsystem;
                            systemsaround.text = resultsys + mediumsys + "'r";
                            resultsys = systemsaround.text;
                            topsystem = topsystem + 100;

                        }
            downsystem = tempdownsystem;        
            topsystem = temptopsystem;  

            }
                        while (downsystem > 0) {
                            resultsys = systemsaround.text;
                            mediumsys = startsystem + downsystem;
                            systemsaround.text = resultsys + mediumsys + "'r";
                            resultsys = systemsaround.text;
                            downsystem = downsystem - 100;

                        }
                        while (topsystem < 0) {
                            resultsys = systemsaround.text;
                            mediumsys = startsystem + topsystem;
                            systemsaround.text = resultsys + mediumsys + "'r";
                            resultsys = systemsaround.text;
                            topsystem = topsystem + 100;

                        }



        }
    ]]>
</mx:Script>

    <mx:VBox width="488" height="304" horizontalCenter="0" verticalCenter="-16" horizontalAlign="center" verticalAlign="middle">
        <mx:TextInput id="system" text="3375"/>
        <mx:TextArea width="80%" height="228" fontSize="10" id="systemsaround"/>
        <mx:Button label="start"  click="startscan()" id="start"/>
    </mx:VBox>
</mx:WindowedApplication>

如果你提供3375的启动系统,你会得到81个结果,其中有8个重复:

  • 3379 3378 3377 3376 3371 33723373 3374

缺少的数字是(缺少8个):

  • 3279 3278 3277 3276 3274 32733272 3271

我希望有人能给我指明正确的方向。谢谢

更新:

如果您观察代码中包含if语句的部分。这个部件处理边缘,特别是零和10k。关于我想做什么。把它想象成一个9*9点的矩形场。具有9行9列。每个点具有从1到10k的id。输入是字段中心(第5列,第5行)的点的id。现在我知道了这个中心点id。我想循环浏览整个字段,使用topsystem(中心点到上边缘之间的距离)、downsystem(中央点到下边缘之间的间距)、leftsystem(中央点和左边缘之间的距离)、rightsystem(中央点通过右边缘之间的间隔)找到其他点id。

代码运行良好,但有8个缺失的id被8个重复的id所取代。我不知道他们从哪里来。

我不确定你想做什么,所以让我解释一下我认为你想做的。

您有10000个"系统"排列在100x100网格中。给定一个系统号,你想输出它周围的所有81个系统号。除了在网格的边缘,你不想输出这些。

在这种情况下,删除所有代码并尝试以下操作:

var x = int(system.text)%100;
var y = Math.floor(int(system.text)/100);
for(var dx=-4; dx <= 4; dx++)
for(var dy=-4; dy <= 4; dy++) 
  if(0 <= x+dx && x+dx <= 100 && 0 <= y+dy && y+dy <= 100)
    systemsarround.text += x+dx + (y+dy)*100 + "'r";

这是未经测试的,但你明白了。

另一种尝试:

var x = int(system.text)%100;
var y = Math.floor(int(system.text)/100);
for(var dx=-4; dx <= 4; dx++)
for(var dy=-4; dy <= 4; dy++){
  var sys = x+dx + (y+dy)*100;
  if(1 <= sys && sys <= 10000)
    systemsarround.text += sys + "'r";
}