Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/50: Рейтинг темы: голосов - 50, средняя оценка - 4.78
d2funlife
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 17
1

Вывод значения двух переменных

02.08.2011, 23:28. Просмотров 9531. Ответов 33
Метки нет (Все метки)

есть к примеру :

шаблон функции (параметры)
{ что то делаеться и return двух переменных}

вызов : cout<<шаблон функции(аргументы);

выводит только одну перемнную, как сделать что б выводило обе ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 23:28
Ответы с готовыми решениями:

Определить значения функции двух переменных
Определить значения функции двух переменных следующего вида:: f(x,1)=x^2–x+2;...

Поменять значения двух переменных, не используя третью
Как поменять значения двух переменных, не используя третью? Написать функцию...

Поменять местами значения двух переменных, не используя дополнительной
4.Напишите программу,которая меняет местами значения двух переменных в памяти....

Создать функции нахождения максимального значения из двух переменных
#include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;cstdlib&gt; using namespace...

Обменять значения двух переменных используя третью (буферную) переменную
Решите задачу пожалуйста::-[ Обменять значения двух переменных используя...

33
Сыроежка
Заблокирован
03.08.2011, 00:56 21
Цитата Сообщение от lazybiz Посмотреть сообщение
Да ты сам суть своего вопроса даже не понимаешь... Про return и слова не было, были слова про то что можно ли/нельзя вернуть из функции несколько значений.
Если ты на столько упертый то я тебе могу это публично доказать. Если есть желание то пиши вызывающую и вызываемую функции, а я при всех тебе покажу как это делается.
Тяжело иметь дело с человеком, который безграмотен, а потому пользуется не определленными в данной области терминами, а своими обывательскими представлениями.

Во-первыХ. термин "возвращаемое значение функции" определен в стандарте языка С++/С. То есть это вполне тконкретное определение, а не ваши какие-то собственные представления.

Но даже если учесть, что вы не знаете стандарта языка С++/С, а исходите из ваших отрывочных сведений о языке, полученных из разных источников, то хотя бы следовало понимать значение слова "возвращать" с точки зрения обычной семантики разговорного языка. Возвращать можно то, что получид. Например, вы мне дали тысячу рублей, я их вам возвращаю. То есть что получил, то и можно вернуть.
Теперь обратимся к вызову функции. У функции объявлены параметры. Эти параметры являются локальными переменными функции. Повторяю, если сразу же не поняли, локальными переменными функции. Их область жизни - это тело функции. В данном конкретном примере, когда вы передаете указатели на что-то, то эти указатели являются локальными переменнымпи функции. А все локальные переменные функции удаляются ее после завершения ее работы! То есть вы передали функции указатели, а она их вам не возвратила, а удалила!

Чечтно говоря, мне более не хочется с вами вступать в дискуссию, потому что вы вполне строго определенные понятия языка С++/С, описанные в стандарте, заменяете своими обывательскими представлениями. Я настоятельно советую вам обратиться к стандарту и прочитать там, что такое "возвращаемые значения функции".
0
Jupiter
03.08.2011, 01:14
  #22

Не по теме:

ребята, хватит оффтопить и придираться к словам, хотите согнать зло? идите в раздел C# или Java там можно отрываться по полной;)

0
Сыроежка
Заблокирован
03.08.2011, 01:50 23
Цитата Сообщение от Paporotnik Посмотреть сообщение
возвращать = return (по-англицки)
по-моему все более чем очевидно. не говоря уже про то, что ТС сразу спросил, как вернуть из ф-ции, используя return, на что и получил ответ.


а можно немного раскрыть эти слова? не совсем понял в чем именно негатив)
Это связано именно с понятием возврращаемоого значения функции. Обычно функции используются в выражениях, и значением функции в выражении является возвращаемое ее значение. Ежели функция имеет тип возвращаемого значения void, то обычно мы считаем, что функция ничего не возвращает, то есть что нас не интересует возвращаемое значение функции. Это интуитивно понятно при чтении кода.

Представьте себе вызов функции

int *p1;
int *p2;
...
...
f( p1, p2 );


Можете вы по такому вызову определить, возвращает ли что-то функция или нет?! Очевидно, что по этому коду совершенно нельзя ничего сказать, меняет ли функция какие-то значения в вызывающем коде. Это аналогично тому отрицательному эффекту, когда в какой-то функции вы обращаетесь к глобальным переменным. То есть видя такой вызов функции, человек, читающий код, не может сказать, какие побочные изменения совершает функция. Вы даже не можете сказать, а удаляет ли функция память, на которую указывают указатели, или нет?
Естественно вам надо будет сомнтреть описание функции. Если вы сделаете это поверхностно, увидев, что функция возвращает void, то вы можете подумать, что побочных эффектов у функции нет, так как обычно имеет место практика возвращать void, если результат работы функции не важен.
Такой код очень тяжело читать, особенно если у подобной функции много параметров. Какие параметры создают побочные эффекты, а какие нет? Поэтому чтобы понять код, вам придется отвлекаться на детальное чтение описания функции. То есть такой код не является интуитивно понятным.
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
03.08.2011, 02:04 24
ну, если читаемость является определяющей, то такой
C++
1
2
3
int p1,p2;
...
f(&p1,&p2);
вариант лучше?
0
Сыроежка
Заблокирован
03.08.2011, 02:07 25
Я приведу пример из своей практике, когда работал в достаточно крупном проекте. Там была функция, которая возвращала void, а в качестве паракметра среди прочего принимала указатель на структуру, выделенную в динамической области памяти. В зависимости от других параметров данная структура определенным облразом менялась. Но была там одна ветка в этой функции, когда эта структура удалялась! И поэтому когда в вызывающем коде продолжали работать с указателем на эту структуру, то программа аварийно завершалась. И ошибка возникала не в том месте, где должна была бы возникнуть, а совершшенно в другом месте. Дело в том, что удаляемая память не срразу же перезаписывалась благодаря последующему запросу на выделение памяти, а потому некоторое время с ней можно было работать. Такую ошибку очень трудно найти! Так как читающий код, видя вызов такой функции, не мог предположить, что значение указателя станет недействительным. если бы эта функция вместо void возвращала бы тот же самый указатель, который ей передали в качестве параметра, то тогда бы можно было бы сделать проверку на то, что он равен NULL. Но этого не было сделано. В результате на поиск ошибки ушла целая неделя!
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
03.08.2011, 02:13 26
могу привести в пример С-шную библиотеку NXOpen к UGS NX. там ооочень много ф-ций работает по такому принципу и довольно редко используется возврат какой-либо структуры, если возврат вообще есть.
0
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
03.08.2011, 02:49 27
Цитата Сообщение от lazybiz Посмотреть сообщение
Ой как же ты заблуждаешься, Сыроеженька....
Нет, не заблуждается. Уже обосновали.

Цитата Сообщение от Сыроежка Посмотреть сообщение
В общем случае считается плохим интерфейсом, когда функция ничего не возвращает, а через ее параметры передаются в вызывающую функцию несколько значений. Желательно избегать этого. Кроме того такую функцию нельзя использовать в выражениях. То есть к такому интерфейсу прибегают в крайних случаях, коогда ничего лучшего придумать не могут.
А вот с этим абсолютно не согласен! К примеру: accept() - к чему бы тут ещё что-то придумывать?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Но была там одна ветка в этой функции, когда эта структура удалялась!
Это не значит, что сам метод передачи параметров по ссылке порочен, просто накосячил кто-то... В этом плане Си-Диез лучше использовать - там мелкомягкие умники практически все потенциально опасные конструкции взяли, да запретили...

Добавлено через 10 минут
Цитата Сообщение от d2funlife Посмотреть сообщение
выводит только одну перемнную, как сделать что б выводило обе ?
если назначение функции - выводить что-то в поток, почему бы ей этот самый поток параметром не передавать и внутри неё хоть два, хоть двадцать значений выводить?..
1
Сыроежка
Заблокирован
03.08.2011, 20:36 28
Цитата Сообщение от Paporotnik Посмотреть сообщение
могу привести в пример С-шную библиотеку NXOpen к UGS NX. там ооочень много ф-ций работает по такому принципу и довольно редко используется возврат какой-либо структуры, если возврат вообще есть.
Вы поверхностно относитесь. библиотека - это один проект, где интерфейс унифицирован. То есть когда разрабатывалась библиотека, решался вопрос об общем интерфейсе для нее. Кроме того часто в С пишут в объектно-ориентированном стиле, когда некоторую структуру данных рассмпатривают как объект, и указатель на эту структуру данных передают в вызов каждой функции. Либо такая структура, которая хранит состояние системы, является глобальной. Поэтому для анализа вызова какой-нибудь функции проекта используется не возвращаемое значение, а обращение к этой глобальной структуре, чтобы получить статус состояния.

Я вам приведу пример с указателем FILE в языке С. Можно было сделать так, что любая функция обращения к файлу не возвращала никакого значения, а все проверки вы делали с помощью другх функций, наподобие ferror, которым бы передавали этот указатель FILE.

Что касается исходной задачи, то возникает вопрос: а почему что-то там рассчитывается для двух раздельных переменных?! Почему не для одной, или не для трех переменных? наверное эти переменные как-то связаны между собой? Допустим, они представляют собой точку плоскости. Тогда почему не использовать абстракцию Point, и не передавать ее функцию вместо двух отдельных переменных? Кроме того, а если нам нужно не менять исходные значения, а получить вычисленные выражения, чтобы их с чем-то там сравнить, то что тогда делать?! Все это приводит к выводу, что интерфейс данной функции крайне неудачный.

Добавлено через 5 минут
Цитата Сообщение от easybudda Посмотреть сообщение
А вот с этим абсолютно не согласен! К примеру: accept() - к чему бы тут ещё что-то придумывать?
Как раз этот тот случай, когда другого выхода у разработчиков не было. Вы просто оставили без внимания, что здесь передаются указатели на структуры, то есть это тот тяжелый случай, когда в функцю необходимо передать много параметров, и многие многие значение передаются в вызывающий код через параметры. То есть ваш пример на самом деле подтверждает мое высказывание.
0
d2funlife
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 17
05.08.2011, 01:53  [ТС] 29
Цитата Сообщение от easybudda Посмотреть сообщение
если назначение функции - выводить что-то в поток, почему бы ей этот самый поток параметром не передавать и внутри неё хоть два, хоть двадцать значений выводить?..
А наглядный пример можно ?
0
easybudda
Модератор
Эксперт CЭксперт С++
10146 / 6053 / 1521
Регистрация: 25.07.2009
Сообщений: 11,476
05.08.2011, 02:12 30
Цитата Сообщение от d2funlife Посмотреть сообщение
А наглядный пример можно ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class PlusMinus {
    int a;
    int b;
public:
    PlusMinus(int _a = 0, int _b = 0) : a(_a), b(_b) {}
    friend std::ostream & operator << (std::ostream & ost, const PlusMinus & fc){
        ost << fc.a << " + " << fc.b << " = " << (fc.a + fc.b) << std::endl;
        ost << fc.a << " - " << fc.b << " = " << (fc.a - fc.b) << std::endl;
        
        return ost;
    }
};
 
int main(){
    int a, b;
    
    while ( std::cout << "A = " && std::cin >> a && std::cout << "B = " && std::cin >> b )
        std::cout << PlusMinus(a, b) << "One more time..." << std::endl;
    
    return 0;
}
1
d2funlife
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 17
05.08.2011, 04:13  [ТС] 31
Цитата Сообщение от easybudda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class PlusMinus {
    int a;
    int b;
public:
    PlusMinus(int _a = 0, int _b = 0) : a(_a), b(_b) {}
    friend std::ostream & operator << (std::ostream & ost, const PlusMinus & fc){
        ost << fc.a << " + " << fc.b << " = " << (fc.a + fc.b) << std::endl;
        ost << fc.a << " - " << fc.b << " = " << (fc.a - fc.b) << std::endl;
        
        return ost;
    }
};
 
int main(){
    int a, b;
    
    while ( std::cout << "A = " && std::cin >> a && std::cout << "B = " && std::cin >> b )
        std::cout << PlusMinus(a, b) << "One more time..." << std::endl;
    
    return 0;
}
Понравился стиль написания, подчеркнул для себя что то новое - спасибо
0
Mr.X
Эксперт С++
3182 / 1709 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
05.08.2011, 09:10 32
Вот так еще можно (обрабатывает и комплексные коэффициенты уравнения):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/////////////////////////////////////////////////////////////////////////////////////////
#include <complex>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
template <typename T>
std::complex<T>  roots_of_quadratic_equation
    (
        T  A, 
        T  B, 
        T  C
    )
{
    T  D   = sqrt(B * B - T(4) * A * C);
    T  X1  = (-B + D) / T(2) * A;
    T  X2  = (-B - D) / T(2) * A;
    return std::complex<T>(X1, X2);
}
///////////////////////////////////////////////////////////////////////////////////////// 
int main()
{
    std::locale::global(std::locale(""));
    double  A, B, C; 
    //std::complex<double>  A, B, C; 
 
    std::cout << "Введите коэффициенты квадратного уравнения типа "
              << typeid(A).name() 
              <<":"
              << std::endl;
 
    std::cout << '\t'
              << "A = ";
    std::cin >> A;
 
    std::cout << '\t'
              << "B = ";
    std::cin >> B;
 
    std::cout << '\t'
              << "C = ";
    std::cin >> C;
 
    std::cout << "Корни этого уравнения: "
              << roots_of_quadratic_equation(A, B, C)
              << "."
              << std::endl;
}
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
05.08.2011, 22:29 33
Либо я сверхумный, либо все сверхглупые..., но что-то я не пойму... Кто не знает как вернуть указатель на несколько переменных или одну структуру или класс или массив или еще что-то!? Неужели для того чтобы это объяснить - надо написать 30 постов!?
0
Сыроежка
Заблокирован
06.08.2011, 20:31 34
Цитата Сообщение от lazybiz Посмотреть сообщение
Либо я сверхумный, либо все сверхглупые..., но что-то я не пойму... Кто не знает как вернуть указатель на несколько переменных или одну структуру или класс или массив или еще что-то!? Неужели для того чтобы это объяснить - надо написать 30 постов!?
Вы возвращаете только одну переменную: указатель! Только и всего!
Что касается возврата указателя на несколько переменных, то этого я действительно не знаю! Указатель всегда указывает на один объект!
0
06.08.2011, 20:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2011, 20:31

Поменять местами значения двух переменных, используя один указатель
Это вообще реально? С двумя указателями вот так, с вероятностью ошибки т. к....

Как поменять значения двух переменных не используя дополнительную переменную?
Как поменять значения двух переменных не используя дополнительную переменную?

Решение задачи Абрамяна: поменять местами значения двух переменных
Алгоритм и коды программы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru