0

質問は長すぎてタイトルに入れるには複雑すぎるので、ここで説明しようと思います。

ループは 4 つのオプション (1,2,3,q) を要求し、1 を入力すると、accounts[MAX] 配列にアカウント # を入力します。アカウントの合計インデックス番号が 10 を超える場合、入力は受け入れられなくなりますが、アカウント [5] とアカウント [11] のアカウント番号が同じ (両方とも 1400) の場合は、引き続き入力を受け入れます。2 つのアカウントが同じかどうか、および入力を許可するかどうかを確認するにはどうすればよいですか?

これまでの私のコード:

do
{
    printf ("Options Available: \n");
    printf ("\n 1 - Enter a transaction");
    printf ("\n 2 - View the general journal");
    printf ("\n 3 - View the balance sheet");
    printf ("\n q - Quit the program\n");

    printf ("\nPlease enter 1, 2, 3 or q: ");

    option = validateoption();

    if (option == '1' && totalinput >= MAXtrans)
        printf (" **Maximum number of transactions have been entered\n\n");

    if (option == '1')
    {
        printf ("\nEnter an account number (between 1000 and 3999): ");
        accounts[i] = validateaccount();
        printf ("\n");

        printf ("Enter d (debit) or c (credit): ");
        debcred[i] = validatedebcred();
        printf ("\n");

        printf ("Enter transaction amount: ");
        amount[i] = validateamount();
        printf ("\n");

        printf ("\n");

        i++;
        totalinput++;

    }

    if (option == '2')
        journal(accounts, debcred, amount, &totalinput);

    if (option == '3')
        balancesheet(accounts, debcred, amount, &totalinput);

} while (option != 'q');

したがって、アカウント[i]に10個のアカウントが入力されている場合、それ以上のアカウントは受け入れられませんが、アカウント#1400とアカウント[3]を入力するか、アカウント#1400もある場合、それらは同じであるため、その入力を受け入れますアカウントとアカウントの総数は同じです。

私の検証アカウント機能:

long validateaccount() {  // VALIDATE INPUT FOR ACCOUNT # IN TRANSACTION FUNCTION

    int keeptrying = 1, rc;
    long i;
    char after;

    do
    {
        rc = scanf ("%ld%c", &i, &after);

        if (rc == 0)
        {
            printf (" **Invalid input try again: ");
            clear();
        }
        else if (after != '\n')
        {
            printf (" **Trailing characters try again: ");
            clear();
        }
        else if (i < 1000 || i > 3999)
        {
            printf (" **Invalid input try again: ");
        }
        else
        {
                keeptrying = 0;
        }

    } while (keeptrying == 1);

    return i;

}

編集:これは、うまくいけばもっと明確に表示されるはずのサンプル出力です?

利用可能なオプション:

1 - トランザクションを入力します 2 - 一般仕訳帳を表示します 3 - 貸借対照表を表示します q - プログラムを終了します

1、2、3、または q: 1 を入力してください

口座番号を入力してください (1000 から 3999 の間) : 3999

d (借方) または c (貸方) を入力: d

取引金額を入力してください: 10000

利用可能なオプション:

1 - トランザクションを入力します 2 - 一般仕訳帳を表示します 3 - 貸借対照表を表示します q - プログラムを終了します

1、2、3、または q: 1 を入力してください

口座番号を入力してください (1000 から 3999 の間) : 3998 **最大口座数が入力されました

利用可能なオプション:

1 - トランザクションを入力します 2 - 一般仕訳帳を表示します 3 - 貸借対照表を表示します q - プログラムを終了します

1、2、3、または q: 1 を入力してください

口座番号を入力してください (1000 から 3999 の間) : 3999

d (借方) または c (貸方) を入力: c

取引金額を入力してください: 1000


つまり、最初に 3999 アカウント # が入力され、次に 3998 が入力されますが、3999 が入力された後、アカウントの最大数 (10 アカウントまたはアカウント [10]) がいっぱいになりましたが、3998 が入力された後、アカウント # 3999 が入力されました。再度入力すると、プログラムはその入力を受け入れました。それでもわからない場合は、もっと説明しようと思います!

4

1 に答える 1

0

入力されたアカウントの数を表す場合i(間違った状態を正しく管理したかどうかはわかりません)、変数が配列に格納されているjと考えて、要素の位置を表します。状態の更新。long intaccount

したがって、アカウント[i]に10個のアカウントが入力されている場合、それ以上のアカウントは受け入れられませんが、アカウント#1400とアカウント[3]を入力するか、アカウント#1400もある場合、それらは同じであるため、その入力を受け入れますアカウントとアカウントの総数は同じです。

if ( option == '1' )
{
    long int j;

    /* k represents position */
    int k;

    printf ("\nEnter an account number (between 1000 and 3999): ");

    /* If is the last try and the account is inside the array let's update it. */
    /* Pass by reference k. */
    if( ( i == 10 ) && ( isAccount( validateaccount(), &k ) == 1 ) ){ 
        accounts[ k ] = validateaccount();
        printf ("\n");

        printf ("Enter d (debit) or c (credit): ");
        debcred[ k ] = validatedebcred();
        printf ("\n");

        printf ("Enter transaction amount: ");
        amount[ k ] = validateamount();
        printf ("\n");
        printf ("\n");

        i++;
    }

    /* Pass by reference k. */
    else if( ( i == 10 ) && ( isAccount( validateaccount(), &k ) == 0 ) ){

        printf (" Your input isn't allowed cause the account is not in the list. \n");

    }

    else{
        accounts[ i ] = validateaccount();
        printf ("\n");

        printf ("Enter d (debit) or c (credit): ");
        debcred[ i ] = validatedebcred();
        printf ("\n");

        printf ("Enter transaction amount: ");
        amount[ i ] = validateamount();
        printf ("\n");
        printf ("\n");

        i++;
    }
}


/* I will think your array is a global variable, let's use a pass by reference function. */
int isAccount( long int a, int * k )
{
    int result = 0;
    int counter, j;

    for( counter = 0; counter < 11; counter++ ){
        if( accounts[ counter ] == a ){
            * k = counter;
            return 1;
        } 
    }
    return 0;
}

PD: 使用できますstructs。10 倍簡単だったでしょう。

于 2012-11-20T02:58:08.077 に答える