2013-04-20 96 views
1

我正在编写一个程序,用于使用结构和指针查找两个有理数的加法,乘法和除法。我在输入带指针的数字时遇到问题。我的代码应该如何纠正?谢谢!如何输入结构的指针

#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; 
} 
+0

我修改代码以使用指针结构,结构和INT。请注意,我在结构声明中使用了typedef,以便稍后可以使用它来对函数进行原型设计。一旦你创建了一个指向struct的指针,你必须使用类似pVar =&var的结构定义来初始化它。看我的答案... – ryyker 2013-09-04 23:25:56

回答

2
  1. 您已经声明指针struct rational,但没有将其分配到实际指向任何这样的结构。例如:

    struct rational rat_a; 
    p1 = & rat_a; 
    
  2. 你声明的功能为返回struct rational(即struct rational add()),但他们似乎并不返回任何东西。如果函数没有返回任何东西,它应该被声明为void - void add()

  3. 为什么你使用指向结构体的指针而不是结构体本身? (如果在您的代码中声明为全局)

+0

1.我应该在哪里分配指针? – Shail 2013-04-20 01:39:16

+0

当你决定他们应该指向... – zubergu 2013-09-04 22:33:28

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); 
0

您的代码修改为使用指针结构,结构和整数:

#include <stdio.h> 
typedef struct 
{ 
    int nu; 
    int de; 
}rational; 

rational *p1, elements; 

int add(rational *p4) 
{ 
    int a; 
    a = p4->nu+p4->de; 

    return a; 
} 
int multiply(rational *p4) 
{ 
    int a; 
    a = p4->de * p4->nu; 

    return a; 
} 
int divide(rational *p4) //should return a float instead of int to show decimal returns 
{ 
    int a; 
    a = p4->nu/p4->de; 

    return a; 
} 
int main() 
{ 
    int a,b,choice; 

    p1 = &elements; 

    printf("Enter the first rational number.\n"); 
    scanf("%d",&a); 
    printf("Enter the second rational number.\n"); 
    scanf("%d",&b); 
    printf("Enter choice /(1, 2 or 3/).\n"); 

    scanf("%d",&choice); 

    p1->nu = a; 
    p1->de = b; 
    switch (choice) 
    { 
     case 1: 
      a = add(p1); 
      printf("%d + %d = %d\n",p1->nu, p1->de, a); 

       break; 
     case 2: 
      a= multiply(p1); 
       printf("%d * %d = %d\n",p1->nu, p1->de, a); 

       break; 
     case 3: 
      a = divide(p1); 
      printf("%d/%d = %d\n",p1->nu, p1->de, a); 
       break; 
    } 
    getchar();//eats an additional character?... 
    getchar();//stop execution so you can see your answer 
    return 0; 
}