C言語のsqrt関数

目次:

                序文:

声明:

ビルド環境:

カラム:

sqrt 関数のパラメータと戻り値:

簡単な練習:

質問:

話し合う:

改善する:


序文:

日常生活では、数値の平方根を求めるなど、コンピューターを使用して大規模な演算を実行する必要があることがよくあります。この章では、「数値の平方根を求める」というプログラムの書き方を説明します。ただし、C言語でsqrt関数を学ぶ前は、このプログラムを書くのが少し難しかったですが、sqrt関数を学ぶと、書く難易度は大幅に軽減されますので、「数値の平方根を求める」プログラムを書くと、 sqrt 関数を学習する必要がありますが、sqrt 関数を学習する前に、sqrt 関数を使用するための環境をセットアップする必要があります。このプログラムを実行するために sqrt 関数を学習する必要があるのはなぜですか? sqrt 関数は数値の平方根を求めるだけだからです。

声明:

この記事の筆者は中学1年生です。平方根はプレビューで覚えたので、多少の間違いがあるかもしれません。もし間違いがあれば、通りすがりの読者の方は修正していただければ幸いです。コメントエリア。

ビルド環境:

C 言語で関数を使用する場合、その関数のヘッダー ファイルをインクルードする必要があることは間違いありません (C 言語にある程度の基礎がある読者ならご存知だと思います)。sqrt 関数のヘッダー ファイルは <math.h> (数学ヘッダー ファイル) であるため、次の図に示すように、最初に「#include」マクロを使用して <math.h> ヘッダー ファイルをインクルードする必要があります。

#include<math.h>

sqrt関数のヘッダファイルをインクルードする場合でも、sqrt関数で計算した結果だけでなく、計算結果を出力できる関数が必要になります。この関数がprintf関数であり、printf関数はprint形式です。 (フォーマットされた出力) 略称、それに含まれるヘッダー ファイルは <stdio.h> (標準入出力) です。入出力用にこのヘッダー ファイルも含める必要があります。

#include<math.h>
#include<stdio.h>

次に、「main」という名前の関数を構築する必要がありますが、なぜこの関数を構築する必要があるのでしょうか。C プログラム全体のエントリ関数であるため、ほぼすべてのステートメントは main 関数内で実行されます (main 関数の詳しい作成方法については、著者の「C 言語の putchar 関数」を参照してください。このブログでは、 putchar 関数の説明だけでなく、main 関数の作成方法についても詳しく説明しています。必要な方は、  C 言語の putchar 関数のリンクに飛んで ください。リンク先のブログの main 関数の説明を読まなくても、 main 関数については、引き続きこのブログで説明します。関数については説明します)。

#include<math.h>
#include<stdio.h>

int main(void)
{


    return 0;
}

(次のコラムはメイン機能の説明です。経験豊富な読者は読み飛ばしてください)

カラム:

                                                        main関数を解釈する

作成したmain関数のデータ型はint型でパラメータはありませんが、main関数のパラメータリストには「void」を記入してもしなくても構いません。「{}」に続き、「{}」で囲まれた内容は関数本体と呼ばれ、関数本体には実行する必要があるステートメントを含めることができます。関数本体の "retrun 0;" は、ほとんどのコンパイラではオプションです。つまり、main 関数に "retrun 0;" を記述することは、"retrun 0;" を記述しないことと完全に同等ですが、これを避けるために、言語が不明瞭です (曖昧さと呼ばれます)。著者は、main 関数の最後にステートメント「return 0;」を追加することを推奨します。

環境をセットアップしたら、正式に sqrt 関数の学習を開始できます。

sqrt 関数のパラメータと戻り値:

関数を正しく使用するには、パラメータを正しく渡す必要があります。パラメータを正しく渡すには、パラメータのデータ型と関数に必要なパラメータの数を知っている必要があります。VS コンパイラー (Microsoft Visual Stduio と呼ばれます) では、マウス カーソルを関数の上に移動するだけで、関数に必要なパラメーターとパラメーターの数を簡単に知ることができますが、プロジェクトのみで実行できる ( VS コンパイラでプロジェクトを作成するのは比較的簡単なので、ここでは詳しく説明しません)。

sqrt 関数にマウス カーソルを置くと、sqrt 関数のパラメータが double 型 (倍精度浮動小数点) の変数であり、戻り値の型も double 型であることがわかります (注) : パラメータを渡すときに時間がかかります。パラメータのデータ型に注意してください)。sqrt 関数のパラメーターと戻り値を簡単に理解したら、次のステップに進むことができます。

簡単な練習:

ここではすでに「数値の平方根を求める」プログラムを作り始めていますが、まず sqrt 関数にパラメータを渡して出力して、実際の結果が理想的な結果と一致するかどうかを確認してみましょう。たとえば、平方根 4 の計算結果をクエリしたい場合は、次のように実行できます。

#include<math.h>
#include<stdio.h>

int main(void)
{
    printf("%lf",sqrt(4));

    return 0;
}

平方根 4 の結果は 2 であることがわかっており、出力結果も 2 になるはずです。実際の出力結果が理想的な出力結果と一致しているかどうかを確認してみましょう。

出力結果:2.000000

答えは確かに正しいのですが、なぜ出力結果の小数点以下に 0 がたくさんあるのかわかりません。これは実際には重要ではありません。私たちが気にしているのは出力の正確さです。上記のコードは少しわかりにくいですが、問題ありません。これについては、以下で一緒に説明します。ただし、読者は議論する前に例について疑問を抱くことは避けられないため、議論を始める前に初心者の質問に答える必要があります。

質問:

Q1: 「sqrt関数の引数の型は倍精度浮動小数点型ではありませんか? 上記の例では、sqrt関数の引数が浮動小数点数ではなく整数になっているのはなぜですか? 何か問題はありますか?このようにパラメータを渡すのですか?」

R1: ここでこの質問をした読者に答える必要があります: 「sqrt 関数に浮動小数点数を渡すのはまったく正しいことであり、何の問題もありません。もちろん、整数を渡すことには問題はありません」 sqrt 関数に整数を渡すと、整数変数は倍精度浮動小数点型に自動的に変換されるため、パラメーターを整数型から倍精度浮動小数点型に変換するプロセスを回避できますか?もちろんですが、上記のコードに少し変更を加える必要があります。

#include<math.h>
#include<stdio.h>

int main(void)
{
    printf("%lf",sqrt(4.0));

    return 0;
}

この変更により、パラメーターを整数から浮動小数点に変換するプロセスが回避され、コードがより正確になります。

Q2: 「printf 関数の最初のパラメータは奇妙な文字列 ("%lf") です。なぜこの奇妙な文字列は出力されないのですか? 数字に置き換えられます。」

R2: とても良い質問ですね!これをただの奇妙な文字列だと単純に考えると、それは正しいようです。なぜなら、それが初めての接触であれば、必然的に奇妙に感じるでしょうし、それはごく普通のことだからです。しかし、「%lf」は奇妙な文字列ではなく、プレースホルダーであり、私たちが毎日 C プログラムを書くときにほぼ不可欠なものです。次のように理解できます。「printf は「フォーマットされた出力」を意味します。このプレースホルダーは、「フォーマットされた出力」のフォーマットとして理解できます。プレースホルダーの内容に従って、次のパラメーターを出力できます。たとえば、同じ printf 関数の下で、最初のプレースホルダーは 2 番目のパラメーターの内容を出力し、2 番目のプレースホルダーは 3 番目のパラメーターの内容を出力する、というようになります。プレースホルダーかどうかの見分け方も非常に簡単で、文字列の前に「%」(パーセント記号)があるかどうかを見て、あればプレースホルダー、なければプレースホルダーです。はプレースホルダではありません。C 言語には、「%lf」プレースホルダだけでなく、多くのプレースホルダが存在します。C 言語でよく使用されるプレースホルダは次の表のとおりです。各プレースホルダに対応する入出力形式は異なります。

%d 整数形式での入力と出力
%f 単精度浮動小数点型の形式での入出力
%lf 倍精度浮動小数点型としての入出力
%s

文字列形式での入出力

(上記の例について混乱がある場合は、コメント領域で著者に知らせてください。著者は時間内に返信し、この記事に関する質問を更新します)

話し合う:

読者がよりよく理解できるように、上記の例のコードの大まかな翻訳を作成できます (ここで、著者は上記の例のコードを以下に「移動」しました。これを行う理由は、読者が後戻りできないようにするためです)上記で)。

#include<math.h>
#include<stdio.h>

int main(void)
{
    printf("%lf",sqrt(4.0));

    return 0;
}

翻訳: まずプログラムに 2 つのヘッダー ファイルを含めます。それらは math.h (数学的ヘッダー ファイル) と stdio.h (標準入出力ヘッダー ファイル) です。次に main 関数を記述する必要がありますが、「main」関数のデータ型は int で、パラメータのデータ型は「void」です。なぜ「main」関数を書くのでしょうか? これは C プログラム全体への入り口であるため、main 関数の関数本体には 2 つのステートメントがあります。最初のステートメントは "printf("%lf",sqrt(4.0));" で、翻訳すると次の意味になります。 double sqrt 関数の戻り値を高精度浮動小数点の形式で出力します (注: 関数が別の関数のパラメーターとして使用される場合、プログラムは最初に 1 つの関数の戻り値を計算し、それをその関数のパラメーターに渡します) 「最後のステートメントは "return 0;" です。この関数には、void 型を除いて戻り値が必要です。main 関数のデータ型は void ではなく int なので、main 関数には return が必要です」ほとんどのコンパイラでは main 関数の戻り値が省略されますが、それでも戻り値を追加することが最善です。これは良い習慣です。
(注: main 関数のパラメータリストの void を main 関数のデータ型とみなさないでください)

改善する:

実際、このプログラムには多くの問題があることに気づくのは難しくありません。たとえば、4 の平方根はもう求めたくないのですが、2 の平方根を求めたいのです。しかし、sqrt 関数のパラメーターを変更するにはどうすればよいでしょうか? プログラムのソースコードから直接「4」に変更を加えた方が良いのではないでしょうか? ただし、数値の平方根を求めるたびにプログラムのソース コードを変更する必要があり、効率が大幅に低下するため、長期的にはこれは良い解決策とは言えません。それでは、プログラムのソース コードから始めないのであれば、コンソールから始めてみませんか? なぜなら、入力と出力はほとんど常にコンソール上で行われるからです。したがって、必要な平方根数値を変数に書き込み、最後にそれを sqrt 関数に送信し、printf 関数を使用して出力することができます。これは、プログラムのソース コードへの変更を回避し、プログラムの改善を図るための良い方法であることは明らかです。ソースコードの安定性。これは明らかに良い解決策です。良い!やるだけ!

書き込むオブジェクトは変数なので、その前に書き込むオブジェクトとなる変数を作成する必要があります 変数のデータ型はdouble型である必要があります なぜdouble型なのでしょうか?sqrt 関数で必要なパラメータの型は Double であり、この変数を sqrt 関数に送信し、printf 関数を使用して出力する必要があるため、出力形式は倍精度浮動小数点の形式になるため、この変数は double です。 -精度浮動小数点型 (Double) は当然です。作成した変数の名前は「sum」で、「sum」の初期値は0です。次のコード ブロックに示すように:

#include<math.h>
#include<stdio.h>

int main(void)
{
    double sum = 0;

    printf("%lf",sqrt(4.0));

    return 0;
}

使用する書き込み関数は、プレースホルダーの内容に基づいてデータを入力する必要がある scanf (formatted input) 関数であり、プレースホルダーの内容に基づいてデータを出力する printf 関数の逆です。「関数を正しく使用したい場合は、パラメーターを正しく渡さなければなりません。パラメーターを正しく渡したい場合は、パラメーターのデータ型と関数に必要なパラメーターの数を知る必要があります」という古い格言が今でも残っています。それでは、scanf 関数のパラメーターを見てみましょう。プロトタイプ:

 一見すると、パラメータの半分が省略されているため、scanf 関数のパラメータ要件が理解できていないようですが、scanf 関数で必要なパラメータはプレースホルダと記述する必要がある変数であることが一般的にわかります。 。このような:

scanf("占位符",&被写入数据的变量);

(読者の中には、この「&」が何を意味するのか疑問に思う人もいるかもしれません。今はこれについては気にしません。それについては後で説明します)

この「データが書き込まれる変数」はまさに「sum」変数であり、「sum」変数へのデータの書き込みは次のように表すことができます。

scanf("%lf",&sum);

では、この「&」は何を意味するのでしょうか?「&」はC言語のアドレス文字です。変数が存在するアドレス単位にデータを書き込みたいので、変数が存在するアドレス単位を取得する必要があります。2番目の変数の前にアドレスを追加するだけです。 scanf 関数は、必要な場合にのみ使用できます。

#include<math.h>
#include<stdio.h>

int main(void)
{
    double sum = 0;

    scanf("%lf",&sum);

    printf("%lf",sqrt(4.0));

    return 0;
}

このようにして、コンソールに必要な変数の値を入力して Enter キーを押す限り、変数の値はコンソールに書き込んだ値になります。ただし、注意すべき点が 1 つあります。各データ型には独自の値の範囲があるため、入力データを入力変数の値の範囲より大きくしたり小さくしたりすることはできません。そうしないと、オーバーフローまたはアンダーフローが発生します。

sqrt 関数のパラメーターは、データの入力に使用する変数そのものであるため、変数「sum」を sqrt 関数に直接入力して、必要な平方根数を計算します。

#include<math.h>
#include<stdio.h>

int main(void)
{
    double sum = 0;

    scanf("%lf",&sum);

    printf("%lf",sqrt(sum));

    return 0;
}

このようにして、非常に効率の高い「数値の平方根を求める」プログラムが完成しました。まず上記のコードをテストしてみましょう。2 の平方根を求めたいとします。プログラムのコンソールに 2 と入力して Enter キーを押す必要があります。sum変数の値に2を代入し、sqrt関数にsumの値を渡し、sqrt関数の結果をprintf関数に返して出力します。

入力データ:2

出力結果:1.414214

この結果は科学研究者にとっては正確ではありませんが、私たちのような一般人にとっては十分正確です。このプログラムが成功したことは明らかです。

さらに、scanf 関数の前に次のステートメントに関する情報の入力をユーザーに求めることもでき、出力結果を変更することもできます。

#include<math.h>
#include<stdio.h>

int main(void)
{
    double sum = 0;

    printf("请输入一个数值,我们会帮助您计算出这个数的平方根");
    scanf("%lf",&sum);

    printf("这个数的平方根是:%lf",sqrt(sum));

    return 0;
}

これで「数値の平方根を求める」手順全体が完了しました。

おすすめ

転載: blog.csdn.net/m0_68824353/article/details/126568702