プログラミング学習の記録 #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;
}
数学関数
教科書によると、数学関数を用いる際の具体的な手順として、
と説明されているが、前回の学習で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オプションを付けても付けなくても、正しく計算できた。
-----
動け!タイムライン