-1

Cで次の課題を完了する必要があります。

ユーザーに 2 つの正の整数の入力を求める関数を作成し、これら 2 つの数値 (a と b など) を読み取り、ユーザーが 2 つの数値を入力するまで入力を求め続けます。この関数は、呼び出された場所に両方の数値を返します。

ここで少し混乱しています。関数から 2 つの値を入力するようユーザーに求めるにはどうすればよいでしょうか? これは main() 関数からしかできませんか? 現在、次の機能コードがあります。正常に動作しますが、もちろん外部関数でこれが必要です。

#include <stdio.h>

int main() {

int a(2); // initialize just as some positive number so as not to set off negative alert.
int b(2);
printf("Enter two positive numbers: \nFirst: ");
do {
    if (a <= 0 || b <= 0) { // negative alert
        printf("Woops. Those are negative. Try again. \nFirst: ");
    }
    scanf(" %d", &a);
    printf("Second: ");
    scanf(" %d", &b);
    printf("\n");
} while (a <= 0 || b <= 0);

return(0);
}
4

3 に答える 3

2

関数 (oop のメソッド)cc++(実際には、私が知っている他のすべてのプログラミング言語で) は、1 つの値しか返すことができません。両方の値を保持する構造体を使用し、関数からそれを返します

#include<stdio.h>
#include<stdlib.h>

typedef struct two_ints {
    int a, b;
} two_ints_t;

two_ints_t read_two_ints();

two_ints_t read_two_ints() {
    two_ints_t two_ints;
    two_ints.a = 0;
    two_ints.b = 0;
    char tmp[32] = "";
    printf("Enter two positive numbers: \nFirst: ");
    do {
        scanf(" %s", tmp);
        two_ints.a = atoi(tmp);
        printf("Second: ");
        scanf(" %s", tmp);
        two_ints.b = atoi(tmp);
        printf("\n");
        if (two_ints.a <= 0 || two_ints.b <= 0) { // negative alert
            printf("Woops. Those are negative. Try again. \nFirst: ");
        }
    } while (two_ints.a <= 0 || two_ints.b <= 0);

    return two_ints;
}

int main() {
    two_ints_t two_ints = read_two_ints();
    printf("a=%i, b=%i\n", two_ints.a, two_ints.b);
    return 0;
}
于 2013-03-07T18:00:03.840 に答える
1

誰も言及しなかったトリックの 1 つは、関数から複数の値を返す別の方法は、ポインターをパラメーターとして渡すことです。これを行う一般的な関数は scanf です。

int x,y;
scanf("%d %d", &x, &y);

このコードは、scanf が 2 つの値を返し、それらを x と y に割り当てるものとして見ることができます。

于 2013-03-07T18:09:19.027 に答える
1

唯一の特別なmain点は、アプリケーションのエントリ ポイントであることです。いつでも好きなときに好きなように呼び出すことができます1。命令ポインタがエントリ ポイントの最初の命令に到達すると、それ以降はすべてオペコードのストリームになります。ジャンプ以外の「機能」を持っているという事実について特別なことは何もありません。それらをすべてインライン化することもできます。

コードを別のメソッドに押し込むと、情報の受け渡しに違いが生じるだけです。

/* this signature will change if you need to pass/return information */
void work()
{
    int a = 2; /* did you really mean C++? */
    int b = 2;
    printf("Enter two positive numbers: \nFirst: ");
    do {
        if (a <= 0 || b <= 0) { /* negative alert */
            printf("Woops. Those are negative. Try again. \nFirst: ");
        }

        scanf(" %d", &a);
        printf("Second: ");
        scanf(" %d", &b);
        printf("\n");
    } while (a <= 0 || b <= 0);
}

次のように呼び出されます。

int main(int argc, char **argv)
{
    work(); /* assuming it is defined or declared above us */

    return 0;
}

1. 「なんでも」と「いつでも」の合理的な定義について。

于 2013-03-07T17:56:43.533 に答える