在我的C ++程序中寻找一些输入。 Simpletron,机器语言

时间:2010-03-09 20:00:05

标签: c++ machine-language

编辑:所以,我的编码中似乎确实存在问题。每当我运行程序并输入变量时,它总是返回相同的答案。“位置76的内容为0。

好的伙计们,几天前我在这里发布了一个关于一个问题的帖子,但这只是一个编译错误,所以如果这看起来很熟悉,那就是原因。我会重申,我是编程的新手,我不是最好的,所以我要求简单。这也是一个SML程序。无论如何,这是一个家庭作业,我想要一个好成绩。所以我一直在寻找输入并确保这个程序会做我希望他们正在寻找的东西。无论如何,这是说明: 编写SML(Simpletron机器语言)程序来完成以下每项任务:

A)使用哨兵控制的循环读取正数s并计算并打印它们的总和。输入neg数时终止输入。 B)使用反控制循环读取七个数字,一些是正数,一些是负数,并计算+打印平均值。 C)读取一系列数字,并确定并打印最大数字。读取的第一个数字表示应处理多少个数字。

没有进一步的到期,这是我的计划。一起来。

计划A

#include <iostream>
using namespace std;

int main()
{
 int memory[100]; //Making it 100, since simpletron contains a 100 word mem.

 int operation; //taking the rest of these variables straight out of the book seeing as how they were italisized.

 int operand;

 int accum = 0; // the special register is starting at 0

 int j;

 for (j = 0; j < 100; j++ ) //Simply stating that for int j is = to 0, j must be less than 100 because that is the memory limit, and for every pass-through, increment j.
  memory[j] = 0;


 // This is for part a, it will take in positive variables in a sent-controlled loop and compute + print their sum. Variables from example in text.
 memory [00] = 1010;

 memory [01] = 2009;

 memory [02] = 3008;

 memory [03] = 2109;

 memory [04] = 1109;

 memory [05] = 4300;

 memory [06] = 1009;

 j = 0; //Makes the variable j start at 0.

 while ( true )
 {

  operand = memory[ j ]%100; // Finds the op codes from the limit on the memory (100)
  operation = memory[ j ]/100;

  //using a switch loop to set up the loops for the cases
  switch ( operation ){
   case 1: //reads a variable into a word from loc. Enter in -1 to exit
    cout <<"\n Input a positive variable:  ";
    cin >> memory[ operand ]; break;

   case 2: // takes a word from location
    cout << "\n\nThe content at location " << operand   << "is " << memory[operand]; break;

   case 3:// loads
    accum = memory[ operand ]; break;

   case 4: //stores
    memory[ operand ] = accum; break;

   case 5: //adds
    accum = accum + memory[ operand ]; break;


   case 6: // subtracts
    accum = accum - memory[ operand ]; break;

   case 7: //divides
    accum = accum / (memory[ operand ]); break;

   case 8: // multiplies
    accum = accum*memory [ operand ]; break;

   case 9: // Branches to location
    j = -1; break;

   case 10: //branches if acc. is < 0
    if (accum < 0)
    j = 5; 
    break;

   case 11: //branches if acc = 0
    if (accum == 0)
     j = 5; 
    break;

   case 12: // Program ends
    exit(0); break;
 }
 j++;
 }
return 0;
}

计划B

//Part b finding the sum + avg.

int main()
{
 int mem[100];
 int operation;
 int operand;
 int accum = 0;
 int pos = 0;

 int j;

 for (j = 0; j < 100; j++ ) 
  memory[j] = 0;

 mem[22] = 7; // loop 7 times
 mem[25] = 1; // increment by 1

 mem[00] = 4306;

 mem[01] = 2303;

 mem[02] = 3402;

 mem[03] = 6410;

 mem[04] = 3412;

 mem[05] = 2111;

 mem[06] = 2002;

 mem[07] = 2312;

 mem[08] = 4210;

 mem[09] = 2109;

 mem[10] = 4001;

 mem[11] = 2015;

 mem[12] = 3212;

 mem[13] = 2116;

 mem[14] = 1101;

 mem[15] = 1116;

 mem[16] = 4300;

 j = 0;

 while ( true )
 {

  operand = memory[ j ]%100; // Finds the op codes from the limit on the memory (100)
  operation = memory[ j ]/100;

  //using a switch loop to set up the loops for the cases
  switch ( operation ){
   case 1: //reads a variable into a word from loc. Enter in -1 to exit
    cout <<"\n enter #:  ";
    cin >> memory[ operand ]; break;

   case 2: // takes a word from location
    cout << "\n\nThe content at location " << operand   << "is " << memory[operand]; break;

   case 3:// loads
    accum = memory[ operand ]; break;

   case 4: //stores
    memory[ operand ] = accum; break;

   case 5: //adds
    accum = accum + memory[ operand ]; break;


   case 6: // subtracts
    accum = accum - memory[ operand ]; break;

   case 7: //divides
    accum = accum / (memory[ operand ]); break;

   case 8: // multiplies
    accum = accum*memory [ operand ]; break;

   case 9: // Branches to location
    j = operand; break;

   case 10: //branches if acc. is < 0

    break;

   case 11: //branches if acc = 0
    if (accum == 0)
     j = operand; 
    break;

   case 12: // Program ends
    exit(0); break;
 }
 j++;
 }
return 0;
}

计划C

///Part c
int main()
{
 int mem[100];
 int operation;
 int operand;
 int accum = 0;


 int j;

 for (j = 0; j < 100; j++ ) //Simply stating that for int j is = to 0, j must be less than 100 because that is the memory limit, and for every pass-through, increment j.
  memory[j] = 0;

 mem[23] = 1; //decrements 1 place in mem

 mem[0] = 1030; // Takes in # of values to be stored.

 mem[01] = 4123; // These 4 memory slots check for the largest variable then store
 mem[02] = 4134;
 mem[03] = 1011;
 mem[04] = 3204;

 mem[05] = 4005; // These 5 decrement the count+ store + branch.
 mem[06] = 4006;
 mem[07] = 4007;
 mem[08] = 4008;
 mem[09] = 4009;

 mem[10] = 4010;
 mem[11] = 4311; // exits

 j = 0; // this is the starting value..

 while ( true )
 {

  operand = memory[ j ]%100; // Finds the op codes from the limit on the memory (100)
  operation = memory[ j ]/100;

  //using a switch loop to set up the loops for the cases
  switch ( operation ){
   case 1: //reads a variable into a word from loc. Enter in -1 to exit
    cout <<"\n enter #:  ";
    cin >> memory[ operand ]; break;

   case 2: // takes a word from location
    cout << "\n\nThe content at location " << operand   << "is " << memory[operand]; break;

   case 3:// loads
    accum = memory[ operand ]; break;

   case 4: //stores
    memory[ operand ] = accum; break;

   case 5: //adds
    accum = accum + memory[ operand ]; break;


   case 6: // subtracts
    accum = accum - memory[ operand ]; break;

   case 7: //divides
    accum = accum / (memory[ operand ]); break;

   case 8: // multiplies
    accum = accum*memory [ operand ]; break;

   case 9: // Branches to location
    j = operand; break;

   case 10: //branches if acc. is < 0

    break;

   case 11: //branches if acc = 0
    if (accum == 0)
     j = operand; 
    break;

   case 12: // Program ends
    exit(0); break;
   case 13: // checks > than
    if (accum < mem[operand])
     accum = mem[operand];
    break;
  }
 j++;
 }
return 0;
}

5 个答案:

答案 0 :(得分:1)

  • int memory[100] = {0};将内存定义为int的数组,并将其所有元素初始化为0.然后,您将不需要for循环。
  • 您可以使用简写表示法。例如accum += memory[operand];代替accum = accum + memory[operand];。这种方式更具可读性。

答案 1 :(得分:1)

您的代码中包含魔术数字。你应该做的事情如下:

const int OP_LOAD = 3;
const int OP_STORE = 4;
const int OP_ADD = 5;
...

const int OP_LOCATION_MULTIPLIER = 100;

mem[0] = OP_LOAD * OP_LOCATION_MULTIPLIER + ...;
mem[1] = OP_ADD * OP_LOCATION_MULTIPLIER + ...;

operand = memory[ j ] % OP_LOCATION_MULTIPLIER;
operation = memory[ j ] / OP_LOCATION_MULTIPLIER;

答案 2 :(得分:1)

 mem[09] = 4009;

哪个八进制数恰好是09? :)

编辑:对于程序A(以及其他内容),您可能会发现在打开switch语句之前打印出“操作数”和“操作”变量的信息。输出:

Operand: 10 Operation: 10
Operand: 9 Operation: 20
Operand: 8 Operation: 30
Operand: 9 Operation: 21
Operand: 9 Operation: 11
Operand: 9 Operation: 10
Operand: 0 Operation: 0
Operand: 0 Operation: 0
... *LOTS of lines omitted....
Operand: 0 Operation: 0
Operand: -97 Operation: -9498072
Operand: 0 Operation: 0
Operand: 88 Operation: 20898776
Operand: 12 Operation: 0
Operand: 8 Operation: 22856
Operand: 69 Operation: 20898775

代码在switch()之前运行了近1300次,最后要求用户输入。在我看来,当操作数= 0时,程序A会脱轨,当你点击这一行时就会发生这种情况:memory [05] = 4300;

答案 3 :(得分:0)

我建议尝试通过使用函数使程序更加模块化。我假设你被介绍给他们了。

初始化(将存储器清零为零)和解释器是要成为函数的主要候选者。所有示例的这些功能都相同(即通用)。在这两种情况下,唯一的函数参数是memory

我认为结合@R Samuel Klatchko的建议会使程序更容易为自己和标记阅读。

最后,对于“额外信用”,我建议您在存储到内存之前验证用户的输入(来自cin)。例如确保它是适当范围内的正整数。这个输入&amp;验证可以用到自己的函数中,以避免在程序中嵌套太深。

我不知道,但我怀疑程序A错误地将固定地址分支到指令1011上。

答案 4 :(得分:0)

现在已超过2岁了,因此不再使用你的任务,但其他人可能会在这里结束,所以这里......

这个问题的线索在你的第一段中,结束了:

  

“编写SML(Simpletron机器语言)程序来完成以下任务:[原文如此]”

关键词是“编写SML程序......” - 您试图编写C ++程序,这不太可能为您赢得许多作业。

我相信这个作业起源于Deitel&amp; Deitel的书“C:如何编程”。在他们的书中,他们提出了一个非常简单的机器模拟器,Simpletron,作为练习。 SML是这种假想计算机的机器语言。在介绍了机器及其语言后,练习首先要求学生用SML编写一些简单的程序。之后,学生被要求在C中构建Simpletron。