このプログラムをどうすればいいか悩んでます。 – プログラミング – Home

このプログラムをどうすればいいか悩んで...
 
通知
すべてクリア

[解決済] このプログラムをどうすればいいか悩んでます。


SUN
 SUN
(@SUN)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

0以上1未満の小数が与えられた時、その二進表現の文字列を返す関数を定義し、その動
作を確認するうという内容なんですが・・・。


引用未解決
トピックタグ
7of9
 7of9
(@7of9)
ゲスト
結合: 22年前
投稿: 14
 

ステップ1
さしあたり、2進展開を手計算では、どうやっているか考えて見る

ステップ2
その次に、手計算による手法を、プログラム化する
この手法は、なるべく機械的であるほうが、プログラム化しやすいと思います。

ステップ3
そして、そのプログラムについて、動作が思ったとおり動かない、などの現象に
遭遇したら、この掲示板で聞いてみる。

という流れになるかと思います。がんばってください。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

どうでもいいことですが。

ステップ3のときは書いたソースを全部載せると、回答が早くつくかもしれません。
このくらいのプログラムなら、全部載せてもたいした量ではないでしょうから。


返信引用
SUN
 SUN
(@SUN)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

実行できるんですが、ちゃんと表示されません。どこが悪いんでしょうか?

#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;
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> ちゃんと表示されません

どう表示されるか、ちゃんと書くのがマナーです


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

for文のなかで g はずーっと引数 a*2.0 のままですね。
g はどんどん二倍していかなければならないんじゃないのかな。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>実行できるんですが、ちゃんと表示されません。どこが悪いんでしょうか?
どういう手順で実行したのか詳しく示して下さい
チャンと表示されないということはどういうことなんですか?
 1)表示するが、意図したものではない
 2)何も表示しないか、何が出たのかよく見えない
 3)その他
char *bstring() で自動変数(局所変数 (char s[256]))へのポインターを返している
(その事自体問題だが)つもりのようですが、b は一体どこを指していますか?


返信引用
SUN
 SUN
(@SUN)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

すいません。ビルドして実行すると次のようになります。0.8を入力してみると

次の小数0.8
を二進数表現すると0.
Press any key to continue

島さんの 1) になります。どうやったらgをどんどん2倍にしていけるんですかね?


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

2回目の下記ロジックはaに余りを代入するのでは?
> g=a*2.0;

関数の最後の戻り値では、変数bではなく、バッファの先頭ポインタsを戻すのでは

以上


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

どんどん二倍するのも問題ですが、
島さんの仰る、

> char *bstring() で自動変数(局所変数 (char s[256]))へのポインター
> を返している
> (その事自体問題だが)つもりのようですが、b は一体どこを指していますか?

も理解しないと先に進めませんよ。

たとえば、
> for(int k=0; k < 50; k++){

このループが50ではなく数回だけ回るとして、
各一行一行を実行した後で、
g や b の値がどう変わるのか、
紙に書くなどして考えてみてください。


返信引用
SUN
 SUN
(@SUN)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

アイススケーターさんの「関数の最後の戻り値では、変数bではなく、バッファの先頭ポ
インタsを戻すのでは」なんですが、そうしたら「warning C4172: ローカル変数またはテンポラ
リのアドレスを返します。」というエラーが出てしまうんです。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

SUNさんのプログラムを簡単に修正しただけなんですが(元バグです。)

> char s[256];
static char s[256];

とするか、s[256]をグローバル変数にするか、main側にもってポインタを
bstringへ渡す等の方法があります。


返信引用
SUN
 SUN
(@SUN)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

恒久的変数に変えればいいんですね!皆さんありがとうございました!


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

staticにしちゃってホントにいいのか?

cout << bstring(1.2) << ' ' << bstring(3.4) << endl;


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

あ、上の例はうまくいくかも。

char* a = bstring(1.2);
char* b = bstring(3.4);
cout << a << ' ' << b << endl;


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました