はじめまして。専門学生の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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- JavaScript jsで、配列内の文章を改行する際どのようにすればいいですか。 3 2022/07/05 20:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語クイックソートの比較総回...
-
javascriptでhiddenに二次元配...
-
ラジオボタンの選択で解答・点...
-
クイズ作成:15個の問題から5個...
-
jQueryの戻り値がうまくいかな...
-
チェックボックスのグループ化...
-
ホームページビルダーVer6で、...
-
プルダウンで作文!?
-
チェックボックスやラジオボタ...
-
フォームの必須項目を埋めるま...
-
■int型の数値から数字文字への...
-
ラジオボタンとテキストを同時...
-
セルの色>何が足りないのでし...
-
onchangeイベントを強制的に発...
-
JavaScript ログアウト処理
-
ラジオボタン未チェックの場合...
-
Tablesorteを2行一組でソートする
-
テキストボックスの中身を選択...
-
テーブルの項目の値取得
-
セレクトメニューで選択された...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
value内に変数を入れたい
-
hiddenのvalueの値を変えたい
-
javascriptでhiddenに二次元配...
-
複数のsubmitボタンで押された...
-
テキストボックスに入力された...
-
switchを使って四則演算のプロ...
-
VB.NET DateTimeの型について
-
C言語クイックソートの比較総回...
-
クイズ作成:15個の問題から5個...
-
セレクトボックスの初期選択状...
-
ラジオボタンの選択で解答・点...
-
子から親へチェックボックスの...
-
ラジオボタンと連動して文字列...
-
setIntervalの間隔を途中で変更...
-
JAVASCRIPTで、ボタンを押した...
-
sessionStorageを調べています。
-
クリックの度に加算していくには?
-
マクロ オブジェクト変数With...
-
3桁区切りのカンマをつけたい...
-
selectboxのoptionタグのvalue...
おすすめ情報