見出し画像

プログラミング学習の記録 #005(C)

今日の京大では、熊野寮祭の企画である「総長室突入」が実施されていた。途中からではあったが、実際に現場にいってみて、京大生の熱意と覇気を感じた。特に、京大生がスクラムを組んで、警察入構を阻止する場面は、本当に熱かったし、重要な場面であったと思う。警察入構によって、残念ながら総長室に突入することはできなかったが、集まった京大生から、たくさんのエネルギーをもらった。

前回の復習

前回は、if … elseを学習した。2つの実数を入力し、それらの数を用いた割り算を計算するプログラムコードを書いた。ただし、分母が0になるときには、割り算を行わずに「You cannot divide by the number because it is 0.」と表示されるようにした。

#include <stdio.h>

int main()
{
    double n1, n2, r1, r2;

    printf("Input the number1: ");
    scanf("%lf",&n1);
    printf("Input the number2: ");
    scanf("%lf",&n2);

    if(n1 == 0)
    {
        printf("You cannot divide by the number1 because it is 0.\n");
    }else
    {
        r1 = n2 / n1 ;
        printf("number2 / number1 = %6.3f\n",r1);
    }

    if(n2 == 0)
    {
        printf("You cannot divide by the number2 because it is 0.\n");
    }else
    {
        r2 = n1 / n2 ;
        printf("number1 / number2 = %6.3f\n",r2);
    }
    
    printf("HAPPY SMILE (^_^)v\n");
    return 0;
}

数学関数

教科書によると、数学関数を用いる際の具体的な手順として、

・プログラムの最初の部分に #include <math.h> という行を加える
・コンパイル時に -lm というオプションをつける

と説明されているが、前回の学習でpowを用いたときには、-lmオプションを付けなくても、べき乗の計算が正しく行われていた。これは、なぜだろうか。もし、理由がわかる人がいれば、コメントで教えてほしい。
以下に、主たる数学関数をまとめておく。

  • sin(x)  $${\sin x}$$

  • cos(x)  $${\cos x}$$

  • tan(x)  $${\tan x}$$

  • sinh(x)  $${\sinh x}$$

  • cosh(x)  $${\cosh x}$$

  • tanh(x)  $${\tanh x}$$

  • exp(x)  $${\exp x}$$

  • log(x)  $${\log x}$$

  • log10(x)  $${\log_{10} x}$$

  • asin(x)  $${\mathrm{Arcsin} x = \sin^{-1} x}$$

  • acos(x)  $${\mathrm{Arccos} x = \cos^{-1} x}$$

  • atan(x)  $${\mathrm{Arctan} x = \tan^{-1} x}$$

  • atan2(x,y)  $${\mathrm{Arctan} \frac{x}{y} = \tan^{-1} \frac{x}{y}}$$

  • sqrt(x)  $${\sqrt{x}}$$

  • pow(x,y)  $${x^{y}}$$

  • fabs(x)  $${|x|}$$

  • ceil(x)  $${x}$$の小数点以下を切り上げた整数

  • floor(x)    $${x}$$の小数点以下を切り捨てた整数

ところで、数学関数の使い方は、manコマンドで表示させることができる。

% man sin

と入力して実行したところ、

SIN(3)                                                      Library Functions Manual                                                     SIN(3)

NAME
     sin – sine function

SYNOPSIS
     #include <math.h>

     double
     sin(double x);

     long double
     sinl(long double x);

     float
     sinf(float x);

DESCRIPTION
     The sin() function computes the sine of x (measured in radians).

SPECIAL VALUES
     sin(±0) returns ±0.

     sin(±infinity) returns a NaN and raises the "invalid" floating-point exception.

VECTOR OPERATIONS
     If you need to apply the sin() function to SIMD vectors or arrays, using the following functions provided by the Accelerate.framework may
     give significantly better performance:

     #include <Accelerate/Accelerate.h>

     vFloat vsinf(vFloat x);
     vFloat vsincosf(vFloat x, vFloat *c);
     void vvsinf(float *y, const float *x, const int *n);
     void vvsin(double *y, const double *x, const int *n);
     void vvsincosf(float *s, float *c, const float *x, const int *n);
     void vvsincos(double *s, double *c, const double *x, const int *n);

SEE ALSO
     acos(3), asin(3), atan(3), atan2(3), cos(3), cosh(3), sinh(3), tan(3), tanh(3), math(3)

STANDARDS
     The sin() function conforms to ISO/IEC 9899:2011.

macOS 12.6                                                     December 11, 2006                                                     macOS 12.6
(END)

という説明が表示された。いまいちよくわからない。ちなみに、左下に「:」が表示された状態で「q」を入力すると、元のTerminalの画面に戻った。
教科書を参考にしつつ、3次元空間内の2点間の距離を求めるプログラムコードを書いた。

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

int main()
{
    double ax, ay, az ;
    double bx, by ,bz ;
    double leng ;

    printf("Input the point A (x y z): ");
    scanf("%lf %lf %lf", &ax, &ay, &az);
    printf("Input the point B (x y z): ");
    scanf("%lf %lf %lf", &bx, &by, &bz);

    leng = pow(ax - bx ,2) + pow(ay - by ,2) + pow(az - bz ,2) ;
    leng = sqrt(leng) ;

    printf("The length between A and B is %6.3f .\n", leng);


    printf("HAPPY SMILE (^_^)v\n");
    return 0;
}

scanfを用いるときに、スペースなどで区切って、複数の値を同時に入力することができるということを知った。あと、このコードでも、-lmオプションを付けても付けなくても、正しく計算できた。

-----

動け!タイムライン


いいなと思ったら応援しよう!

flowes_oyr
動物園か水族館にいきたいですね。

この記事が参加している募集