はじめまして。専門学生のhide1978と申します。
今回、以下のような問題に取り組んでいるのですが、どうしても正しい結果が得られません。どなたか知恵を授けてやってください。よろしくお願いいたします。
■問題
int型の数値(-32767から32767)を入力して、そのまま10進文字列(char型)として変換する。
■私が書いたプログラム
#include <stdio.h>
int NUMtoCHAR(int c){
if(c >= 0 && c <= 9)
return (c+'0');
else
return c;
}
void main(void){
signed int i_value;
int count, i;
double f_value;
char c[9];
printf("入力データ:");scanf("%d",&i_value);
printf("\n");
for(i = 0; i < 9; i++)c[i] = ' ';
if(i_value > 0){
c[0] = '+';
}else if(i_value < 0){
c[0] = '-';
}
f_value = (double)i_value;
count = 0;
while(f_value >= 1){
f_value = f_value / 10.0;
count++;
}
if(count == 0){
c[2] = '0';
}else{
for(i = 2; count > 0 && i < 9; count--, i++){
f_value = f_value * 10.0;
i_value = f_value;
c[i] = NUMtoCHAR(i_value);
f_value = f_value - i_value;
}
}
printf("10進文字 = ");
for(i = 0; i < 9; i++)printf("%c", c[i]);
printf("\n");
}
上記プログラムを実行して、入力データとして[32767]を入力すると、結果が[32766]となってしまいます。同じように[34]を入力すると[33]という結果になります。
elseの中に入れ子になっているfor文が怪しいということまでは判るのですが、どのように修正してよいか判りません。
大変長い質問で恐縮ですが、よろしくお願いいたします。
■環境
OS:WindowsXP
Compiler:Borland C++ 5.5.1 fowWin32
No.1ベストアンサー
- 回答日時:
入力した数字の桁数を数えた後、f_valueはどうなっていますか?
整数と浮動小数の共存では丸め込みなど行われますので
正確な計算ができくなることは多々あります。
せっかくですから、デバッガの使い方を覚えてf_valueをモニタしながらステップ実行してみましょう。
簡単に整数をcharに変換するには、sprintf関数を使うことです。
早速の回答ありがとうございます。
なるほど・・・丸め誤差が原因だったんですね。知識としては理解していたつもりなんですが、気がつきませんでした。
実際に、for文内にある
i_value = f_value;
の下に
printf("%d\n", i_value);
を挿入し、入力として[32767]を与えて実行してみたところ、[7]と表示されるべき最後の桁が[6]と表示されていました。
あと、教えていただいたsprintf関数を使って見たいのですが、私が持っている書籍にはsprintf関数に関する記述が無く、どのように使用してよいのかわかりません。ネットでも検索してみたのですが、どのサイトも中級者以上を対象に書かれていて、初心者の私には理解できませんでした。
今回のプログラムで以下のような実行結果を得たい場合には、sprintf関数をどのように使えばよいのでしょうか。
■入力として[-32768]を与えた場合の実行結果
入力データ:-32768
10進文字列 = - 32768
追加質問で申し訳ありませんが、暇なときにでも簡単なサンプルを添えて教えていただけると大変あり難いです。よろしくお願いいたします。m(__)m
No.3
- 回答日時:
sprintfは、printfの拡張の関数です。
hide1978さんのプログラムにあてはめると、
sprintf( c, "%+d", i_value );
と書けばOKです。
printfの書式の第一引数に文字列を格納するための
char型配列を配置すれば良いだけです。
お返事が遅れて申し訳ありません。
教えていただいた書式を参考に新しくプログラムを組みなおし、何とか目的にかなうプログラムを組むことが出来ました。
今回の質問で新しい発見がいくつもありました。ご回答いただいたtakebouさんとuyama33さんには大変感謝しています。本当にありがとうございました。m(__)m
No.2
- 回答日時:
sprintf については、
ボーランドの統合環境のヘルプで
キーワード検索
として
キーワードのタグ
を選んで sprintf として
検索すれば
書式、などがでてきます。
または、別売りの
マニュアル(高価です)
もあるのではないでしょうか?
もし、ヘルプがインストールしてなかったら
追加でインストールしてください。
回答ありがとうございます。お礼が遅くなって申し訳ありません。
ヘルプの件ですが、残念ながら私が使っているのはフリーの[Borand C++ 5.51 for win32]ですからヘルプは付属していません。sprintf関数に関しては、もう少し自分で調べてみようと思います。ありがとうございました。m(__)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスに入力された...
-
ラジオボタンの選択で解答・点...
-
value内に変数を入れたい
-
IEだと良いがFireFoxだと動作し...
-
setIntervalの間隔を途中で変更...
-
【続】ダミーフォームの内容を...
-
セレクトボックスの初期選択状...
-
Jqueryを使って値の合計を簡単...
-
プルダウン 項目が多いので先頭...
-
dijit.form.ComboBoxについて
-
return trueとreturn falseの用...
-
javascript による POST 送信時...
-
プルダウンメニューを表の中に...
-
VBSでブラウザ上のテキストボッ...
-
追加ボタンを押した際に ok ボ...
-
netscapeでもinnerTextやinnner...
-
tableの任意行にfocusをあてる
-
submitするとなぜか2度実行する
-
JavaScriptで特定のtdタグにcla...
-
VBScriptでHTMLのセレクトボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
value内に変数を入れたい
-
UART通信の取説で,left floati...
-
javascriptでhiddenに二次元配...
-
hiddenのvalueの値を変えたい
-
VB.NET DateTimeの型について
-
テキストボックスに入力された...
-
CDOMailで本文テキストの文字コ...
-
setIntervalの間隔を途中で変更...
-
javascriptにてHTMLのhiddenエ...
-
ラジオボタンの選択で解答・点...
-
子から親へチェックボックスの...
-
フォームで入力した値を別のフ...
-
複数のsubmitボタンで押された...
-
selectboxのoptionタグのvalue...
-
Pythonで会員サイトの自動ログ...
-
クイズ作成:15個の問題から5個...
-
どのボタンがクリックされたの...
-
eval()を使わずに数値を取得し...
-
VBAをJavaScriptに変換したいです
-
ホームページビルダーのスクリ...
おすすめ情報