Microsoft Visual Studio 2005の関数と関数の使用方法

このQ&Aのポイント
  • C++言語のMicrosoft Visual Studio 2005で関数を使用する方法についての質問です。
  • 質問者は今まで関数を使用したことがなく、具体的な使い方がわからないようです。
  • 具体的な問題として、2つの実数を加算、減算、積算、除算し、それらの結果を表示する方法が知りたいそうです。また、割る値が0の場合にはエラーメッセージを表示することも求められています。
回答を見る
  • ベストアンサー

Microsoft Visual Studio 2005の関数なのです

Microsoft Visual Studio 2005の関数なのですが・・・ 今まではこういう風にやっていたのですが・・・ #include<stdio.h> int main() { double a,b,n; a=10.0; b=20.0; printf("実数A=%f",a); printf("\n実数B=%f",b); n=a+b; printf("\n加算:%lf\n",n); return 0 } 今日から関数を使うことになりました。 関数を使ったやり方がわからないので、教えていただきたいです。 問題は… 2つの実数X,Yを定義し、それぞれ、20.0, 30.0 を代入した後、その加算、減算、積算、除算、あまりの算出を関数を用いて行い、その結果が画面に表示せよ。除算の場合の割る値が0の場合は、エラーを画面に表示すること。 よろしくお願いします。 ちなみに、言語はC++です。

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

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

calc_amari()にも誤りがありますが、修正しましたか? a % b で、b = 0 は、認められませんよ。

-poor-
質問者

お礼

double calc_waru(double a,double b) { if (b==0) { printf("わ る= エラー\n"); return 0; } else { printf("わ る= %f\n",a/b); return a/b; } } double calc_amari(double a,double b) { double n; if (b==0) { printf("あまり= エラー\n"); return 0; } else { n=(int)a%(int)b; printf("あまり= %f\n",n); return n; } } ついにできました。 ホントにありがとうございます。 でも、完璧にマスターするには、少し時間がかかりそうです^^;

その他の回答 (3)

回答No.3

calc_waru()という関数では、除算していません。乗算になっています。 ---------------------------- なぜ『除算の場合の割る値が0の場合は、エラーを画面に表示すること。』になっているかというと、 0で割ることはできないからです。 数学では無限大で表現できますが、コンピュータでは0除算といって、プログラムが異常終了してしまいます。 だから、割る値が0かどうか事前にチェックして、異常終了を避けるようにプログラムしなくてはいけません。 ---------------------------- double calc_waru(double a,double b) {   if (b == 0)   {     printf("わ る= エラー\n");     return 0 ; // 練習問題なので、エラーのときは単に0を返すことにする。   }   else   {     return a / b ;   } }

-poor-
質問者

補足

申し訳ないのですが、このやり方でもプログラムが異常終了してしまいます。

回答No.2

補足です。 関数は、呼び出される前に実体を定義するか、extern宣言しておく必要があります。 次のaかbのいずれかのようにコーディングしてください。 そうしないとコンパイルエラーになります。 (a) double calc_tasu(double x, double y) {   return x + y ; } ; int main() {   ...   n = calc_tasu(a, b) ;   ... } (b) extern calc_tasu(double, double) ; int main() {   ...   n = calc_tasu(a, b) ;   ... } double calc_tasu(double x, double y) {   return x + y ; } ;

回答No.1

「関数を用いて」の意味は、+,-,/,*演算子を使わない、ということではないと思います。 たとえば、足し算なら、 ■今まで n = a + b ; ■課題の答え n = calc_tasu(a, b) ; double calc_tasu(double x, double y) {   return x + y ; } ; で良いのではありませんか? 掲載されているプログラムから察するに、あとは、自分で作れる力をお持ちだと思いますよ。

-poor-
質問者

補足

ありがとうございます。 できました! ただ、どうしてもエラーのヤツだけできません。 ifじゃないのでしょうか? #include<stdio.h> double calc_tasu(double a,double b); double calc_hiku(double a,double b); double calc_kakeru(double a,double b); double calc_waru(double a,double b); double calc_amari(double a,double b); int main(void) { double a,b; double calc_tasu2,calc_hiku2,calc_kakeru2,calc_waru2,waru3,calc_amari2; a=10.0; b=0; calc_tasu2=calc_tasu(a,b); calc_hiku2=calc_hiku(a,b); calc_kakeru2=calc_kakeru(a,b); calc_waru2=calc_waru(a,b); calc_amari2=calc_amari(a,b); printf("た す= %f\n",calc_tasu2); printf("ひ く= %f\n",calc_hiku2); printf("かける= %f\n",calc_kakeru2); printf("わ る= %f\n",calc_waru2); printf("あまり= %f\n",calc_amari2); return 0; } double calc_tasu(double a,double b) { double wk; wk=(a+b); return wk; } double calc_hiku(double a,double b) { double wk; wk=(a-b); return wk; } double calc_kakeru(double a,double b) { double wk; wk=(a*b); return wk; } double calc_waru(double a,double b) { double wk; if (wk=(a*b)) { return wk; } else { printf("わ る= エラー\n"); return wk; } } double calc_amari(double a,double b) { double wk; wk=((int) a%(int) b); return wk; }

関連するQ&A

  • Microsoft Visual Studio 2005の関数なのです

    Microsoft Visual Studio 2005の関数なのです Microsoft Visual Studio 2005の関数なのですが・・・ 今まではこういう風にやっていたのですが・・・ #include<stdio.h> int main() { double a,b,n; a=10.0; b=20.0; printf("実数A=%f",a); printf("\n実数B=%f",b); n=a+b; printf("\n加算:%lf\n",n); return 0 } 今日から関数を使うことになりました。 関数を使ったやり方がわからないので、教えていただきたいです。 問題は… 2つの実数X,Yを定義し、それぞれ、20.0, 30.0 を代入した後、その加算、減算、積算、除算、あまりの算出を関数を用いて行い、その結果が画面に表示せよ。除算の場合の割る値が0の場合は、エラーを画面に表示すること。 よろしくお願いします。 ちなみに、言語はC++です。

  • Microsoft Visual Studio 2005の関数なのです

    Microsoft Visual Studio 2005の関数なのですが・・・ 今まではこういう風にやっていたのですが・・・ #include<stdio.h> int main() { double a,b,n; a=10.0; b=20.0; printf("実数A=%f",a); printf("\n実数B=%f",b); n=a+b; printf("\n加算:%lf\n",n); return 0 } 今日から関数を使うことになりました。 関数を使ったやり方がわからないので、教えていただきたいです。 よろしくお願いします。 ちなみに、言語はC++です。

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

    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ですと出てきて実行できないのですが、上のソースのどこか間違ってる所があったら教えてくれませんか?

  • scanf関数のプログラムをgetchar関数で

    scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }

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

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

  • 二次関数で

    任意の二次方程式(ax^2+bx+c=0)を解くプログラムを作るのですが、以下の条件を満たした方法で作るというものです。 1、関数の引数は、3つの係数と、解の入る変数二つとする。 (計5つの引数をとる。) いずれかの引数がアドレス渡し(ポインタ)になる。 2、解は関数呼出の時に指定した2つの変数にそれぞれ代入されること。 3、解の表示は関数側ではなく呼出側で行うこと。 4、グローバル変数は使用しない。 一応作ってみたのですがコンパイルすらできません。 初心者なので全くわかりません教えてください。 #include<stdio.h> #include<math.h> void solve(double *x, double *y); int main(void) { double x,y; solve(&x,&y); return 0; printf("x=%f\n", x); printf("y=%f\n", y); } void solve(double *x, double *y) { doble a,b,c; puts("二次方程式 a*x^2+b*x+c=0 を解きます"); puts("係数a, b, cを入力してください"); printf("a="), scanf("%lf", a); printf("b="), scanf("%lf", b); printf("c="), scanf("%lf", c); putchar('\n'); double d = b * b - 4 * a * c; if(d >= 0){ x = (-b + sqrt(d)) / (2 * a); y = (-b - sqrt(d)) / (2 * a); } else puts("虚数解"); }

  • 3次方程式の実数解の個数のプログラムについて…

    C++で、3次方程式の実数解の個数を調べるプログラムを作ってみた(↓)のですが、実行したときに問題点があって困っています。 #include<stdio.h> #include<math.h> void main(void) /*3次方程式の実数解の個数*/ { double a,b,c,d,D,A,B; printf("f(x)=a*pow(x,3)+b*pow(x,2)+c*x+d=0 に対して、a,b,c,dの値を定めると、\n"); scanf("%lf %lf %lf %lf",&a,&b,&c,&d); D=4*pow(b,2)-12*a*c; A=(-b+sqrt(b*b-3*a*c))/(3*a); B=(-b-sqrt(b*b-3*a*c))/(3*a); if(a>0) if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); else a=-a; b=-b; c=-c; d=-d; if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); その問題点というのは、実数解の個数が2個と3個のときは、実行したときの結果として、 実数解の個数は2個 Press any key to continue あるいは 実数解の個数は3個 Press any key to continue と正しく表示されるのですが、実数解の個数が1個のときは、 実数解の個数は1個 実数解の個数は1個 Press any key to continue と「実数解の個数は1個」が2回表示されてしまうのです。 なぜ、2回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。

  • どうしても上手くいきません…

    #include<stdio.h> #include<stdlib.h> double sumf(int n,double *ds); int main(double){ 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-a)/df)); 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で合計値を返す。 ・引数の考慮点 実数の配列だけでなく配列の要素数も引数として渡す必要がある。 宜しくお願いします。 どこが違うのでしょうか? 【現時点での実行結果】 ./p243.c Input two numbers -> 2.0 7.0 2.0 2.7 3.4 4.1 4.8 5.5 6.2 6.9 sumf = 16.0 【実行したい結果】 ./p243.c Input two numbers -> 2.0 7.0 2.0 2.7 3.4 4.1 4.8 5.5 6.2 6.9 sumf = 35.6 どこが間違っているのでしょうか? 出来るだけの手直しはしたのですが…

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

  • Microsoft Visual Studio 2005の関数なのです

    Microsoft Visual Studio 2005の関数なのです。 6地点への配達物がある。この5地点を1回だけとおり、移動距離が最小となる巡回順路を求めよ。 6地点の座標は次の通りである。  a(2,2), b(3,3), c(5,4), d(4,2), e(2,5), f(5,0)、ただし、第1番目はaを訪問することとする。 という問題があるのですが、これは、どうやってやればいいのでしょう? ここまでくると、もうサッパリです。 よろしければ、教えていただきたいです。

専門家に質問してみよう