2017-02-26 5 views
-6

に二重になります機能:それも実行されませんこれは前に私が持っていたコードである分数

char fractionCalculator(long double interest) 
{ 
    char multiples_of_one_eighth[7] = { 1/8, 1/4, 3/8, 1/2, 5/8, 3/4, 7/8 }; 

    char Return; 
    char * returnValue; 

    if (interest - trunc(interest) < 0.0625) 
    { 
    Return = '\0'; 
    } 
    else if (interest - trunc(interest) < 0.1875) 
    { 
    Return = multiples_of_one_eighth[1]; 
    } 
    else if (interest - trunc(interest) < 0.3125) 
    { 
    Return = multiples_of_one_eighth[2]; 
    } 
    else if (interest - trunc(interest) < 0.4375) 
    { 
    Return = multiples_of_one_eighth[3]; 
    } 
    else if (interest - trunc(interest) < 0.5625) 
    { 
    Return = multiples_of_one_eighth[4]; 
    } 
    else if (interest - trunc(interest) < 0.6875) 
    { 
    Return = multiples_of_one_eighth[1]; 
    } 
    else if (interest - trunc(interest) < 0.8125) 
    { 
    Return = multiples_of_one_eighth[1]; 
    } 

} 

。私が作ったとき、その部分が文字列として表示されなければならないと思っていましたが、私はそれがひどく間違っていたと推測しています。私はそれが実行されない理由は、関数の出力と入力と関係があると思いますか?私はこれで何時間も働いていて、まだそれを理解することはできません。助けることができる誰にも感謝します!

+1

「混合番号」とはどういう意味ですか?これはCで有効なデータ型ではありません.'1/8 'のような値は、 'char'に意味を果たすことができると思いますか? – abelenky

+0

「混合番号」とは何ですか?そして、「走っていない」とはどういう意味ですか?正確な行動は何ですか? [mcve]を入力し、入力、予想される出力/動作、実際の出力/動作を含めてください。 – kaylum

+0

警告をオンにします。ほとんどのコンパイラは '-Wall'です。それは多くの問題を指摘するでしょう。 – Schwern

答えて

0

デバッガで 'multiples_of_one_eighth'配列を確認してください。整数空間で(1/8)のような除算を実行するようにコンパイラーに依頼しているので、それらはすべてゼロであることがわかります。もし私があなたの望みを正しく理解していれば、それは各エントリの二重引用符で囲まれたchar *(c-strings)の配列になりたいでしょう。次に、戻り値の型をchar *に変更します。

1

これは数値をとり、それを最も近い8分の1に丸める関数であると推測しています。 0.26のように返すのは"1/4"です。

主な問題は、1つの小文字の文字列表現(すなわち、文字列"1/4"、数字1/4ではなく)を単一のcharに保存できないことです。 charは1バイトの文字を1つ格納します。 1/8は数値を返す数式です。 "1/8"は、文字を含むメモリへのポインタであるchar *に格納される4文字の文字列です。あなたは最後のものが欲しい。あなたはchar *を返しています。

あなたは1/2のようなUnicode部分を返すことができますが、それは急速に複雑になります。


さらに、interest - trunc(interest)は何もしません。

まず、truncdoubleであるが、interestlong doubleである。 doubleを返しますが、それを精度を失うlong doubleから減算します。コンパイラの警告は、そのようなことについてあなたに教えてくれるでしょう。-Wallでそれらをオンにしてください。 trunclを使用する必要があります。大したことではないが、明らかにコードを壊すことはないが、精度の一部を失うだろう。long double

しかし、trunclはまったく使用する必要はありません。 truncl(0.1)0.0である。 truncl(0.9)0.0です。 さんは全部、interest - 0です。だからそれを取り除く。


Return変数の必要はあなただけですぐに返すことができるような単純な機能のために、また、ありません。 Structured Programmingというものからの時代遅れのアドバイスである「関数からの戻りは1つしかない」というようなことを聞​​かれたかもしれません。物事をより簡単にすることになっていますが、あまりにも厳密に従うと複雑になります。

あなたはまだワイルド・ニーリーを返すべきではありません。このような小さな機能のためには、実際には関係ありません。ここでは、early exitというものに対して複数のリターンを使うことができます。ループやif/elseチェーンの最後に返される値を格納するのではなく、ただちに返すことができます。コードを簡単にします。


multiples_of_one_eighthアレイも必要ありません。数

int index = ...some calculation involving interest... 
return multiples_of_one_eight[index]; 

しかし、我々はとにかく他/場合にハードコードに各インデックスを持っているので、同様にいくつかの複雑さとハードコードを除去することがあります:それは私たちが同じように、配列のインデックスにより画分を参照することができれば有用であろう。それから、間違いを見るのはとても簡単です。同様に:

else if (interest - trunc(interest) < 0.1875) 
    { 
    Return = multiples_of_one_eighth[1]; 
    } 

あなたはmultiples_of_one_eighth[1]を返しているが、それは1/4です。私はかなりあなたが1/8を意味すると確信しています。

これをまとめてみると、このようなものが得られます。

#include <stdio.h> 

const char *fractionCalculator(long double interest) 
{ 
    if (interest < 0.0625) { 
     return "0"; 
    } 
    else if (interest < 0.1875) { 
     return "1/8"; 
    } 
    else if (interest < 0.3125) { 
     return "1/4"; 
    } 
    else if (interest < 0.4375) { 
     return "3/8"; 
    } 
    else if (interest < 0.5625) { 
     return "1/2"; 
    } 
    else if (interest < 0.6875) { 
     return "5/8"; 
    } 
    else if (interest < 0.8125) { 
     return "3/4"; 
    } 
    else { 
     return "1"; 
    } 
} 

int main() { 
    printf("%s\n", fractionCalculator(0.8)); 
} 

これを変更することはできませんので、それらをconst char *宣言される定数文字列を返すことに注意してください。

また、数学はちょっと間違っていることに注意してください。基本的にはあなたが持っていたものをコピーしていますので、修正しておきます。

+0

ありがとうたくさんの男!出来た! –

関連する問題