1

Тема: РАМ віртуальна машина

РАМ virtual machine. Програмування та оцінювання.

  1. Написати програму для РАМ, яка читає n додатніх чисел, обмежених 0 і друкує їх у порядку неспадання.

  2. Написати програму для РАМ, яка допускає всі входи виду   0.

  3. Написати програму для РАМ, яка обчислює    з часовою оцінкою О( ) при рівномірному ваговому критерії.

  4. Написати програму для РАМ із використанням непрямої адресації, яка вводить масив.

  5. Написати програму на РАСП, яка підраховує кількість від’ємних чисел на вході (подано  n чисел)

Почав виконувати перше завдання та стикнувся з нехваткою досвіду чи що
Написав код

filename = "instructions.txt"

# Open the file in read mode
with open(filename, 'r') as file:
    # Read the content of the file and split it into lines
    lines = file.readlines()

# Initialize variables
n = None
count = 0
i = 1
tmp = 0
x = 0
numbers = []

# Loop through the lines of the file
while i <= len(lines):
    # Split the line into instruction and argument
    parts = lines[i - 1].split()
    inst = parts[0]
    arg = parts[1] if len(parts) > 1 else None

    # Execute the instruction
    if inst == "LOAD":
        if arg == "n":
            tmp = n
        elif arg == "count":
            tmp = count
        elif arg == "i":
            tmp = i
        elif arg == "tmp":
            tmp = tmp
        elif arg == "x":
            tmp = x
        elif arg is not None:
            tmp = int(arg)
    elif inst == "STORE":
        if arg == "count":
            count = tmp
        elif arg == "i":
            i = tmp
        elif arg == "tmp":
            tmp = tmp
    elif inst == "READ":
        if n is None:
            n = int(input("Enter the value of n: "))
        else:
            x = int(input("Enter a value for x: "))
            numbers.append(x)
            count += 1
            if count == n:
                numbers.sort()
                print(numbers)
                break
            else:
                tmp = x
    elif inst == "ADD":
        tmp += int(arg)
    elif inst == "SUB":
        tmp -= int(arg)
    elif inst == "JZERO":
        if tmp == 0:
            i += int(arg)
        else:
            i += 1
    elif inst == "JGTZ":
        if tmp > 0:
            i += int(arg)
        else:
            i += 1
    elif inst == "WRITE":
        print(tmp)
    elif inst == "HALT":
        break

    # Increment the instruction pointer
    i += 1

У текстовий файл завантажив інструкції

# Read the value of n
LOAD n
READ
STORE n

# Loop through the input values and sort them
LOOP1:
    LOAD n
    SUB i
    JZERO END1
    STORE flag
    LOAD n
    ADD i
    LOAD j
    SUB i
    ADD i
    JZERO END2
    STORE tmp
    LOAD n
    ADD j
    STORE n
    LOAD tmp
    SUB j
    ADD j
    STORE n
    LOAD flag
    STORE tmp
    LOAD i
    ADD j
    STORE i
    LOAD tmp
    STORE j
    JUMP LOOP1

# Print the sorted values
LOOP2:
    LOAD n
    SUB i
    JZERO END3
    LOAD n
    WRITE
    LOAD i
    ADD 1
    STORE i
    JUMP LOOP2

# Halt the program
END1:
END2:
END3:
HALT

Прошу допомогти та поправити код (можливо інструкції)

2

Re: РАМ віртуальна машина

А можна якесь посилання на цю РАМ virtual machine?

Подякували: leofun011

3

Re: РАМ віртуальна машина

РАМ - рівнодоступна адресна машина
Потрібно на Python реалізуваи принцип її роботи
є набір правил і тд

4

Re: РАМ віртуальна машина

РАМ якось пройшли повз мене при навчанні; але з того, що я зараз нагуглив, ніби випливає, що в РАМ немає однозначного набору команд, це теоретична модель. Тобто може ваші команди і підійдуть, я не можу так сказати.
Те, що бачу:

  • умови побилися, що в п.2 і 3, незрозуміло;

  • РАМ не вміє вводити, як Python, вона просто читає наступне число з потоку введення, а у вас там якийсь вибір, як саме запитувати; все ж таки моделюєте РАМ - то моделюйте РАМ.

  • немає обробки команди JUMP.

  • команди умовного переходу роблять щось дивне (перехід на відносну адресу) і чомусь додатково змінюють i (в гілках else).

Вам варто перед виконанням програми перебрати її, знайти рядки з мітками переходів (на кшталт END1:) і, можливо, повикидати коментарі та переробити інструкції на об'єкти для швидшої обробки.