Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает оператор ветвления 
:(
    Опции темы
Syltan
  Дата 18.9.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Написал простую прогу с использованием шаблонов, вроде всё правильно, но дело в том,что условие 
Код

if(a == b)
        return 0;
  не работает. 

Я специально поставил значения в х1 = 8, х2 = 8,чтоб вывелся результат только один,
Код

Результат = 4,83

А выдаёт 2 результата.

Код

Результат = 8
Результат = 4,83


Код

#include <iostream>
using namespace std;

template< typename T>
T katet(T a, T b)
{
    if(a>b)
        return a;
        return b;
    if(a == b)
        return 0;
}

int main()
{
setlocale(0,"");
int      x1 = 8, x2 = 8;
double   y1 = 2.4, y2 = 4.83;
cout<<"Результат = "<<katet(x1,x2)<<'\n';
cout<<"Результат = "<<katet(y1,y2)<<'\n';

cin.get();
}




Это сообщение отредактировал(а) Syltan - 18.9.2009, 14:20
PM MAIL   Вверх
zim22
Дата 18.9.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



здесь ошибка. сам догадаешься в чём?
Код

if(a>b)       
  return a;
return b;




--------------------
PM MAIL   Вверх
Syltan
Дата 18.9.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Это место работате нормально, и с else,та же история.
Даже если поставить  будет тот же самый вывод:
Код

template< typename T>
T katet(T a, T b)
{
    if(a>b)
        return a;
    else
        return b;
    if(a == b)
        return 0;
}



Странно,но это условие не работает:
Код

if(a == b)
        return 0;


Это сообщение отредактировал(а) Syltan - 18.9.2009, 14:24
PM MAIL   Вверх
Cheloveck
Дата 18.9.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(Syltan @  18.9.2009,  15:22 Найти цитируемый пост)
   
Код

 if(a>b)
        return a;
    else
        return b;
    if(a == b)
        return 0;

теперь тут ошибка. сам догадаешься в чём?

если a больше b, то выход со значением a, иначе выход со значением b. И если a равна b - выход со значением ноль. 

чувствуешь нестыковку?

Это сообщение отредактировал(а) Cheloveck - 18.9.2009, 14:32


--------------------
user posted image
PM Jabber   Вверх
Syltan
Дата 18.9.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Хотите сказать, что вот так будет правильно:
Код

if(a>b)
        return a;
    if(b>a)
        return b;
    if(a == b)
        return 0;


А else в таких случаях не используют?

Это сообщение отредактировал(а) Syltan - 18.9.2009, 14:32
PM MAIL   Вверх
Cheloveck
Дата 18.9.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Код

if( a == b )
   return 0;
else if( a > b )
   return a;
else
   return b;



--------------------
user posted image
PM Jabber   Вверх
Syltan
Дата 18.9.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Зачем лишний else,тогда лучше вот так:
Код

if( a == b )
   return 0;
 if( a > b )
   return a;
else
   return b;


Но дело в том,что я хочу чтоб не выдавало результат = 0, чтоб,если одно число равно другому, тогда ничего на экран не выдавало.

Это сообщение отредактировал(а) Syltan - 18.9.2009, 14:37
PM MAIL   Вверх
Cheloveck
Дата 18.9.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Код

int k = katet( x1, x2 );
if( k )
   std::cout << "Результат = "<<k<<'\n';


Это сообщение отредактировал(а) Cheloveck - 18.9.2009, 14:38


--------------------
user posted image
PM Jabber   Вверх
zim22
Дата 18.9.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Cheloveck, как-то ты код извращённо переписал. 
я думаю, что сначала в if'ах должны быть перечислены стандартный/правильный поток выполнения программы а уже после них - обработка ошибочных вариантов.

Код

if (b < a) return a;
if (a < b) return b;
return 0;


Это сообщение отредактировал(а) zim22 - 18.9.2009, 14:41


--------------------
PM MAIL   Вверх
Cheloveck
Дата 18.9.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(Syltan @  18.9.2009,  15:35 Найти цитируемый пост)
Зачем лишний else,тогда лучше вот так:

Он не лишний. Потом поймёшь.


--------------------
user posted image
PM Jabber   Вверх
Syltan
Дата 18.9.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



И даже если написать вот так:
Код

if (b < a) return a;
if (a < b) return b;
return 0;


Результат программы будет таков:
Код

Результат = 0
Результат = 4,83


А нужно вот такой чтоб был:
Код

Результат = 4,83


Это сообщение отредактировал(а) Syltan - 18.9.2009, 14:45
PM MAIL   Вверх
Cheloveck
Дата 18.9.2009, 14:44 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



zim22, если говорить о правильном подходе, то это должно быть вообще так
Код

int result = 0;
if( a > b ) 
    result = a;
else if( b > a )
     result = b;
return result;


Добавлено через 1 минуту и 35 секунд
ну, или T вместо int


--------------------
user posted image
PM Jabber   Вверх
zim22
Дата 18.9.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Cheloveck @  18.9.2009,  14:44 Найти цитируемый пост)
если говорить о правильном подходе, то это должно быть вообще так

ок. где ты вычитал об этом "правильном" подходе? в чём его преимущества перед моим? (свой я вычитал в Макконнеле "Совершенный код")

недостатки "правильного" подхода вижу такие: 
1) создание ненужной переменной result, без которой можно обойтись. 
2) тип у result кстати int. хотя это шаблонная функция и передавать ей можно всё-что угодно. хоть тип Booblik
3) инициализация переменной result нулём. а что если тип у переменной не int и конструктор преобразования не определён?
4) сравнение идёт по оператору БОЛЬШЕ, а не МЕНЬШЕ. который с меньшей степенью вероятности определён в классах, чем МЕНЬШЕ smile




--------------------
PM MAIL   Вверх
Cheloveck
Дата 18.9.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32





--------------------
user posted image
PM Jabber   Вверх
Syltan
Дата 18.9.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Вы меня не поняли,если числа одинаковые тогда,вообще ничего на экран не долно выводится, а вывестись должен только второй вызов, где числа не одинаковые.


Это сообщение отредактировал(а) Syltan - 18.9.2009, 15:00
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.