AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77009397
Accepted
orbitalv
orbitalv
Asked: 2023-08-30 23:22:05 +0800 CST2023-08-30 23:22:05 +0800 CST 2023-08-30 23:22:05 +0800 CST

Escreva um programa LMC que calcule a soma dos números inseridos pelo usuário. Exibir soma antes de parar

  • 772

Estou tentando resolver este desafio de código:

Escreva um programa LMC que calcule a soma dos números fornecidos pelo usuário. Exiba a soma como saída antes de interromper o programa. Se o usuário forneceu menor ou igual a dez valores de entrada, some apenas os números pares. Os números ímpares são ignorados. Se o usuário tiver fornecido mais de dez valores, some apenas os números ímpares subsequentes à décima entrada. A soma existente de números pares permanecerá. Se o usuário inserir zero, em qualquer ponto, o somatório será exibido.

Por exemplo:

Valores de entrada: 3, 3, 4, 0
Resultado: 4

Valores de entrada: 2, 3, 7, 0
Resultado: 2

Valores de entrada: 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 0 Resultado:
43

Aqui você pode ver uma execução do meu programa com a entrada do primeiro exemplo e mostra a saída como 0 (em vez do 4 esperado):

insira a descrição da imagem aqui

Não tenho certeza do que há de errado com o código para fornecer essa saída errada. Onde está o meu erro?

Código:

start
             INP
             STA input
             BRZ halt
             LDA inputCounter

             SUB ten
             BRP afterTen

// Input <= 10
             LDA input
             STA isEven
             SUB one
             BRP oddNumber
             LDA isEven
             ADD one

             STA isEven
             SUB two
             BRZ evenNumber
oddNumber    LDA inputCounter
             ADD one
             STA inputCounter
             BRA start

evenNumber   LDA input
             ADD evenSum
             STA evenSum
             LDA inputCounter
             ADD one
             STA inputCounter
             BRA start

// Input > 10
afterTen     LDA input
             STA isEven
             SUB one
             BRP evenAfterTen
             LDA isEven
             ADD one
             STA isEven
             SUB two
             BRZ oddAfterTen
evenAfterTen LDA inputCounter
             ADD one
             STA inputCounter
             BRA start

oddAfterTen  LDA input
             ADD oddSum
             STA oddSum
             LDA inputCounter
             ADD one
             STA inputCounter
             BRA start

// Display sum
halt         LDA evenSum
             ADD oddSum
             OUT
             HLT
// Variables
evenSum      DAT 0
oddSum       DAT 0
inputCounter DAT 0
isEven       DAT 0
input        DAT 0
// Constants
one          DAT 1
two          DAT 2
ten          DAT 10
algorithm
  • 1 1 respostas
  • 48 Views

1 respostas

  • Voted
  1. Best Answer
    trincot
    2023-08-31T01:33:48+08:002023-08-31T01:33:48+08:00

    O problema está na parte que verifica se um número é par. Esse código primeiro subtrairá 1 e, se essa instrução não levar a um overflow negativo, conclui-se que o número é ímpar! Obviamente, isso não é (sempre) verdade. Por exemplo, se você começar com 2, concluirá erroneamente que é estranho.

    Para testar se um número é ímpar, você precisaria (sob as limitações do LMC) de um loop onde subtrai repetidamente o número 2 até chegar a zero ou obter um estouro negativo.

    Como você tem um código semelhante na segunda metade do seu código, o problema se repete lá também.

    Aqui está uma correção:

    #input: 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 0
    start        INP
                 STA input
                 BRZ halt
                 LDA inputCounter
    
                 SUB ten
                 BRP afterTen
    
    // First ten inputs:
                 LDA input
    repeat1      STA isEven
                 SUB two        # subtract 2
                 BRP continue   
                 BRA oddNumber  # negative overflow! => result was -1, input is odd
    continue     BRZ evenNumber # zero => input is even
                 BRA repeat1    # neither: continue to subtract 2...
    
    evenNumber   LDA input
                 ADD evenSum
                 STA evenSum
    oddNumber    LDA inputCounter
                 ADD one
                 STA inputCounter
                 BRA start
    
    // From 10th input onwards:
    afterTen     LDA input
    repeat2      STA isEven
                 SUB two
                 BRP continue2
                 BRA oddAfterTen
    continue2    BRZ evenAfterTen
                 BRA repeat2
    oddAfterTen  LDA input
                 ADD oddSum
                 STA oddSum
    evenAfterTen LDA inputCounter
                 ADD one
                 STA inputCounter
                 BRA start
    
    // Display sum
    halt         LDA evenSum
                 ADD oddSum
                 OUT
                 HLT
    // Variables
    evenSum      DAT 0
    oddSum       DAT 0
    inputCounter DAT 0
    isEven       DAT 0
    input        DAT 0
    // Constants
    one          DAT 1
    two          DAT 2
    ten          DAT 10
    
    
    <script src="https://cdn.jsdelivr.net/gh/trincot/[email protected]/lmc.js"></script>

    Observações

    1. Não há necessidade de um arquivo evenSume oddSum. Você pode simplesmente adicionar ao mesmo arquivo sum.

    2. Há alguma repetição de código: dois trechos de código realizam um teste par/ímpar. Você pode evitar essa repetição adicionando 1 ao isEvenlidar com as entradas após as dez primeiras, e então você pode usar o mesmo código para realizar o teste ímpar/par, pois adicionando 1 você inverte o resultado.

    3. Como o Little Man Computer possui um recurso de redefinição, que reinicia o programa sem redefinir o conteúdo da caixa de correio para seus valores originais (incluindo DAT), você obteria uma saída inconsistente, pois em particular as "variáveis" evenSume oddSumnão seriam redefinidas. Para evitar isso, adicione instruções para definir a(s) soma(s) como zero logo no início do programa.

    Aqui está o código com essas melhorias:

    #input: 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 0
                 LDA zero
                 STA sum   # To avoid problems after LMC-reset
    start        INP
                 STA input
                 BRZ halt
                 LDA inputCounter
    
                 SUB ten
                 BRP afterTen
                 
                 LDA input
                 BRA testeven
                 
    afterTen     LDA input
                 ADD one  # By adding one, we inverse the odd/even test
    
    testeven     STA isEven
                 SUB two        # subtract 2
                 BRP continue   
                 BRA oddNumber  # negative overflow! => result was -1, input is odd
    continue     BRZ evenNumber # zero => input is even
                 BRA testeven   # neither: continue to subtract 2...
    
    evenNumber   LDA input
                 ADD sum
                 STA sum
    oddNumber    LDA inputCounter
                 ADD one
                 STA inputCounter
                 BRA start
    
    // Display sum
    halt         LDA sum
                 OUT
                 HLT
    // Variables
    sum          DAT 0
    inputCounter DAT 0
    isEven       DAT 0
    input        DAT 0
    // Constants
    zero         DAT 0
    one          DAT 1
    two          DAT 2
    ten          DAT 10
    
    
    <script src="https://cdn.jsdelivr.net/gh/trincot/[email protected]/lmc.js"></script>

    • -1

relate perguntas

  • Como determinar os estados alcançáveis ​​no problema de 3 jarras de água?

  • Encontre o número de pares de números naturais de l a r que bit a bit AND é igual a 0

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve