#c
#c
Вопрос:
В этом коде я пытаюсь вывести сумму и разницу двух входных данных. Когда я запускаю эту программу, сумма выводится нормально, но вместо разницы выводится первый ввод. Как я могу заставить эту программу выводить разницу, а также сумму?
void Modify(int *x, int *y) {
*x = *x *y;
if (*x >= *y)
*y = *x - *y;
if (*x < *y)
*y = *y - *x;
}
int main() {
int x, y;
int *ptr_x = amp;x;
int *ptr_y = amp;y;
cin >> x;
cin >> y;
Modify(ptr_x, ptr_y);
cout << x << endl;
cout << y;
return 0;
}
Комментарии:
1. После изменения значения при
x
некотором хитром мышлении потребуется использовать предыдущее значение в будущих операциях. Возможно, вы захотите использовать временную переменную.2. если я не могу ничего изменить ниже int main, есть ли способ создать временную переменную?
3. Поместите временную переменную выше
int main
, где это необходимо.
Ответ №1:
void Modify(int *x, int *y) {
*x = *x *y;
if (*x >= *y)
*y = *x - *y;
if (*x < *y)
*y = *y - *x;
}
Ваша первая строка *x = *x *y;
перезаписывает *x
значение с *x *y
помощью, следовательно, следующие утверждения вводят в заблуждение
if (*x >= *y)
*y = *x - *y;
if (*x < *y)
*y = *y - *x;
и не выполняют то, что вы ожидаете.
В качестве общего совета, сохраняйте свой код простым и понятным в отношении ваших намерений:
#include <cmath>
void Modify(int *x, int *y) {
using std::abs;
int sum = *x *y;
int abs_diff = abs(*x - *y);
*x = sum;
*y = abs_diff;
}
Комментарии:
1. Одна только ясность стоит кивка.
Ответ №2:
Было бы неплохо, если бы вы объяснили, почему вы не можете сделать что-то простое, как std::cout << x y << endl << x - y;
без вызова какой-либо функции.
Но если вы хотите сделать это таким образом, без дополнительных переменных, один из вариантов таков:
void Modify(int *x, int *y) {
*x = *x *y; ///x = original x original y
*y = *x - 2*(*y); ///y = (original x original y) - 2*(original y)
}
Примечание: будьте осторожны с переполнениями
Редактировать: если вам нужно абсолютное значение разницы, используйте вместо *y = abs(*x - 2*(*y))
;
Ответ №3:
Это не разница в печати, потому что вы обновляете значение x
с суммой обоих, *x = *x *y
как @user4581301, предложенной в комментарии. Вы можете сделать что-то вроде этого.
void Modify(int *x, int *y) {
int* temp = new int(*x);
*x = *temp *y;
if (*temp >= *y)
*y = *temp - *y;
if (*x < *y)
*y = *y - *temp;
delete temp;
}
Что это сделает, так это то, что вы создадите новый целочисленный указатель temp
, в котором будет сохранено значение x
, и теперь вы можете изменить x
, но в других местах, где x
это было необходимо, мы будем использовать temp
вместо x . И в конце мы удаляем temp
.
Комментарии:
1. Какая-либо причина
int temp = *x;
не сработает? Выделение для одногоint
может стать дорогостоящим, если функция вызывается повторно. Любая причина, по которой вы не используетеif (*temp < *y)
?