合計 昨日 今日

微分係数を求めるプログラムを作っています

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: masuter
[URL]
Date: 2017年5月12日(金) 21:10
No: 1
(OFFLINE)

 微分係数を求めるプログラムを作っています

こんばんは。
高校生でC言語でプログラミングを学んでいます。
先日学校で、以下のような課題が出ました。

以下を満たすプログラムを完成させよ。
(1) 引数 x (double型)と n (int型)を与えて x^n の値を返すdouble型の関数 powerを定義。
(2) 引数 x (double型)と n (int型)を与えて x^n の微分係数((x^n)’の値,n x^(n -1)を計算してxの値を入れる)を返すdouble型の関数 diff を定義。ただし(1)の関数powerを呼び出して使うこと。
(3) main関数で 値 x と n を入力させ,関数 power と diff を呼び出し,それぞれの値を例のように表示させる。
  (注) 数学用ライブラリ関数(math.hのpowなど)は使えないとする。
<実行例>
x を 入力してください: 4.2
n を 入力してください(n>0): 5
x^n = 1306.912320
(x^n)' = 1555.848000

(1)は自分でできました。お聞きしたいのは(2)です。
まず、「ただし(1)の関数powerを呼び出して使うこと。」とありますが、違う計算をするのになぜ呼び出すのですか?呼び出す意味はありますか?
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
double power(double x, int n) {
    double y = 1;
    for (int i = 1; i <= n; i++)
        y = y*x;
    return y;
}
int main() {
    double num1 = 0;
    int num2 = 0;
    double d = 0;
    printf_s("xを入力してください\n>");
    scanf_s("%lf", &num1);
    printf_s("nを入力してください(nは自然数)\n>");
    scanf_s("%d", &num2);
 
    d = power(num1, num2);
    printf_s("%f^%d = %f です。\n", num1, num2, d);
    return 0;
}

Name: purin52002
[URL]
上級者(23,856 ポイント)
Date: 2017年5月12日(金) 21:20
No: 2
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

数学の話に寄っていきます。
数学は苦手ですのでご了承ください^^;

今回は微分がわかっているので手打ちで計算すればいい気もしますが、
微分がわからない関数を微分する必要が出てくることがあります。

そういうときに導関数の公式を使います。

公式
(f(x+h)-f(x))/h (lim h->0)

プログラムでもこの公式を使うことで微分ができます。
(hは適当に小さい値にする)
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Name: みけCAT
[URL]
伝説なるハッカー(664,603 ポイント)
Date: 2017年5月12日(金) 22:09
No: 3
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

masuter さんが書きました:まず、「ただし(1)の関数powerを呼び出して使うこと。」とありますが、違う計算をするのになぜ呼び出すのですか?呼び出す意味はありますか?

ここで呼び出す主な意味は、関数呼び出しの練習でしょう。
xの(n-1)乗を計算するので、power関数を使うといいでしょう。

Offtopic :
purin52002 さんが書きました:数学の話に寄っていきます。
数学は苦手ですのでご了承ください^^;

どうしてわざわざ質問にほとんど関係ない上に苦手な数学の話に寄ったのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: purin52002
[URL]
上級者(23,856 ポイント)
Date: 2017年5月12日(金) 22:38
No: 4
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

、、、完全に勘違いしていました^^;

てっきり微分を数値計算するためにpower関数を使え、ということかと思ったのですが
xの(n-1)乗を計算するために使えってことなんですね^^;

masuterさん、余計な話をして申し訳ないです<(__)>
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Name: box
[URL]
ハッカー(262,968 ポイント)
Date: 2017年5月13日(土) 01:27
No: 5
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

みけCAT さんが書きました:どうしてわざわざ質問にほとんど関係ない上に苦手な数学の話に寄ったのですか?

数学があまり得意でない方が数学に関する投稿をしてもいっこうに差し支えないのでは?
ここの掲示板には、ある分野があまり得意ではない方がその分野に関する投稿をしていけないという
ルールでもあるんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Name: box
[URL]
ハッカー(262,968 ポイント)
Date: 2017年5月13日(土) 01:40
No: 6
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

masuter さんが書きました:(1) 引数 x (double型)と n (int型)を与えて x^n の値を返すdouble型の関数 powerを定義。
(2) 引数 x (double型)と n (int型)を与えて x^n の微分係数((x^n)’の値,n x^(n -1)を計算してxの値を入れる)を返すdouble型の関数 diff を定義。ただし(1)の関数powerを呼び出して使うこと。
まず、「ただし(1)の関数powerを呼び出して使うこと。」とありますが、違う計算をするのになぜ呼び出すのですか?呼び出す意味はありますか?

この疑問に対する答えは、別の回答者さんからの回答のとおりです。
(2)においてべき乗を求める必要があります。その、べき乗を求める関数powerは、
(1)において自作されています。それを呼び出しましょう、ということです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Name: みけCAT
[URL]
伝説なるハッカー(664,603 ポイント)
Date: 2017年5月13日(土) 01:59
No: 7
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

box さんが書きました:
みけCAT さんが書きました:どうしてわざわざ質問にほとんど関係ない上に苦手な数学の話に寄ったのですか?

数学があまり得意でない方が数学に関する投稿をしてもいっこうに差し支えないのでは?
ここの掲示板には、ある分野があまり得意ではない方がその分野に関する投稿をしていけないという
ルールでもあるんですか?

なんでわざわざ苦手だと宣言しながら関係なさそうな投稿をするのか不思議だっただけで、いけないとは言っていないです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: masuter
[URL]
Date: 2017年5月15日(月) 16:23
No: 8
(OFFLINE)

 Re: 微分係数を求めるプログラムを作っています

[解決!]

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
double power(double x, int n) {
    double r = 1;
    for (int i = 1; i <= n; i++)
        r = r*x;
    return r;
}
double diff(double x, int n) {
    double r = 0;
    r = n*power(x, n-1);
    return r;
}
int main() {
    double num1 = 0;
    int num2 = 0;
    double result1 = 0;
    double result2 = 0;
    printf_s("xを入力してください\n>");
    scanf_s("%lf", &num1);
    printf_s("nを入力してください(nは自然数)\n>");
    scanf_s("%d", &num2);
 
    result1 = power(num1, num2);
    result2 = diff(num1, num2);
    printf_s("%f^%d = %f です。\n", num1, num2, result1);
    printf_s("(%f^%d)' = %f です。\n", num1, num2, result2);
 
    return 0;
}

できました!ありがとうございました。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[21人]