#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
.