• ベストアンサー
  • 困ってます

プログラミング 返り値

#include <stdio.h> int sumn(double a); int main(void) { double b, answer; while(1){ printf("Input a number:"); scanf("%lf",&b); answer = sumn(b); printf("(4*3.14*a*a*a)/3=%f\n",answer); } return 0; } int sumn(double a){ double sum; sum=(4*3.14*a*a*a)/3; return sum; } これを実行してもwarning C4244: 'return' : conversion from 'double ' to 'int ', possible loss of dataと出てしまい小数点を切り捨てて表示されてしまいます。 どこが間違っているのでしょうか? 教えてくださいm(_ _ )m

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数214
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.2

「どこが間違っているのでしょうか?」  「int sumn(double a){」の行。もっと詳しく言えば、最初の3文字。プログラムは指定された通りの動作をしているだけですよ。  関数における引数と返値には、一切関連性はないのですよ。Excelにだって、文字列を渡したら、文字列の長さを整数値で返す関数があるのですから。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

わかりました。ありがとうございましたm(_ _ )m

関連するQ&A

  • プログラミングのエラー修正

    抵抗R、コイルL、コンデンサCの値を与え、これらRLC直列回路の複素インピーダンスを共振周波数の1/10~10倍程度の範囲で数値計算し、データの組として出力するプログラムを作成するために、 #include <stdio.h> double resonance(double x,double y) { return(1/2*3.14*(x*y)^(1/2); } int main(void) { double r,l,c; double r_abs,l_abs,c_abs; double R; double f0; printf("put r"); fflush(stdout); scanf("%lf",&r); printf("put l"); fflush(stdout); scanf("%lf",&l); printf("put c"); fflush(stdout); scanf("%lf",&c); if(l==0||c==0){ R=0,X=0; } if(l<0){ r_abs=r; l_abs=-l; c_abs=c; } if(c<0){ r_abs=r; l_abs=l; c_abs=-c; } if(r<0&&c<0){ r_abs=r; l_abs=-l; c_abs=-c; } f0=resonance(l_abs,c_abs); double n[]={f0/10,f0*2/10,f0*3/10,f0*4/10,f0*5/10,f0/10,f0*6/10,f0*7/10,f0*8/10,f0*9/10,f0,f0*2,f0*3,f0*4,f0*5,f0*6,f0*7,f0*8,f0*9,f0*10}; R=r_abs; double X[]=(n[]*2*3.14*l_abs)-1/(l_abs*)*c_abs; printf("周波数%d,Z=%lf+j%lf",n[],R,X[]); return 0; } のようなプログラムを書いたのですが、if(l==0||c==0){ R=0,X=0; } double n[]={f0/10,f0*2/10,f0*3/10,f0*4/10,f0*5/10,f0/10,f0*6/10,f0*7/10,f0*8/10,f0*9/10,f0,f0*2,f0*3,f0*4,f0*5,f0*6,f0*7,f0*8,f0*9,f0*10}; double X[]=(n[]*2*3.14*l_abs)-1/(l_abs*)*c_abs; printf("周波数%d,Z=%lf+j%lf",n[],R,X[]);return(1/2*3.14*(x*y)^(1/2); にエラーが出てしまうのですがなぜだかわからないので、教えていただけませんか?

  • C言語に詳しい方、教えていただけませんか?

    n個の実数をキーボードから入力して総和を求めるプログラムを書いたのですが、結果が+NANとなってしまいます。 また、値をキーボードから入力する際、小数にするとすぐにプログラムが終了してしまいます。例えば、a[0]=1.0とすると、 a[1]=a[2]=a[3]=a[4]=合計は+NANと表示され終了してしまいます。 ちゃんと小数を入力でき、結果も正しく表示されるように間違いを指摘していただけませんか?よろしくお願いします。 (nは5としました) #include <stdio.h> #define n 5 double souwa(double a[n]); int main(void) { int i; double sum, a[n]; for(i=0; i<=n-1; i++){ printf("a[%d] = ",i); scanf("%d",&a[i]); } sum = souwa(a); printf("合計は%f\n",sum); return 0; } double souwa(double a[n]) { int i; double sum = 0.0; for(i=0; i<=n-1; i++){ sum += a[i]; } return sum; }

  • while文でπ/4の近似値を求める

    π/4=1-(1/3)+(1/5)-(1/7)+(1/9)-(1/11)+...... 上式でπ/4を求める時、第何項まで求めれば 3.14159/4との差の絶対値が0.0001より小になるか その項数とそのときのπ/4の近似値を求めよ という問題なんですが、 3.14159/4との差の絶対値が0.0001より小になるという 部分がわかりません・・。 私は、3.14159を4で割ったものが0.7853975を使って 下のようにしたのですが、うまくできません。 上式のようにプラスとマイナスが繰り返される場合 sum=-sumという風にするというのは習ったのですが・・ 計算式だとうまくいきません・・・ 初心者でプログラミング始めたばかりなので わかりやすく教えていただけると嬉しいです。 私の作ってみたプログラムは一応こんな感じです。 #include<stdio.h> #include<conio.h> int main(void){ int k,i=0; double sum; sum = 0,0; printf("k = "); scanf("%d",&k); while(0.7853975-sum<0.0001){ i++; sum=-sum; sum=(double)1/((2*i)-1); } printf("第%d項までの和は%f\n",k,sum); getch(); return 0; }

その他の回答 (1)

  • 回答No.1
  • k_kota
  • ベストアンサー率19% (434/2186)

int sumn(double a); この文の各部分がそれぞれどういう意味を持っているのか説明してみてください。 それですべて解決します。 答え教えてもいいけどつまらないので、個人的にはこれで留めておきます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

わかりました。ありがとうございましたm(_ _ )m

関連するQ&A

  • プログラミングC言語

    プログラミングC言語の問題で、 「ベクトルの内積を用いて、2つのベクトルの成す角度を求めるプログラムを作成せよ。」 という問題をやっていて、以下の画像のような答えになるのですが、上手くいきません。 どのようにすればいいのでしょうか? 作ったソースコード #include<stdio.h> #include<math.h> double naiseki(int *vecterA, int *vecterB) { double rad, deg; rad = acos( (vecterA[0]*vecterB[0] + vecterA[1]*vecterB[1]) / ( sqrt((double)(vecterA[0]*vecterA[0] + vecterA[1]*vecterA[1])) * sqrt((double)(vecterB[0]*vecterB[0] + vecterB[1]*vecterB[1])) ) ); deg = rad/3.141592*180; return deg; } int main(void) { double va[2]; double vb[2]; printf("v1_x:"); scanf("%lf", &va[0]); printf("v1_y:"); scanf("%lf", &va[1]); printf("v2_x:"); scanf("%lf", &vb[0]); printf("v2_y:"); scanf("%lf", &vb[1]); puts("内積から求めたベクトルの角度は"); printf("%f",naiseki(va,vb)); puts("です。"); return(0); } 最後のnaiseki(va,vb)のところで互換性がありませんと でてしまいます。 double naiseki のソースコードはこのままでプログラムが 動くようにしてほしいです。 よろしくお願いします!

  • プログラムを上手く動かすには…

    #include<stdio.h> #include<stdlib.h> double sumf(int n,double *ds); int main(){ double a,b; double df=0.7 int n; double *ds; double *z; int size; printf("Input two numbers -> "); scanf("%lf%lf",&a,&b); printf("n"); size = sizeof(*ds)*(1+(int)((b z = ds = (double*)malloc(size); n = 0; while(a<=b){ *z = a; a += df; printf("%.1f",*z++); n++; } printf("n"); printf("n"); printf"sumf = %.1fn",sumf(n,ds)); return 0; } double sumf(int n,double *ds){ double sum = 0; while(n){ sum += *ds; n--; } return sum; } 入力された二つの実数a,b(a<b)をもとに、aからbまで0.7ずつ増加する数値の配列を作り、その配列の合計を求める関数sumfを作りなさい。ただし、配列を作る、配列の合計を求める箇所はポインタを使うこと。 【ヒント】 ・プログラムの構成 mainで配列要素の作成、配列の表示、関数sumf呼出し、sumの表示。 関数sumfで配列の合計を求めreturnで合計値を返す。 ・引数の考慮点 実数の配列だけでなく配列の要素数も引数として渡す必要がある。 宜しくお願いします。 どこが違うのでしょうか?

  • 桁落ちのプログラムで真の値と計算結果

    #include <stdio.h> const double PI=3.141592653589793; double sum(long m) { double n,term,sum; n=1; sum=0; term= 1.0/ (n*n);/*初項*/ while( n<=m ){ sum+=term; n++; term= 1.0/ (n*n);/*次項の計算*/ } return sum; } /*この計算の答えはπ*/ int main(void) { double s; long m; int i; m=1; for(i=0;i<9;i++){ s=sum(m); printf("%2d m=%10ld sum= %22.16e err= %22.16e \n",i,m,s,s-PI*PI/6); m*=10;/*次は10倍にする*/ } return 0; で真の値と計算結果を調べるにはどうしたらいいのでしょうか?

  • 桁落ちの誤差について

    #include <stdio.h> const double PI=3.141592653589793; double sum(long m) { double n,term,sum; n=1; sum=0; term= 1.0/ (n*n);/*初項*/ while( n<=m ){ sum+=term; n++; term= 1.0/ (n*n);/*次項の計算*/ } return sum; } /*この計算の答えはπ*/ int main(void) { double s; long m; int i; m=1; for(i=0;i<9;i++){ s=sum(m); printf("%2d m=%10ld sum= %22.16e err= %22.16e \n",i,m,s,s-PI*PI/6); m*=10;/*次は10倍にする*/ } return 0; のプログラムで誤差が生じる理由ってなんなんでしょうか?

  • 計算後に配列の中身が入れ替わってしまう

    内容を見ていただき、ありがとうございます。私は現在Cを勉強中で、練習の一環として次のようなプログラムを作っていました。 このプログラムは、2つのグループの人数をキーボードから入力して、それぞれのグループの割合を表示するというものです。そこで私の書いたソースは以下の通りです。 /****************** #include<stdio.h> main(){ double score[2]; int i = 0; double sum; ++i; printf("グループ%dの人数:",i); scanf("%lf",&score[i]); ++i; printf("グループ%dの人数:",i); scanf("%lf",&score[i]); sum = score[1] + score[2]; score[1] = score[1] / sum *100; score[2] = score[2] / sum *100; printf("人数の割合は\nグループ1 グループ2\n"); printf("%9.1lf%%%9.1lf%%",score[1],score[2]); return 0; } ***************/ ソースを見る限り、それぞれのグループの割合が表示されるはずだと思ったのですが、これを実行するとグループ2の割合が常に100%になってしまいます。検証してみますと、16行目の sum = score[1] + score[2]; のあとでscore[2]の人数がsumと入れ替わっているようです。この原因は、配列を0から始めなかったことと関係があるのではないかと思い、末尾のプログラムのように配列の開始番号を0からにすると狙い通りに作動しました。 しかし、未だに何故このような動きになるのかがわかりません。このような事態をどのように表現して良いのかもわかりませんので、検索もできませんでした。 そこで、どなたかこの現象についてご存知の方がいらっしゃいましたら、ご教授願えないでしょうか。よろしくお願いいたします。 /********************* #include<stdio.h> main(){ double score[2]; int i = 0; double sum; printf("グループ%dの人数:",i+1); scanf("%lf",&score[i]); ++i; printf("グループ%dの人数:",i+1); scanf("%lf",&score[i]); ++i; sum = score[0] + score[1]; score[0] = score[0] / sum *100; score[1] = score[1] / sum *100; printf("人数の割合は\nグループ1 グループ2\n"); printf("%9.1lf%%%9.1lf%%",score[0],score[1]); return 0; } ***********/

  • ビルドが失敗してしまいます

    最近C言語を勉強を始めまして、参考書に載っていた以下のソースプログラムをvisualC++2010に打ち込んだのですがビルドが成功しません #include <stdio.h> #include <math.h> int main(void) { int d[33]; double m,v,s; int n=33; int i; double sum; printf("データを%d個入力してください\n",n); for(i=0;i<n;i++) { printf("date %d=",i+1); scanf_s("%d",&d[i]); } for(sum=0.0,i=0;i<n;i++) { sum+=d[i]; } m=sum/n; for(sum=0.0,i=0;i<n;i++) { sum+=(d[i]-m)*(d[i]-m); } v=sum/n; s=sqrt(v); printf("平均=%10.3f\n",m); printf("分数=%10.3f\n",v); printf("標準偏差=%10.3f\n",s); return 0; } エラーメッセージは ・'scanf' の宣言を確認してください。 ・(11): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません ・(14): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません ・(14): error C2065: 'i1' : 定義されていない識別子です。 と出るのですがさっぱりわかりません。どなたか教えてください。

  • CからVB

    以下のプログラムはC言語で作成されています。 これをVBで作成したいです。 教えてください。 #include <stdio.h> #include <stdlib.h> double *alloc(int r,int n,int m); void input(double *p,int r,int n,int m); void sumup(double *p,int r,int n,int m); int main(void){ int r, n, m; double *p; // 行列サイズ入力 printf("input r n m "); scanf("%d %d %d",&r,&n,&m); // 行列領域取得 p = alloc(r,n,m); // 行列要素入力 input(p,r,n,m); // 行列の和 sumup(p,r,n,m); //終了,行列領域解放 free(p); return 0; } double *alloc(int r,int n,int m){ double *p; printf("MATRIX[r=%d][n=%d][m=%d]\n\n",r,n,m); p = (double*)malloc(sizeof(double)*r*n*m); if( p == NULL){ printf("error! malloc failed.\n"); exit(-1); } return p; } void input(double *p,int r, int n,int m) { int i,j,k; for(i = 0; i < r; i++){ for(j = 0;j < n; j++){ for(k = 0; k < m; k++){ printf("input MATRIX[%d][%d][%d]= ",i,j,k); scanf("%lf",&p[i*(n*m)+j*m+k]); } } } printf("\n"); } // 行列の和 void sumup(double *p,int r,int n,int m){ int i, j, k; // 0.0, not 0!!! double sum = 0.0; printf("sum of %d matrices:\n",r); for(j = 0; j< n; j++){ for(k = 0;k < m; k++){ sum=0; for(i = 0;i < r;i++){ sum += p[i*(n*m)+j*m+k]; } printf("\n%2f",sum); } } printf("\n"); }

  • 数値計算法を勉強しているんのですが…

    Shimpson公式を用いて計算したときに何故mが大きいところで誤差が大きくなりました。プログラムは下に示しました。なぜこのような結果になったか分かりません。 #include <stdio.h> #include <math.h> #define PI 3.141592653589793 double sum(long m) { double n,sum,h,x; h=(PI/2)/m; sum=0; n=0;x=0; while( n<m ){ sum+=2*sin(x);/*項の加算*/ sum+=4*sin(x+h/2); n++; x+=h; } sum+=-sin(0)+sin(PI/2); sum*=h/6; return sum; } int main(void) { double s; long m; int i; m=1; for(i=0;i<8;i++){ s=sum(m); printf("%2d m=%10ld sum= %22.16e err= %22.16e \n",i,m,s,s-1.0); m*=10;/*次のmは10倍*/ } return 0; }

  • 数値の連続入力終了条件について

    C言語初心者です。よろしくお願いします。 早速質問なのですが、while文を使ったscanf()関数による数値連続入力で、 ◎1---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;      while(scanf("%lf",&dt) !=EOF){   sum=sum+dt; }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎1のようにすれば、Ctrl+ZでEOFが返されたら終了とわかるのですが、今度は「0」が入力されたら処理を終了するというプログラムで、 ◎2---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;      while(scanf("%lf",&dt) !=0.0){   sum=sum+dt; }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎2のようにすると「0」が入力されても、終了せず、以下に示す◎3のように、しないと終了出来ません。 ◎3---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;          scanf("%lf",&dt);      while(dt!=0.0){   sum=sum+dt; scanf("%lf",&dt); }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎2で何故、◎1のように出来ず、◎3のようなscanf()を1回目、2回目と判定を入れなければならないか教えて下さい。

  • プログラミング 実数 合計値

    プログラミング 実数 合計値 3つの実数を読み込んで合計を表示するというプログラムのソースについてなんですが #include <stdio.h> int main(void) { double na, nb, nc; puts("3つの実数を入力してください。"); printf("実数:"); scanf("%5.lf", &na); printf("実数:"); scanf("%5.lf", &nb); printf("実数:"); scanf("%5.lf", &nc); printf("合計は%5.lfです。\n", (double)(na + nb + nc); return (0); } でコンパイルしてみたんですが、構文エラーでreturnの前の行で')'が';'の前にありません というのが出てきてコンパイルできないのですが、これはどこが間違ってるんでしょうか?