0以上1未満の小数が与えられた時、その二進表現の文字列を返す関数を定義し、その動
作を確認するうという内容なんですが・・・。
ステップ1
さしあたり、2進展開を手計算では、どうやっているか考えて見る
ステップ2
その次に、手計算による手法を、プログラム化する
この手法は、なるべく機械的であるほうが、プログラム化しやすいと思います。
ステップ3
そして、そのプログラムについて、動作が思ったとおり動かない、などの現象に
遭遇したら、この掲示板で聞いてみる。
という流れになるかと思います。がんばってください。
どうでもいいことですが。
ステップ3のときは書いたソースを全部載せると、回答が早くつくかもしれません。
このくらいのプログラムなら、全部載せてもたいした量ではないでしょうから。
実行できるんですが、ちゃんと表示されません。どこが悪いんでしょうか?
#include <iostream.h>
#include <string.h>
char* bstring(double a);
void main()
{
double a;
cout << 次の小数;
cin >> a;
char *t;
t=bstring(a);
cout << を二進数表現すると;
cout << 0. << t << \n;
}
char* bstring(double a)
{
double g;
char s[256];
char *b = s;
for(int k=0; k < 50; k++){
g=a*2.0;
if(g > 1.0){
g=g-1.0;
*b='1';
}
else{
*b='0';
}
g=a*2.0;
b ++;
*b='\0';
}
return b;
}
> ちゃんと表示されません
どう表示されるか、ちゃんと書くのがマナーです
for文のなかで g はずーっと引数 a*2.0 のままですね。
g はどんどん二倍していかなければならないんじゃないのかな。
>実行できるんですが、ちゃんと表示されません。どこが悪いんでしょうか?
どういう手順で実行したのか詳しく示して下さい
チャンと表示されないということはどういうことなんですか?
1)表示するが、意図したものではない
2)何も表示しないか、何が出たのかよく見えない
3)その他
char *bstring() で自動変数(局所変数 (char s[256]))へのポインターを返している
(その事自体問題だが)つもりのようですが、b は一体どこを指していますか?
すいません。ビルドして実行すると次のようになります。0.8を入力してみると
次の小数0.8
を二進数表現すると0.
Press any key to continue
島さんの 1) になります。どうやったらgをどんどん2倍にしていけるんですかね?
2回目の下記ロジックはaに余りを代入するのでは?
> g=a*2.0;
関数の最後の戻り値では、変数bではなく、バッファの先頭ポインタsを戻すのでは
以上
どんどん二倍するのも問題ですが、
島さんの仰る、
> char *bstring() で自動変数(局所変数 (char s[256]))へのポインター
> を返している
> (その事自体問題だが)つもりのようですが、b は一体どこを指していますか?
も理解しないと先に進めませんよ。
たとえば、
> for(int k=0; k < 50; k++){
このループが50ではなく数回だけ回るとして、
各一行一行を実行した後で、
g や b の値がどう変わるのか、
紙に書くなどして考えてみてください。
アイススケーターさんの「関数の最後の戻り値では、変数bではなく、バッファの先頭ポ
インタsを戻すのでは」なんですが、そうしたら「warning C4172: ローカル変数またはテンポラ
リのアドレスを返します。」というエラーが出てしまうんです。
SUNさんのプログラムを簡単に修正しただけなんですが(元バグです。)
> char s[256];
static char s[256];
とするか、s[256]をグローバル変数にするか、main側にもってポインタを
bstringへ渡す等の方法があります。
恒久的変数に変えればいいんですね!皆さんありがとうございました!
staticにしちゃってホントにいいのか?
cout << bstring(1.2) << ' ' << bstring(3.4) << endl;
あ、上の例はうまくいくかも。
char* a = bstring(1.2);
char* b = bstring(3.4);
cout << a << ' ' << b << endl;