Я только что узнал о функциях C ++;я могу использовать операторы if на возвращаемых значениях функции? - PullRequest
7 голосов
/ 18 марта 2010

Что меня смущает, так это функция isNumPalindrome ().Возвращает логическое значение true или false.Как я должен использовать это, чтобы я мог показать, палиндром это или нет.Напримерif (isNumPalindrome == true) cout << "Your number is a palindrome"; else cout << "your number is not a palindrome.";

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
 return 0;
}

#include <iostream>
#include <cmath>

using namespace std;

int askNumber();
bool isNumPalindrome();

int num, pwr;

int main()
{
 askNumber();

 return 0;
}

bool isNumPalindrome()
{
 int pwr = 0;

 if (num < 10)
  return true;
 else
 {
  while (num / static_cast<int>(pow(10.0, pwr)) >=10)
   pwr++;
  while (num >=10)
  {
   int tenTopwr = static_cast<int>(pow(10.0, pwr));

   if ((num / tenTopwr) != (num% 10))
    return false;
   else
   {
    num = num % tenTopwr;
    num = num / 10;
    pwr = pwr-2;
   }
  }

  return true;
 }
}

int askNumber()
{
 cout << "Enter an integer in order to determine if it is a palindrome: " ; 
 cin >> num;
 cout << endl;

if(isNumPalindrome(num))
{
cout << "It is a palindrome." ;
cout << endl;
}
else
{
cout << "It is not a palindrome." ;
cout << endl;
}
 return num;
}

Ответы [ 9 ]

12 голосов
/ 18 марта 2010

Возвращаемое значение для функции может использоваться как переменная того же типа.

Ваша основная программа должна выглядеть примерно так:

int main()
{
  int num=askNumber();
  bool isPal=isNumPalindrome(num);
  if (isPal)
  {
    //do something
  }
  else
  {
    //do something else
  }

  return 0;
}

или вы могли бы быть еще более кратким:

int main()
{
  if (isNumPalindrome(askNumber()))
  {
    //do something
  }
  else
  {
    //do something else
  }

  return 0;
}

То, что вы не хотите делать, это использовать те глобальные переменные, которые вы определили. В более сложных программах это станет рецептом катастрофы.

Редактировать: вам нужно обязательно отредактировать функцию isNumPalindrome, чтобы она принимала число, с которым она работает:

bool isNumPalindrom(int num)
{
   ...
}
8 голосов
/ 18 марта 2010

Да, вы можете сделать такую ​​вещь.

На самом деле вы могли бы просто ...

if (isNumPalindrome()) { ... }
4 голосов
/ 18 марта 2010
if(isNumPalindrome())
{
    cout << "Your number is a palindrome";
}
else
{
    cout << "Your number is not a palindrome";
}
2 голосов
/ 18 марта 2010

Как утверждают многие, возвращаемое значение функции по существу становится значением функции.

Вот пример троичной операции печати результата.

cout << "The number " << (isNumPalindrome()) ? "is a palindrome" : "is NOT a palindrome";

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

2 голосов
/ 18 марта 2010

Во-первых, вы не должны использовать глобалы для num и pwr; Вы должны передать их в качестве аргументов функциям:

bool isNumPalindrome(int num);
...
num = askNumber();
isNumPalindrome(num);

Во-вторых, нет необходимости сравнивать логическое значение с true (или false); просто используйте логическое значение.

Трудно сказать, какой именно синтаксис вы пытаетесь использовать в вашем примере оператора "if", но одну вещь, которую вы не можете сделать, это иметь в выражении оператор "if". В C ++ есть выражения и операторы. Выражения имеют значения; заявления не.

// valid
if (isNumPalindrome(num)) {
    std::cout << '"' << num << "\" is a palindrome." << std::endl;
} else {
    std::cout  << '"' << num << "\" is not a palindrome." << std::endl;
}

// invalid
std::cout << '"' << num << (if (isNumPalindrome(num)) {
    "\" is a palindrome.";
} else {
    "\" is not a palindrome.";
}) << std::endl;

// valid, but not recommended
std::cout << '"' << num << "\" is " << (isNumPalindrome(num) ? "" : "not ") << "a palindrome." << std::endl;

Для троичного оператора (? :) читать " В троичном или нет в троичном? "

2 голосов
/ 18 марта 2010

когда функция возвращает тип, вы можете думать о том, что эта функция заменяется возвращаемым значением и типом.так что для вас:

isNumPalindrome () -> {true / false}

, чтобы вы могли написать, например:

0 голосов
/ 19 марта 2010

еще одно решение; -)

#include <iostream>
#include <sstream>
#include <algorithm>

bool is_palindrome( const int num )
{
    std::ostringstream os;
    os << num;
    const std::string& numStr = os.str();
    std::string reverseNumStr = numStr;
    std::reverse( reverseNumStr.begin(), reverseNumStr.end() );
    const bool result = ( numStr == reverseNumStr );
    return result;
}

int main()
{
    int num = 0;
    std::cout << "Enter an integer in order to determine if it is a palindrome: ";  
    std::cin >> num; 

    std::string inset;
    if( !is_palindrome( num ) )
    { 
        inset = "not ";
    } 
    std::cout << "It is " << inset << "a palindrome." << std::endl; 
}
0 голосов
/ 18 марта 2010

В одном предложении:

"В качестве условия оператора if вы можете использовать любое выражение , чей результат , один раз при вычислении выражения может быть неявно конвертируется в ' bool '. "

0 голосов
/ 18 марта 2010

Вы можете вызывать isNumPalindrome () внутри askNumber () и использовать возвращаемое значение из isNumPalindrome () в условном тесте. Лучше передать num в качестве аргумента isNumPalindrome, хотя: isNumPalindrome (int num)

int askNumber()
{
 cout << "Enter an integer in order to determine if it is a palindrome: " ; 
 cin >> num;
 if(isNumPalindrome(num)){
   cout << "it is a palindrome";
 }
 cout << endl;

 return num;
}

тогда main может вызывать только askNumber ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...