2017-09-09 10 views
-3

問題が..私はint戻り値の型..hereを持つ関数からint main()に「ボナペティ」を印刷する必要があることは私のコードです:ボナペティ:)(メインの文字列を印刷するint型の戻り値の型関数から

#include <iostream> 
#include <vector> 

using namespace std; 

int bonAppetit(int n, int k, int b, vector <int> ar) { 
    // Complete this function 
    int sum = 0; 
    for(auto i : ar) 
    { 
     sum += i; 
    } 

    sum -= ar[k]; 

    if(sum/2 == b) 
     cout<< "Bon Appetit"<<endl; 
    else 
     return b-(sum/2); 
} 

int main() { 
    int n; 
    int k; 
    cin >> n >> k; 
    vector<int> ar(n); 
    for(int ar_i = 0; ar_i < n; ar_i++){ 
     cin >> ar[ar_i]; 
    } 
    int b; 
    cin >> b; 
    int result = bonAppetit(n, k, b, ar); 
    cout << result << endl; 
    return 0; 
} 

出力にcout<<"Bon appetit"を使用すると、return b-(sum/2)のためにBon appetit0と表示されます。 control reaches end of non-void function [-Werror = return type]

をので、短い中で「」私はどうすればよい: 別の問題は、文句を言わないだけでコンパイルエラーとコードとして処理されているそれ以外の場合は警告が生成され、文句を言わない私はelse一部でreturn b/(sum)/2を書いてみましょう私のIDEです問題の「int型の関数から)MAIN(TO文字列を返す? ()関数を使用し、メインでfirectlyコードを書くことではないことをお勧めいけないしてください。

リンク==>https://www.hackerrank.com/challenges/bon-appetit/problem

+2

あなたは本当に「メインに文字列を」返却しようとしているか、あなただけの関数から文字列を表示したいされていますか? – jpo38

+0

ディスプレイも動作します....私はちょうどそれをメインに印刷する必要があります.....それはあなたが "返品"を使用するか直接表示するかどうかは関係ありません。 – GeekyCoder

+1

無関係な注記:大きな入力に対してコストがかかるベクトルコピーを避けるには、関数にベクトルを 'const 'で渡す必要があります。 – Mikhail

答えて

0

すべてあなたの世代の流れはintを返さなければなりません。テキストを表示してから戻る。

int bonAppetit(int n, int k, int b, vector <int> ar) { 
    // Complete this function 
    int sum = 0; 
    for(auto i : ar) 
    { 
     sum += i; 
    } 

    sum -= ar[k]; 

    if(sum/2 == b) 
     cout<< "Bon Appetit"<<endl; 

    return b-(sum/2); 
} 

あなたが本当にメインに「復帰」という文字列に必要がある場合、それはあなたの関数がintstringの両方を返すことを意味します。 C++では、関数は戻り値の型が1つしかありません。次に、関数に2つの出力(intstring)を提供するいくつかのオプションがあります。ここでは2つの単純なオプションがあります

戻りpairintstring):

pair<int,string> bonAppetit(int n, int k, int b, vector <int> ar) { 
    // Complete this function 
    int sum = 0; 
    for(auto i : ar) 
    { 
     sum += i; 
    } 

    sum -= ar[k]; 

    return make_pair(b-(sum/2), ((sum/2 == b) ? "Bon Appetit" : "")); 
} 

次に、あなたの行いますメイン:

pair<int,string> result = bonAppetit(n, k, b, ar); 
if (!result.second.empty()) 
    cout << result.second << endl; 
cout << result.first << endl; 

するか、stringが関数への参照として渡されてい(constの参照がない場合は、関数がそれを変更できるようになります)。

int bonAppetit(int n, int k, int b, vector <int> ar, string& message) 
{ 
    // Complete this function 
    int sum = 0; 
    for(auto i : ar) 
    { 
     sum += i; 
    } 

    sum -= ar[k]; 

    if (sum/2 == b) 
     message = "Bon Appetit"; 

    return b-(sum/2); 
} 

は、その後、あなたの主が行います。

string text; 
int result = bonAppetit(n, k, b, ar, text); 
if (!text.empty()) 
    cout << text << endl; 
cout << result.first << endl; 
+0

3進演算子が2つの異なる戻り値の型をサポートするかどうかは疑いありません – GeekyCoder

2
int bonAppetit(int n, int k, int b, vector <int> ar) { 
    // Complete this function 
    int sum = 0; 
    for(auto i : ar) 
     sum += i; 

    sum -= ar[k]; 

    if(sum/2 == b) 
     return -1; 
    else 
     return b-(sum/2); 
} 

とメインにし:

if (result != -1) std::cout << result << std::endl; 
else std::cout << "Bon Appetit" << std::endl; 

using namespace stdを使用しないでください。 hereを読んでくださいなぜ

+1

'result'と' 'Bon appetit" 'は型が異なり、三項演算子がサポートしていないのでmainのコードはコンパイルされません。 – Mikhail

+0

あなたは正しいです@Mikhail ..ifu prefre。リンクの問題を見て....それはより良い私の質問をクリアすることがあります – GeekyCoder

1

あなたはbyRef引数を使って1つの関数から2つの値を返すことができます。これは簡単なサンプルです:

char* isDividableOn(int num, int divider ,int & remain){ 

    if (num % divider == 0){ 
     remain = 0; 
     return "number is dividable"; 
    } 
    else { 
     remain = num % divider; 
     return "number is not dividable"; 
    } 
} 

int main(){ 
    int num = 11; 
    int divider = 3; 
    int res = -1; 
    cout << isDividableOn(num , divider, res); 
    /// in this point value of res now is set to 2; 
} 
0

それが働いた:

#include <iostream> 
#include <vector> 

using namespace std; 

string bonAppetit(int n, int k, int b, vector <int> ar) { 
    // Complete this function 
    int sum = 0; 
    for(auto i : ar) 
    { 
     sum += i; 
    } 

    sum -= ar[k]; 

    if(sum/2 == b) 
     return "Bon Appetit"; 

     string str = to_string(b-(sum/2)); 
    return str; 
} 

int main() { 
    int n; 
    int k; 
    cin >> n >> k; 
    vector<int> ar(n); 
    for(int ar_i = 0; ar_i < n; ar_i++){ 
     cin >> ar[ar_i]; 
    } 
    int b; 
    cin >> b; 
    string result = bonAppetit(n, k, b, ar); 
    cout << result << endl; 
    return 0; 
} 
+0

次回は、あなたがそれに答えるかもしれないより正確に他の人に質問してみてください.. .. – jpo38

+0

@ jpo38元の問題へのリンクを追加しました....そして、この解決策は、 – GeekyCoder

関連する問題