1

構造体とポインターを使用して、2 つの有理数の加算、乗算、除算を求めるプログラムを作成していました。ポインタで数字を入力するのに問題があります。コードをどのように修正すればよいですか? ありがとう!

#include <stdio.h>
struct rational
{
    int nu;
    int de;
}*p1,*p2,*p3;
struct rational add()
{
    p1->nu = p1->nu*p2->de + p1->de*p2->nu;
    p3->de = p1->de * p2->de;
    printf("%d\n--\n%d\n",p3->nu,p3->de);
}
struct rational multiply()
{
    p3->nu = p1->nu * p2->nu;
    p3->de = p1->de * p2->de;
    printf("%d\n--\n%d\n",p3->nu,p3->de);
}
struct rational divide()
{
    p3->nu = p1->nu * p2->de;
    p3->de = p1->de * p2->nu;
    printf("%d\n--\n%d\n",p3->nu,p3->de);
}
int main()
{
    int a,b,choice;
    printf("Enter the first rational number.\n");
    scanf("%d%d",&p1->nu,&p1->de);
    printf("Enter the second rational number.\n");
    scanf("%d%d",&p2->nu,&p2->de);
    scanf("%d",&choice);
    switch (choice)
    {
        case 1: add();
                break;
        case 2: multiply();
                break;
        case 3: divide();
                break;
    }
    return 0;
}
4

3 に答える 3

2
  1. へのポインターを宣言しましstruct rationalたが、そのような構造体を実際に指すようにそれらを割り当てていません。例えば:

    struct rational rat_a;
    p1 = & rat_a;
    
  2. struct rational関数を返す(つまり)として宣言しますstruct rational add()が、何も返さないようです。関数が何も返さない場合は、void として宣言する必要があります -void add()

  3. 構造体自体ではなく、構造体へのポインターを使用するのはなぜですか? (コードのようにグローバルに宣言されている場合)

于 2013-04-20T01:32:33.197 に答える
1

構造体自体ではなく、構造体へのポインターを宣言します。構造体へのポインターは、構造体のアドレスを保持できますが、作成しません。ポインターがそれを指すようにするには、構造が必要です。

struct rational
{
    int nu;
    int de;
}*p1,*p2,*p3;

この部分は、構造体への 3 つのポインターを作成します。彼らは今、何も指していません。次のような実際の構造を作成する必要があります

struct rational structure1, structure2, structure3;

これで、ポインタに値を割り当てることができます:

p1=&structure1;
p2=&structure2;
p3=&structure3;

これ以降、p1 は構造体 1 のアドレスを保持します。そして、薄い点からのみ、ポインターを逆参照できます

p1->de
p2->nu

あなたを埋めたのは、これらのグローバルポインターを作成していたと思います。関数が何も取らずに突然何かを作ると、本当に醜く見えます。関数への参照によって構造体を渡すと、見栄えがよくなり、きれいになります。次に、関数は構造体を返しているように見えますが、そうではありません。ポインターでそれらを変更するかどうかを決定してください。また、引数を取らない関数を定義するときは、好きなようにします

int funct(void);

あなたの場合、関数は引数を取らず、値を返さないため、すべてが次のようになります。

void myfunction(void);
于 2013-09-04T22:36:56.550 に答える