2013-04-20 2 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

Я изменил код, чтобы использовать указатели на структуру, структура и внутр. Обратите внимание, что я использовал typedef в объявлении структуры, чтобы использовать его для прототипа функций позже. Создав указатель на struct, вы должны инициализировать его с помощью определения структуры, используя что-то вроде pVar = & var. См. Мой ответ ... – ryyker

ответ

2
  1. Вы объявили указатели на struct rational, но не назначал их на самом деле указывают на любой такой структуры. например:

    struct rational rat_a; 
    p1 = & rat_a; 
    
  2. Вы объявляете свои функции, возвращая struct rational (т.е. struct rational add()), но они, кажется, не возвращать ничего. если функция ничего не возвращает, она должна быть объявлена ​​как void - void add()

  3. Почему вы используете указатели на структуры, а не на сами структуры? (если объявлено глобальным как в вашем коде)

+0

1. Где я должен назначить указатель? – Shail

+0

, когда вы решаете, что они должны указать ... – zubergu

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; 
} 
Смежные вопросы