калькулятор комплексных чисел: арифметические операции со структурными переменными в c

#c #function #struct

Вопрос:

Пытаюсь написать программу на языке си, которая может выполнять вычисления комплексных чисел. Программа должна использовать эту структуру:

 typedef struct Complex_ {  double RealPart;  double ImagPart; } Complex;  

Он должен использовать одну функцию для считывания входных данных пользователя для комплексных чисел, а другую функцию для их сложения, другую для их умножения и т. Д. Я пытаюсь получить функцию для добавления чисел прямо сейчас, и я пытаюсь понять, как это сделать.Это функция для чтения в пользовательском вводе:

 Complex read_complex(void) {  Complex user1, user2;  printf("Enter first complex number: ");  scanf("%lf %lf", amp;user1.RealPart, amp;user1.ImagPart);  printf("Enter the second complex number: ");  scanf("%lf %lf", amp;user2.RealPart, amp;user2.ImagPart);  return;  

}

И это то, что у меня есть до сих пор для сложения комплексных чисел:

 Complex add_complex(Complex z1, Complex z2) {  Complex z3;   z3 = z1   z2;//error on this line   return(z3);  

}

Функция должна возвращать z3, и z3 должен быть равен z1 z2, а z1 и z2 должны быть переменными типа Complex. Я не уверен, как заставить его работать с этими спецификациями, так как вы не можете выполнять арифметические операции с переменными структуры.

Комментарии:

1. Вам придется где-то написать свой собственный код, чтобы явно добавить реальную часть к реальной части, а сложную часть к сложной части. Как вы видели, вы не можете применить оператор к двум структурам и ожидать, что они будут добавлены волшебным образом; У C нет способа выяснить это. (Вы могли бы заставить его работать на C , в котором есть перегрузка операторов .)

2. Пожалуйста, обратите внимание, что начиная с C99, язык изначально поддерживает комплексные числа. Просто включите complex.h

3. Я надеюсь, что в вашей read_complex функции есть нечто большее, чем показано на рисунке. user1 и user2 являются локальными для этой функции, и вы можете использовать только return одну из них (и в настоящее время вы ничего не возвращаете). Вам нужно будет передать их в качестве указателей, если вы хотите, чтобы то, что вводит пользователь, сохранялось за пределами этой функции.

Ответ №1:

Вы не можете добавлять или вычитать структуры данных.

 Complex add_complex(Complex z1, Complex z2) {  Complex z3;   z3.RealPart = z1.RealPart   z2.RealPart;  z3.ImagPart = z1.ImagPart   z2.ImagPart;   return(z3); }  

Ответ №2:

Не то, о чем вы спрашиваете, но ваша read_complex функция, как показано, не будет работать. Предложите перейти на что-то вроде следующего

 #include lt;stdbool.hgt;  bool read_complex(Complex* user1, Complex* user2) {  bool inputValid = false;    // weak check for validity, a non-NULL pointer isn't necessarily  // valid. In fact, probably better to skip this check and instead  // document/accept UB if user1 and/or user2 are not valid pointers.  if (user1 != NULL amp;amp; user2 != NULL)  {  printf("Enter first complex number: ");  if (scanf("%lf %lf", amp;(user1-gt;RealPart), amp;(user1-gt;ImagPart)) == 2)  {  printf("Enter the second complex number: ");  if (scanf("%lf %lf", amp;(user2-gt;RealPart), amp;(user2-gt;ImagPart)) == 2)  {  inputValid = true;  } // else, print error message?  } // else, print error message?  }   return inputValid; }  

scanf возвращает int значение, указывающее количество входных данных, соответствующих предоставленным спецификаторам формата. Это должно быть 2 для каждого ввода, если нет, вы знаете, что есть проблема. Вызывающий read_complex может решить, что делать дальше, если он вернется false .