• ベストアンサー

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

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

  • ベストアンサー
  • VOT
  • ベストアンサー率45% (11/24)
回答No.4

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

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

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

atherine2
質問者

補足

すみません。記述不足でした。(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]); } 間違いが多いかもしれませんがよろしくお願いします。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> どなたか関数化してください。 課題の丸投げは禁止されています。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

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

atherine2
質問者

補足

すみません。(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]); です。

関連するQ&A

  • C言語_関数宣言_fprintfです!お願いします!!

    C言語(C言語_関数宣言_fscanf)に関する質問です。 main関数とは別に新しく自分で関数を定義しました。 (keisan関数とします。) keisan関数の中に「fprintf」を用いたのですが上手くいきません。 (printfは通常通りに働きます。) どのような理由が考えられるでしょうか? (グローバル変数などの理由でしょうか?) どうか,ご指導お願いします!! #include <stdio.h> void kiroku(int ki1,int ki2){ printf("%d-%d\n",ki1,ki2); fprintf(fo,"%d-%d\n",ki1,ki2); /*↑このfprintfです*/ } int main(){ char *fnmo="kiroku.txt"; FILE *fo; int n,i; // open files. fo = fopen(fnmo,"w"); if(fo==NULL) { printf("NG\n"); return 0; } // read and store. n=1; i=2; kiroku(n,i); // close files. fclose(fo); return 0; }

  • C言語の問題

    自分の生まれた日から、今日までの生存日数を求めよ。(但し、うるう年なども計算するプログラム)という問題を提示されたのですが、ぜんぜんわかりません。どなたか上記プログラムがわかる方、ご教授お願いいたします。 #include<stdio.h> int main(void) { int table1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int table2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int mm,dd,i,day=0; /*(1)指定月日までの日数計算*/ do { printf("月>"); scanf("%d",&mm); if(mm>=1 && mm<=12)break; printf("月(%d)は誤りです。\n",mm); }while(1); do { printf("日>"); scanf("%d",&dd); if(dd>=1 && dd<=table1[mm])break; printf("日(%d)は誤りです。\n",dd); }while(1); for(i=1;i<mm;i++) day += table1[i]; day += dd; printf("1/1から%d/%d迄の日数は%d日です。\n",mm,dd,day); return 0; } ↑参考までにこんなプログラムでやっています。

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語

    以下を出力するとどのような結果が得られますか? #include <stdio.h> const int N=10; void subroutine(int k, int x[ ]); int main (void){ inta[11],b[11]; int i,k; for (i=1; i<=N); i++){ a[i]=i; b[i]=0; } for(k=1; k<=N; k++){ subroutine(k,a); printf("k=%2d,%5d\n",k,a[k]); } return 0; } void subroutine(int k, int x[ ]){ int i,s; i=0; s=0; while(++i<=k) s=s+x[i]; x[k]=s; return; }

  • C言語プログラム 配列

    C言語プログラム初心者です。以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 #include<stdio.h> int func(int a[ ],int b[ ],int n); main(){ int i,k; static int a[12] ={1,2,3,4,5,(省略)・・・,12};  static int b[12] ={21,22,23,24,(省略)・・・,32}; k = func(a,b,6); k = func(b+3,a+3,6); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\n = b"); for(i=0;i<12;i++)printf("%d",b[i]); printf("\n k = %d\n",k); } int func(int a[ ],int b[ ],int n){ int i,x=0; for(i=0;i<n;i++);{ a[i] = b[i]; x = x+a[i]; } return(x); } 結果: a = 21 22 23 .... 26 7 8 9 10 11 12 b = 21 22 23 .... 26 7 8 9 30 31 32 k = 99

  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • C言語についてなのですが、

    C言語についてなのですが、 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<search.h> int main(void) { int i,j,k,temp,n,count,time,list[65537]; clock_t startTime, endTime; printf("取得する乱数の個数を入力してください\n"); scanf("%d",&n); srand((unsigned)time(NULL)); printf("Before sort\n"); startTime = clock(); for(i = 0; i < n; i++) { list[i] = rand(); /* printf("%d\n", list[i]);*/ } count = 0; for (i = 1; i < n; i++) { for (j = i; j < n-i-1; j++) { count++; if(list[j] < list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } endTime = clock(); printf("\nAfter sort\n"); for(k = 0; k < n; k++) { /* printf("%d\n", list[k]);*/ } printf("\n比較回数:%d\n", count); printf("実行時間:%.4f秒\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); return 0; } 上記のソースコードをcygwinで gcc -Wall -o k5-1-2 k5-1-2.c でコンパイルしようとすると k5-1-2.c:関数'main'内 k5-1-2.c:14:error:called object is not a function と表示されます。 いろいろなサイトを参考にして乱数取得用に srand((unsigned)time(NULL));を使うように書かれていたので使っているのですが、何かだめなのでしょうか?自分ではお手上げ状態で。

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓