1

入力は、間にスペースを入れた整数ワード整数の形式にする必要があります。私は以下のコードを書きました。現在、コードのエラー チェック部分に取り組んでいます。

入力の形式が正しくない場合、どのようにチェックすればよいですか?

チェックする必要がある 3 つのエラー タイプの入力形式は、"WORD 99"、"10WORD 33"、および "10 WORD" です。

もう少し詳しく説明します。入力の形式は 10 READ 10 です。最初の整数 10 は、残りの入力が格納されるメモリ アドレスです。単語、またはこの場合は READ が命令です。convertOpCode 関数は、単語内の文字を照合して既知の命令と一致するものを見つけ、命令コードをオペレーション コード レジスタ (*operationCode) に保存します。2 番目の整数は、操作が使用するアドレスです。Read は、ユーザー入力をこの 2 番目の整数のアドレス位置に格納します。

現在、convertoOpCode 関数は最初のスペースを破棄し、スペースを読み取るまで次の文字を読み取ります。スペース間の文字が既知の操作と一致する場合、対応する操作コードを保存して戻ります。既知の操作が見つからない場合は、エラーをスローしてプログラムを終了します。

同様に、表示されている変数のみに制限されています。コンパイルの結果と表示されている5つのint変数を格納するためのint配列「メモリ」があります。他の配列やバッファを作成できません。

int compile( int memory[], int *accumulator, int *instructionCounter, 
    int *instructionRegister, int *operationCode, int *operand ){

while( scanf( "%d", accumulator) == 1 ){

    *instructionRegister = convertOpCode( instructionCounter, instructionRegister, operationCode, operand );
    if( *instructionRegister == 0 ){
        ERRORUC( accumulator );
    scanf( "%d", operand );
    if( *operationCode != 22 ){
        if( *operand > 99 ){
            ERROROPERAND( accumulator );
        memory[ *accumulator ] = ( ( *operationCode ) * 100 ) + ( *operand ); 
    }
    else{
        if( *operand > 9999 ){
            ERRORSET( accumulator );
        }
        memory[ *accumulator ] = *operand;
    }
}
checkHalt( memory, instructionCounter, accumulator );
print( memory );
return 0;

}

ここで要求されているのは、convertOpCode 関数がどのように見えるかです。

int convertOpCode( int *reg1, int* reg2, int* opCode, int* reg3 ){

    getchar();
    *reg1 = (int)getchar();
    *reg2 = (int)getchar();
    *reg3 = (int)getchar();
    *opCode = (int)getchar();

    switch( *reg1 ){
        case (int)'R':
            if( *reg2 == (int)'E' && *reg3 == (int)'A' && *opCode == (int)'D' ){
                *reg1 = (int)getchar();
                if( *reg1 == (int)' ' ){
                    *opCode = READ;
                    return 1;
                }else{
                    return 0;
                }
            }else{
               return 0;
            }
        case (int)'W'.....

}

4

1 に答える 1

0

オペコードの文字を読み取るために他のintを悪用しないと思います。私はタスクの要件を明確に正確に知りませんが、過去に C を教えたことがあります。別の方法がなければ、そのような要件は作成しません (ただし、上司は異なる場合があります :-))。

文字を読みながら解析して、許可された単語のツリーのようなケース構造を構築できると思います。たとえば、簡単に言うと、ASK MUL SUB という指示があるとします。

int getopcode()
{
    if (getchar()==' ') {  // ok, starting with space

        switch (getchar()) { 

            case 'A': // probably A(DD) but make sure ...
                if (getchar()=='D' && getchar()=='D') {
                    return 1; // opcode for ADD
                }
                break;


            case 'M': // probably M(UL) but make sure ...
                if (getchar()=='U' && getchar()=='L') {
                    return 2; // opcode for MUL
                }
                break;

            ....
        }
    }

    return 0;  // error if we arrive here. 
}

同じ文字 (ADD と ASK) で始まる操作がある場合、2 番目の文字に基づいて続行するには、「A」スイッチ内に 2 番目のスイッチをスタックする必要があります。

メインプログラムについては、エラーチェックを強化するために少しスケッチし直しました (ERRORUC のようなマクロのいくつかについてはわかりませんが、画像が得られると確信しています)。

while( scanf( "%d", accumulator) == 1 ){

    *instructionRegister = getopcode();
    if (*instructionRegister!=0) {

        if (scanf(" %d", operand )==1) {  // ok, one more decimal operand

            switch (*operationCode) {   // operand error checking per opcode

                case 22: 
                        if( *operand> 99 )
                            ERROROPERAND(accumulator);
                         break;

                default:
                        if( *operand > 9999 )
                            ERRORSET(accumulator);
                        break;
            }
        }
        else {
            // error reading 2nd operand
            ERRORUC( accumulator );
        }

    }
    else {
        // error in opcode
        ERRORUC( accumulator );
    }


    if ( no error set in accumulator, i.e. no ERRORxx macro called) {
         // accumulator, instructionRegister and operand are ok here
         // write to memory
    }
    else 
        break; // break the loop, end compiling
}

print( memory );
return 0;

エラーに基づいてループを中断するか、最初はループにならないようにするために何かを行う必要があります。

于 2013-06-03T21:38:28.587 に答える