こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の関数設計について

以下のようなプログラムがあり、(1)~(5)の部分を関数化せよという問題なのですが成功しません。どなたか関数化してください。できれば解説付きでよろしくお願いします。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define K_INT 32
#define K_DEC 32/*小数用*/

int main(void){
double dd;
int bi[K_INT], bd[K_DEC];
int ki,kd,q,i;

/*--------------(1)入力---------------------------*/
printf("10進数値(少数含): ");scanf("%lf", &dd);
q = (int)floor(dd);i = 0;
/*---------------ここまで(1)----------------------*/
/*---------------(2)整数部の変換------------------*/
while (q > 0){
bi[i] = q % 2;
q= q/2;
i++;
}
/*----------------ここまで(2)---------------------*/
ki = i;
/*--------------(3)整数部の表示-------------------*/
for(i=ki-1; i>=0; i = i-1)
printf("%d", bi[i]);
/*---------------ここまで(3)----------------------*/
/*---------------(4)少数部の変換------------------*/
dd = dd - floor(dd);i = 1;

while ((i < K_DEC) && (dd > 0)){
dd = dd * 2.0;
bd[i] = (int)floor(dd);
dd = dd - floor(dd);
i++;
}
/*--------------ここまで(4)-----------------------*/
kd = i-1;printf(".");
/*--------------(5)少数部の表示-------------------*/
for(i=1; i <= kd; i++)
printf("%d",bd[i]);
/*--------------ここまで(5)-----------------------*/
printf("\n");
return 0;
}

投稿日時 - 2009-01-19 21:51:02

QNo.4644120

すぐに回答ほしいです

質問者が選んだベストアンサー

まぁ、この課題をやってる時点で当たり前なんですが、関数の仮引数とか変数のスコープとかが全然理解できてないようですね。仕方ないと思いますが、ちょっと冷静になって考えてみてください。

とりあえず入り口だけ。
#3の補足にある(1)の関数化は合っているようです。標準入力から受け取ったユーザの入力した数字(小数可)を double 型で保持して戻り値として返す関数ですね。
この関数の戻り値を呼び出し元(main)でdouble型の変数に代入するようにすると値を保持することができます。ここで(2)の関数の仕様ですが、mainで保持できているdouble型変数の値を元にして、その整数部分の2進数表記をintの配列に格納する関数でしょう。
あなたの書いた i_t_unit() は dd の値をどのようにして受け取っていますか? また、変換結果を格納した bi[] は i_t_unit() のローカル変数なので、この関数が終了した時点でアクセスできなくなります。これでは変換した意味がありませんね。
そのあたりから考えて、変数のスコープ(有効範囲)やメモリ上のあり方を理解できれば正解にたどり着くと思いますよ。

# どうでもいいけど、関数のアウトプットが配列なのは
# この課題のテーマから外れているような気がするんだがなぁ。

投稿日時 - 2009-01-20 11:58:25

ANo.4

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

(1)-(5)の関数で引数はどうすればいいのか、結果をどのように返すのか明示しましょう

また、トライしたソースがあるなら支障のない範囲で公開してみましょう
(1)なら doubleを返す引数無しか、質問文を引数に取るなどが考えられます

投稿日時 - 2009-01-19 23:30:50

補足

すみません。記述不足でした。(1)番目の範囲指定も間違っていました。引数をどうするか具体的な明示はありません。結果をどのように返すかですが、
(1)では10進数の小数(整数可)を読み込んで返す。
(2)では整数部を2進に変換した値を返す。
(3)では整数部を表示する。
(4)少数部2進変換
(5)少数部表示
と自分は考えています。
以下にトライしたソースを記述します。
(1)
double input_unit(void){
double dd;
printf("10進数値(少数含): ");
scanf("%lf", &dd);
return(dd);
}
(2)
int i_t_unit(int q,int i){
int bi[K_INT];
q = (int)floor(dd);
i = 0;
while (q > 0){
bi[i] = q % 2;
q= q/2;
i++;
}
}
(3)void i_e_unit(int ie){
for(i=ki-1; i>=0; i = i-1)
printf("%d", bi[i]);
}
間違いが多いかもしれませんがよろしくお願いします。

投稿日時 - 2009-01-20 05:43:55

ANo.2

> どなたか関数化してください。

課題の丸投げは禁止されています。

投稿日時 - 2009-01-19 22:44:50

ANo.1

>成功しません。

ということは、何らかのチャレンジはなさっているのですね?
その、チャレンジなさったときのソースコードを見せてください。

投稿日時 - 2009-01-19 22:00:43

補足

すみません。(1)と(2)の範囲指定が1行ずれていました。
正しくは、
/*--------------(1)入力---------------------------*/
printf("10進数値(少数含): "); scanf("%lf", &dd);
/*---------------ここまで(1)----------------------*/
で、
/*---------------(2)整数部の変換------------------*/
q = (int)floor(dd); i = 0;
while (q > 0){
bi[i] = q % 2;
q= q/2;
i++;
}
/*----------------ここまで(2)---------------------*/
です。すみません。チャレンジしたソースコードは
(1)
double input_unit(void){
double dd;
printf("decimal number: ");
scanf("%lf", &dd);
return(dd);
}
(2)
int i_t_unit(int q,int i){
int bi[K_INT];
q = (int)floor(dd);
i = 0;
while (q > 0){
bi[i] = q % 2;
q= q/2;
i++;
}
}
(3)void i_e_unit(int ie){
for(i=ki-1; i>=0; i = i-1)
printf("%d", bi[i]);
です。

投稿日時 - 2009-01-20 05:47:21

あなたにオススメの質問