case4をキャストしたい方法と注意点

このQ&Aのポイント
  • case4をキャストする方法と注意点について教えてください。
  • case4をキャストするにはどこにdoubleをつければよいのか教えてください。
  • josan(na/nb)の前にdoubleをつけてもうまく表示されません。どこにdoubleをつければよいのでしょうか。
回答を見る
  • ベストアンサー

教えてください

case4をキャストしたいのですが、どこにdoubleをつければよいのですか?josan(na/nb)の前においたのですがうまく表示されませんでした。教えてください。 #include <stdio.h> int kasan(int a, int b) { return(a+b); } int gensan(int a, int b) { return(a-b); } int jousan(int a, int b) { return(a*b); } int josan(int a, int b) { return(a/b); } int main(void) { int na, nb, nc; puts("二つの整数を入力してください"); printf("整数A"); scanf("%d", &na); printf("整数b"); scanf("%d", &nb); printf("1:加算\n2:減算\n3:乗算\n4除算\n"); printf("1から4までのどれかを入力してください"); scanf("%d", &nc); switch(nc){ case 1: printf("%d+%dは、%dです。\n", na, nb, kasan(na,nb)); break; case 2: printf("%d-%dは、%dです。\n", na, nb, gensan(na,nb)); break; case 3: printf("%d*%dは、%dです。\n", na, nb, jousan(na,nb)); break; case 4: printf("%d/%dは、%fです。\n", na, nb, josan(na,nb)); break; default: printf("番号が違います。\n"); break; } return(0); }

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

  • ベストアンサー
  • Ki4-U2
  • ベストアンサー率81% (364/446)
回答No.1

まずご質問の趣旨を確認させてください。 たとえば整数Aに10、整数bに3を入力して、4(除算)のときに、 10/3は、3.3333333です。 のように表示させたい。しかし case 4: printf("%d/%dは、%fです。\n", na, nb, (double)josan(na,nb)); break; としても 10/3は、3.00000000です。 のように小数点以下が切り捨てられてしまう。 ということでよろしいでしょうか? そうだとして回答します。 int josan(int a, int b) { return(a/b); } を double josan(int a, int b) { return((double)a/b); } とすればいいとおもいます。case 4: の行はもとのままです。 ポイントは二つ、 (1)josan() の戻り値を、整数型 int ではなく浮動小数点型 double とする。  でないと、下記(2)で、中身(除算結果)が double になったとしても、戻るときに整数化(たぶん)されてしまいます。 (2)整数型同士の加減乗除は整数型になる。一方でも浮動小数点型なら浮動小数点型になる。  そこで return のところで a をキャストするわけです。 ( return((double)a/(double)b); return(a/(double)b); でも結果は同じはず)

関連するQ&A

  • 教えてください!!

    このソースを実行しても、1~4を選んでも足し算になってしまいます。どこが違っているか、教えてください。 int main(void) { int na, nb, nc; printf("二つの整数の演算を行います。\n"); printf("二つの整数を入力してください\n"); printf("整数A"); scanf("%d", &na); printf("整数B"); scanf("%d", &nb); printf("1:加算\n2:減算\n3:乗算\n4:除算\n"); printf("1~4のどれかを入力してください。"); scanf("%d", &nc); switch(nc) { case1: printf("%d + %dは、%dです。\n", na, nb, na + nb); break; case2: printf("%d - %dは、%dです。\n", na, nb, na - nb); break; case3: printf("%d * %dは、%dです。\n", na, nb, na * nb); break; case4: printf("%d / %dは、%dです。\n", na, nb, na / nb); break; default: printf("%dは番号が違います。\n"); } return(0); }

  • C言語について

    「条件演算子(a?b:c)を使って、三つの整数値を読み込んで、その最小値を求めて表示するプログラムを作成せよ」という問題を初心者なりに自分で以下のように解いてみたのですが、もっと簡単に表示できるプログラムがあれば教えてください。 #include<stdio.h> int main(void) { int na,nb,nc,min; printf("整数1:"); scanf("%d",&na); printf("整数2:"); scanf("%d",&nb); printf("整数3:"); scanf("%d",&nc); (na<nb)?min=na:min=nb; printf("最小値は%dです。\n",(nc<min)?min=nc:min); return 0; }

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • 初心者です。

    以下のソースの説明ですが、例えばnaに5、nbに4を入れたとき、 実行後の表示として  5+6+7+8=26 となるようにしたいのですが、できません。 教えてください。 #include <stdio.h> int main(void) { int sum = 0; int na,nb; printf("整数A:"); scanf("%d",&na); printf("整数B:"); scanf("%d",&nb); /*nbは回数*/ for ( na; na <= nb ;na++){ sum = sum + na; } printf("%dです。\n",sum); return(0); }

  • c言語超初心者です。教えてください

    基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。

  • 教えてください

    swap関数のprintf("変数名naアドレスは%pです。\n", nx); printf("変数名nbのアドレスは%pです。\n", ny);のnx, nyは、&nx, &nyとしなくていいのですか?同様にswap関数のn1,n2に関しても宜しくお願いします。あと、swap(n1,n2)もどうして&をつけないか教えてください。 #include <stdio.h> void swap (int *nx, int *ny) { int temp = *nx; printf("変数名naアドレスは%pです。\n", nx); printf("変数名nbのアドレスは%pです。\n", ny); *nx =*ny; *ny = temp; } void sort2 (int *n1, int *n2) { printf("変数naのアドレスは%pです。\n",n1); printf("変数nbのアドレスは%pです。\n",n2); if (*n1 >*n2) swap (n1, n2); } int main(void) { int na, nb; puts("二つの整数を入力してください。"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("変数naのアドレスは%pです。\n",&na); printf("変数nbのアドレスは%pです。\n",&nb); sort2 (&na, &nb); return (0); }

  • C言語の課題で困っています。その1.四則演算

    二つの整数値を読み込んで、前者を後者で割り、その結果の商と余りを表示するプログラムを作成。 実行例にあるよう、ゼロで割るような場合への対処も考慮する。 実行例1: 整数の除算を行います。整数を入力してください。 整数A:13 整数B:5 13 ÷ 5 = 2 あまり 3 実行例2: 整数の除算を行います。整数を入力してください。 整数A:10 整数B:0 0でわることはできません! (注)プログラム実行時にキーボードからどんな整数を入力してもいいように作成すること。 という課題に取り組んでいますが、途中までしか記述できません。 どなたか助けてください。 下記が途中までの記述です。 /*二つの整数値を読み込んで、前者を後者で割り、その結果の商と余りを表示*/ #include <stdio.h> int main(void) { int na, nb; printf("shimasaki kazunori \n"); puts("整数の除算を行います。整数を入力してください。: \n"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("na ÷ nb = %d あまり %d \n", na / nb, nb, na % nb); return(0); }

  • わかりません・・・。

    二つの自然数を引数として与えられて,それらの最大公約数を返す関数 int gcd(int m, int n) { /* … */ }を作成し,それを利用して入力された二つの正整数の最大公約数を求めるプログラムを作り方を教えてください。 ユークリッドの互除法を使い、関数を使う事が条件なのですが全然わかりません。 #include<stdio.h> int gcd(int m, int n) if(m>n) {m%n}            if(m%n==0) printf("最大公約数は%d",n); ←このあたりがわかりません else if (n%(m%n)) printf("最大公約数は%d",n%(m%n)); int main( void ) { int na, nb; puts(""二つの整数を入力してください。); printf("整数1:"); scanf("%d",na); printf("整数2:"); scanf("%d",nb); printf("最大公約数は%dです。\n",gcd(int m, int n)); return0; }

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • Cのプログラミングを勉強中です。

    Cのプログラミングを勉強中です。 Aの値のBに対する割合を表示すしたいのですが、以下のように記述してもうまくいきません。 どこを直したらよいか教えていただけますか。 #include <stdio.h> int main(void) { int n1 , n2 ; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d", &n1); printf("整数B:"); scanf("%d", &n2); printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 ); return(0); }

専門家に質問してみよう