Я новичок в С++. Я написал этот код, но результат для q должен быть 1,0, но код дает мне, изменяя порядок переменных, когда я вспоминаю функцию «интерчетта», например -34, 0, 9,75. Почему?
#include <iostream>
using namespace std;
float coefficienteAngolare(float x1, float x2, float y1, float y2, float m) {
return m = ((y2 - y1) / (x2 - x1));
}
float intercetta(float m, float x1, float y1, float q) {
return q = y1 - m * x1;
}
int main() {
float x1, x2, y1, y2, m=0, q=0;
x1 = 3.5;
x2 = 6.5;
y1 = 9.75;
y2 = 17.25;
cout << "m= " << coefficienteAngolare(x1, x2, y1, y2, m) << endl;
cout << "q= " << intercetta(x1, y1, m, q) << endl;
}
Как я могу сделать, чтобы main прочитал значение m?
Я должен передать m по значению? Как я могу это сделать?
Вы намеренно называете intercetta(x1, y1, m, q)
вместо intercetta(m, x1, y1, q)
? Вы понимаете, что означает концепция передачи по значению по сравнению с передачей по ссылке?
Как я уже сказал, я неофит
Я не знаю математики вашего кода, но ваша функция intercetta ожидает переменные m, x1, y1, q по порядку. При вызове функции вы отправляете x1, y1, m, q в таком порядке. Вы должны писать переменные в том же порядке, в котором они объявлены.
Даже если я напишу «интерчетта (m, x1, x2, q)», m не равно 1,0. По математике должно быть 1,0
Как вы думаете, почему m должно быть равно 1,0? Если вы хотите изменить значение переменной внутри функции, вы должны передать по ссылке вашу переменную. Это делается путем добавления & перед именем. cout << "q= " << intercetta(x1, y1, &m, q) << endl;
Извините, q должно быть 1.0
q=y1-m*x1, где y1=9,75, m=2,5, x1=3,5. Посчитайте, и результат будет 1,0.
Вы передаете параметры m=3,5 (из аргумента x1), x1=9,75 (из аргумента y1) и y1=2,5 (из аргумента m). Если посчитать, то должно быть -31.625
.
Переменная m
(и q
) в вашей функции main
отличается от переменных в других ваших функциях. Присваивание, которое у вас есть после вашего оператора return
, присваивает значение переменной, время жизни которой ограничено областью действия соответствующей функции.
Если вы хотите передать по ссылке, вы можете сделать это, объявив аргумент как ссылку:
float intercetta(float m, float x1, float y1, float& q) {
// ^-------- reference
Не работает, q = 9,75. Но должно быть 1.0
@padrepio1000 padrepio1000 Вы создали ссылочные аргументы m
и q
и убедились, что передали аргументы intercetta
в правильном порядке?
Как заявлено, да
Эта функция
float coefficienteAngolare(float x1, float x2, float y1, float y2, float m) {
return m = ((y2 - y1) / (x2 - x1));
}
имеет параметры, передаваемые по значению. Это означает, что он получает копии параметров, которые вы указываете. Что бы вы ни делали внутри функции, вы не можете изменить параметры, переданные ей в main()
.
Если вы действительно хотите изменить m
, вы должны передать его по ссылке
float coefficienteAngolare(float x1, float x2, float y1, float y2, float& m) {
return m = ((y2 - y1) / (x2 - x1));
}
Но тогда, если вы модифицируете m
, зачем вам его возвращать?
Скорее всего, вы либо хотите ничего не возвращать, а просто сохранить результат в m
void coefficienteAngolare(float x1, float x2, float y1, float y2, float& m) {
m = ((y2 - y1) / (x2 - x1));
}
//....
// in main()
coefficienteAngolare(x1, x2, y1, y2, m);
cout << "m= " << m << endl;
Или вы хотите вернуть результирующее значение, не передавая переменную для его хранения.
float coefficienteAngolare(float x1, float x2, float y1, float y2) {
return ((y2 - y1) / (x2 - x1));
}
//....
// in main()
m = coefficienteAngolare(x1, x2, y1, y2);
cout << "m= " << m << endl;
В той же строке вы должны изменить intercetta
.
Обратите внимание, что порядок параметров имеет значение. Компилятор не может догадаться, что переменная q
в main()
должна быть такой же, как переменная q
в intercetta
, они принадлежат разным областям видимости.
std::cout << "m= " << m << '\n';
Хорошо, теперь это работает: (я не знаю, как вставить код в комментарии). Коэффициент с плавающей точкой eAngolare(число с плавающей запятой x1, число с плавающей запятой x2, число с плавающей запятой y1, число с плавающей запятой y2, число с плавающей запятой и m). СПАСИБО
@padrepio1000 Комментарии не подходят для ввода длинных фрагментов кода. Чтобы ввести код, смотрите здесь . Если тот или иной ответ подходит к вашему вопросу, вы можете решить принять его. Обязательств к этому нет.
example code eddea
return m = …
вы ожидаете, что это изменит значениеm
вmain()
?