0

私は C++ に非常に慣れていないので、すべての助けに感謝しています。私は基本的に単純な CPU をエミュレートする C++ プログラムを書くことを任されました。

私の全体的な目標は、ユーザーがさまざまな 3 桁の数字を、私が作成した「メモリ」と呼ばれる配列に入力することです。配列「メモリ」には 100 の利用可能な場所があり、ユーザーは利用可能な任意の場所に入力を読み込むことができます (配列のサイズは [100][2] です。最後の 2 桁を 1 つの数字として扱うためです)。

変数「programCounter」は、ユーザー入力が配列内に格納される開始位置を表します。したがって、たとえば、ユーザーが programCounter に値「20」を入力した場合、ユーザーの入力は配列の 21 番目の位置から入力が終了するまで格納されます。私が以下に書いたことは機能せず、「メモリ」へのユーザー入力のループは決して終わりません。ユーザーに値を配列に入力させ、ユーザーが入力を終了したことをプログラムに知らせるために何らかの終了コードを提供する別の方法はありますか?

これが私のコードです:

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

int main (void)
{
    string name;
    char inputCardResponse;
    ifstream inFile;
    ofstream outFile;
    int memory [100][2] = {001};     // sets the value of the first memory spot to "001"
    int inputCard [16][2];                      
    int outputCard [16][2];                     
    int instructionRegister;                    
    double accumulator;                         
    int programCounter;                        


    cout << "Hello! Welcome to Simple Computer Version 1.0.\nWhat is your name? \n";
    getline(cin, name);
    cout << "Thank you for using my Simple Comuter "<<name<<"!\n";
    cout << "Let's get started!\n";
    cout << "Below is the table of Opcodes and their functions:";
    cout << endl << endl;
    {
        cout << setw(9) << "|  Opcode" << setw(20) << setfill('-') << "Function" << setw(12) << "|" << endl;
        cout << setw(9) << "|  ------" << setw(20) << setfill(' ') << "-------" << setw(12) << "|" << endl;
        cout << setw(5) << "|  0_ _" << setw(20) << setfill('-') << "Input" << setw(14) << "|" << endl;
        cout << setw(5) << "|  1_ _" << setw(21) << setfill('-') << "Output" << setw(13) << "|" << endl;
        cout << setw(5) << "|  2_ _" << setw(18) << setfill('-') << "Add" << setw(16) << "|" << endl;
        cout << setw(5) << "|  3_ _" << setw(23) << setfill('-') << "Subtract" << setw(11) << "|" << endl;
        cout << setw(5) << "|  4_ _" << setw(22) << setfill('-') << "Load AC" << setw(12) << "|" << endl;
        cout << setw(5) << "|  5_ _" << setw(23) << setfill('-') << "Store AC" << setw(11) << "|" << endl;
        cout << setw(5) << "|  6_ _" << setw(19) << setfill('-') << "Jump" << setw(15) << "|" << endl;
        cout << setw(5) << "|  7_ _" << setw(22) << setfill('-') << "Test AC" << setw(12) << "|" << endl;
        cout << setw(5) << "|  8_ _" << setw(23) << setfill('-') << "Shift AC" << setw(11) << "|" << endl;
        cout << setw(5) << "|  9_ _" << setw(19) << setfill('-') << "Halt" << setw(15) << "|" << endl;
    }
    cout << endl << endl;

    //Input section
    cout << "Please plan your program out. This emulator requires the user to enter a starting value";
    cout << "for the program counter (typically cell 20 is chosen)\n";
    cout << "When you are ready, please enter the starting cell you have chosen for the program counter: ";
    cin >> programCounter;                      // Initializes the program counter value
    cout << "Now that you have chosen a starting cell, please start entering your program: \n";

    // This loop stores the user's program into the array named "memory". What happens if input<100??
    for(;programCounter < 100; programCounter++)
    {
        cin >> memory[programCounter][2];

    }

    cout << "Do you have any information to store in the input card?\n";
    cout << "(Please input uppercase Y for Yes or N for No \n";
    cin.get(inputCardResponse);
    if(inputCardResponse == 'Y')
    {
        cout << "There are 15 input slots available. Please keep this in mind when inputting: \n";
        for (int inputCounter=0; inputCounter < 15; inputCounter++)
        {
            cin >> inputCard[inputCounter][2];
        }
    }
    else{
        cout << "Most programs require inputs.\n";
        cout << "Please come back when you are ready with a file!\n";
    }
    return 0;

}
4

2 に答える 2

0

この答えはあなたの問題を解決しませんが、あなたを道に導きます. また、これは次のコメントへの応答です。

@crayzeewulf - ユーザーは 3 桁の数字 (345 など) を入力します。最初の数字「3」はオペコードを表し、残りの数字「45」は操作する値、または配列「メモリ」内のスポットの位置を表します。そのため、配列を 100 行 2 列にすることを考えていました。これを達成する別の方法はありますか?ありがとうございました!

元の質問の意味がわかりました。ただし、演​​算子を使用して変数に値を代入したり、変数に値を読み取ったりする>>と、期待どおりに動作しません。次のように配列を宣言すると、次のようになります。

int memory[100][2] ;

100 行 2 列のテーブルに配置されると想像できる 200 個の整数にスペースを割り当てています。最初の行のインデックスは 0 で、最初の列のインデックスは 0 です。最後の行のインデックスは 99 で、最後の列のインデックスは 1 です。

       +------------+------------+
       |  Column 0  |  Column 1  |
       +------------+------------+
Row  0 |            |            |
       +------------+------------+
Row  1 |            |            |
       +------------+------------+
                   ...
       +------------+------------+
Row 99 |            |            |
       +------------+------------+

このテーブルの各セルには、値のみを格納できintます。memory[][]次のようなステートメントを使用して初期化する場合(理由により123代わりに使用しています。後でコメントを参照してください)。001

int memory[100][2] = {123} ;

プログラムは単純に整数123を行 0 の列 0 に入れます。

       +------------+------------+
       |  Column 0  |  Column 1  |
       +------------+------------+
Row  0 |    123     |      0     |
       +------------+------------+
Row  1 |      0     |      0     |
       +------------+------------+
                   ...
       +------------+------------+
Row 99 |      0     |      0     |
       +------------+------------+

1コンパイラまたは結果のプログラムは、数値をとに分割する必要があることを知る方法がありません23。例えば、1行目の列0や列1には入れません。これを行う方法を自分で考え出す必要があります。123

元のコードに戻ると、値を使用し001て配列を初期化しました。

int memory[100][2] = {001} ;

C++ では、で始まる整数リテラルの扱いが0大きく異なります。リテラルに先頭0があると、C/C++ コンパイラはリテラルを8 進数値として扱います。そのため、先頭にゼロがあるリテラルを記述するときは十分に注意してください。たとえば、C++ では012is not equal toです。12

最後に、この表の列 2 に何かを入力しようとすると、多くの問題が発生します。テーブルには列 0 と 1 のみが含まれます。存在しない列 2 に値を配置しようとすると、プログラムで使用されているメモリ内の予期しない場所に値が配置される場合があります。この場合、プログラムの動作は予測できず、予想とはまったく異なる可能性が高くなります。

C++ を学習しようとしている場合は、配列と変数がどのように機能するかについて、ここにリストされている 1 つまたは複数の本を読むことをお勧めします。基本的な概念をよりよく理解したら、より高度なアプリケーション固有の概念を学習するための優れた方法は、同様のことを行う既存のコードを調べることです。Google や StackOverflow で同様のコードを検索すると、この課題に取り組む方法がいくつか見つかります。見つけたコードを注意深く調べ、理解していることを確認し、実行し、可能であれば微調整して何が起こるかを確認します。この追加の知識で武装したので、独自のコードをゼロから作成します。答えが得られることを願っています。また、これの提案に従うことを強くお勧めしますSOで質問する前に答えてください。:) 乾杯!

于 2013-11-07T05:43:29.840 に答える