プログラミングで返り値を扱う際の注意点とは?

このQ&Aのポイント
  • プログラム実行時にwarning C4244が発生し、小数点以下が切り捨てられる問題が発生する。
  • 解決策としては、関数の返り値の型を適切に設定する必要がある。
  • 具体的には、関数の返り値がdouble型の場合、その型をint型に変更するか、適切にキャストする必要がある。
回答を見る
  • ベストアンサー

プログラミング 返り値

#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

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

  • ベストアンサー
  • PXU10652
  • ベストアンサー率38% (777/1993)
回答No.2

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

PIKO02
質問者

お礼

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

その他の回答 (1)

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

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

PIKO02
質問者

お礼

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

関連するQ&A

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

    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の前の行で')'が';'の前にありません というのが出てきてコンパイルできないのですが、これはどこが間違ってるんでしょうか?

  • プログラミング 問題

    もともとの商品の値段が1000円を超えている場合は1割引する。1000円以下の場合はそのままである。まず商品の値段を引数に取り、割引後の値段を返す関数を書け。 次に、この関数を使って「最初に10回商品の値段を入力すると、それぞれに対して割引後の値段をまとめて表示する」というプログラムを書け。 ここまで出来ましたがそれ以上どうしてもわかりません。エラーも出ます 教えてくださいm(_ _ )m #include <stdio.h> double discount(double a); int main(void) { double i,c,n[10]; for(i=0; i<10; i++){ printf("price?"); scanf("%lf",&c); n[i]=discount(c); } for(i=0; i<10; i++){ printf("%f\n",n[i]); } return 0; } double discount(double a){ double b; if(a>1000){ b=a*0.9; }else{ b=a; } return b; }

  • プログラミング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 のソースコードはこのままでプログラムが 動くようにしてほしいです。 よろしくお願いします!

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

    3つの実数を読み込んで合計を表示するというプログラムなんですが、プログラムをコンパイルして3つの実数を入力してくださいと表示させて実数1に1.5、実数2に0.8、実数3に1.0, 合計は3.3です表示させたいのですが #include <stdio.h> int main(void) { double n1,n2,n3; puts("3つの実数を入力してください。"); printf("実数:"); scanf("%lf", &n1); printf("実数:"); scanf("%lf", &n2); printf("実数:"); scanf("%lf", &n3); printf("合計は%5.lfです。\n",(double)(n1 + n2 + n3)); return (0); } でコンパイルしようとすると1つしか実数を入力する所が出てこなくて 数字を入れると合計は.lfですと出てきて実行できないのですが、上のソースのどこか間違ってる所があったら教えてくれませんか?

  • C++でのプログラミングについてです

    プログラミング初心者です C++で二次方程式の解のプログラムを作成したのですがうまく作動させることができません…どこがおかしいのでしょうか、またどのように変更すればよいでしょうか 発生したエラーは 15行 型voidの値をintのエンティティに割り当てることはできません 34行 宣言が必要です 55行 宣言が必要です 15行 voidが他の型と同時に使われました 34行 '{'を見つけました(関数のヘッダーがないかもしれません). 68行 構文エラー:'}' です よろしくお願いいたします #include<stdlib.h> #include<math.h> void solve(double, double, double); int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; int ret; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りです。\n"); ret = solve(a, b, c, &x1, &x2, &r1, &r2); switch (ret) { case-1: printf("係数がおかしい\n"); break; case 0: printf("解は虚数解で%.2f+%.2fi と%.2f-%.2fi です\n", r1, r2, r1, r2); break; case 1: printf("解は実数解となり、%f です。\n", x1); break; case 2: printf("解は実解解で、%f と %f です。¥n", x1, x2); break; } return 0; } void solve(double a, double b, double c, double x1, double x2, double r1, double r2); { if (a == 0.0) { if (b == 0.0) { return -1; } { x1 = -c / b; return 1; } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); return 1; } if (D == 0) { x1 = -b / (2 * a); return 1; } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); return 0; } } }

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

    #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で合計値を返す。 ・引数の考慮点 実数の配列だけでなく配列の要素数も引数として渡す必要がある。 宜しくお願いします。 どこが違うのでしょうか?

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

    最近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言語の演習2

    何度も似たような質問を出していますがよろしくお願いします。。。 問題は 2つの整数を入力してください。 整数A:54 整数B:84 Aの値はBの64.285714%です。 というものです。あっているか確認お願いします。 #include<stdio.h> int main(void) { int vx, vy; puts("2つの整数を入力してください。"); printf("整数A"); scanf("%lf",&vx"); printf("整数B"); scanf("%lf",&vy"); printf("Aの値はbの%f%です。/n",(double)(vx/vy)); return 0; } であっていますか??お願いします。

  • プログラミングについて教えてほしいんですが・・・

    プログラミングについて教えてほしいんですが・・・ プログラミングで四則演算プログラムをやっているのですが余りの求め方がわかりません。足し算の求め方は /*lesson2.c*/ #include<stdio.h> int add(int,int); int main(){ int a,b,c; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); c=add(a,b); printf("a+b=%d\n",c); } int add(int x, int y){ return x+y; } というやり方で求めることができたのですが、余りは上のプログラムのどこを変えたらいいのでしょうか? 誰かわかる人がいたら教えてください。お願いします。

専門家に質問してみよう