0

我需要从最小到最大对五个数字进行排序。

我一直在为这个小人电脑模拟器的任务而苦苦挣扎。我尝试添加更多循环来添加 2 个输入数字,但它从未奏效。

3个数字的工作分拣机:

         INP        // Read in the first value
         STA 91     // store it
         INP        // Read in the second value
         STA 92     // store it
         INP        // Read in the third value
         STA 93     // store it
         LDA 92     // LOOP 1, STEP 1:  
         SUB 91     // 
         BRP STEP2  // if r91 and r92 are in order, don't swap them
         LDA 92     // Begin swapping registers
         STA 99     // temp = r92
         LDA 91
         STA 92     // r92 = r91
         LDA 99
         STA 91     // r91 = temp
STEP2    LDA 93     // LOOP 1, STEP 2
         SUB 92
         BRP STEP3  // If r92 and r93 are in order, don't swap them
         LDA 93     // Begin swapping registers
         STA 99     // temp = r93
         LDA 92
         STA 93     // r93 = r92
         LDA 99
         STA 92     // r92 = temp
STEP3    LDA 92     // LOOP 2, STEP 1
         SUB 91
         BRP STEP4  // if r91 and r92 are in order, don't swap them
         LDA 92     // Begin swapping registers
         STA 99     // temp = r92
         LDA 91
         STA 92     // r92 = r91
         LDA 99
         STO 91     // r91 = temp
STEP4    LDA 91     // Write out the sorted values 
         OUT
         LDA 92
         OUT
         LDA 93
         OUT
         HLT        // stop
4

1 回答 1

0

现有代码具有三个用于比较和潜在交换的步骤。第一步比较前两个值,第二步比较后两个值,第三步和第一步一样:再次比较前两个值。

当您输入 5 个值时,您需要一个循环,否则您无法在可用的 100 个邮箱中进行所有必要的比较。为此,您可以使用冒泡排序之类的算法,该算法还比较相邻的值对:

  • 第 1 步:比较值 1 和 2
  • 第 2 步:比较值 2 和 3
  • 第 3 步:比较值 3 和 4
  • 第 4 步:比较值 4 和 5

每个步骤的代码就像您已经拥有它一样,除了您还将记下是否执行了交换。这表明上述所有步骤都需要再次重复。

你所包含的代码没有使用标签,确实很遗憾注释需要给数字命名,而大多数LMC模拟器都支持标签。

以下是它的工作原理:

#input: 5 3 4 2 1
        INP
        STA NUM1
        INP 
        STA NUM2
        INP
        STA NUM3
        INP 
        STA NUM4
        INP
        STA NUM5
BEGIN   LDA ZERO
        STA DIRTY
        LDA NUM2
        SUB NUM1
        BRP STEP2
        LDA ONE
        STA DIRTY
        LDA NUM1
        STA TEMP
        LDA NUM2
        STA NUM1
        LDA TEMP
        STA NUM2
STEP2   LDA NUM3
        SUB NUM2
        BRP STEP3
        LDA ONE
        STA DIRTY
        LDA NUM2
        STA TEMP
        LDA NUM3
        STA NUM2
        LDA TEMP
        STA NUM3
STEP3   LDA NUM4
        SUB NUM3
        BRP STEP4
        LDA ONE
        STA DIRTY
        LDA NUM3
        STA TEMP
        LDA NUM4
        STA NUM3
        LDA TEMP
        STA NUM4
STEP4   LDA NUM5
        SUB NUM4
        BRP CHECK
        LDA ONE
        STA DIRTY
        LDA NUM4
        STA TEMP
        LDA NUM5
        STA NUM4
        LDA TEMP
        STA NUM5
CHECK   LDA DIRTY
        BRZ OUTPUT
        BRA BEGIN
OUTPUT  LDA NUM1
        OUT
        LDA NUM2
        OUT
        LDA NUM3
        OUT
        LDA NUM4
        OUT
        LDA NUM5
        OUT
        HLT
NUM1    DAT
NUM2    DAT
NUM3    DAT
NUM4    DAT
NUM5    DAT
DIRTY   DAT
TEMP    DAT
ONE     DAT 001
ZERO    DAT 000

<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>

于 2021-04-26T16:41:45.017 回答