プログラミング学習の記録 #007(C)
ようやく卒業研究のテーマが決定し、取り組みはじめることとなった。しかし、まだプログラミング技術が追いついていないため、数値計算を行うことができない。つまり、文献を読むことしかできない状況である。一方で、文献を読むために必要な知識も不足している。何もかも不足しているが、プログラミング技術が追いついていないことが原因で卒業研究が停滞するということは、今のところなさそうである。
前回の復習
今回も、教科書の記載されていた練習問題に取り組んでみた。
練習問題 5.1
実数$${x}$$を読み込んで$${x^{x}}$$を計算するプログラムを作成せよ。ただし、$${x}$$の値が適切でない場合には計算をしないでメッセージを表示するようにせよ。
#include <stdio.h>
#include <math.h>
int main()
{
double x ;
printf("Input x: ");
scanf("%lf", &x);
if( x < 0 && x != floor(x) )
{
printf("Range error in x.\n");
}else if(x == 0)
{
x = 1 ;
printf("x^x = %6.3f\n",x);
}else
{
x = pow(x,x);
printf("x^x = %6.3f\n",x);
}
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
練習問題 5.2
$${\sin}$$の逆関数$${\sin^{-1}(x)}$$(数学関数 asin(x))は、$${-1 \leq x \leq 1}$$の場合にのみ値をもつ。その場合のみ$${\sin^{-1}(x)}$$の値を出力し、$${x}$$が定義域から外れている場合にはメッセージを出力して計算をしないようなプログラムを作成せよ。
#include <stdio.h>
#include <math.h>
int main()
{
double x ;
double as;
printf("Input x: ");
scanf("%lf", &x);
if(x >= -1 && x <= 1)
{
as = asin(x) ;
printf("When x = %6.3f,\n", x);
printf("Arcsin(x) = %6.3f\n", as);
}else
{
printf("Range error in x.");
}
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
練習問題 5.4
二次方程式$${ax^{2} + bx +c =0}$$の係数$${a,b,c}$$を読み込んで、解を表示するプログラムを作成せよ。係数$${a}$$が$${0}$$の場合を考慮し、判別式を用いて実数解、複素数解のどちらの場合でも表示できるようにせよ。また、重解のときは解を1個表示するようにせよ。
#include <stdio.h>
#include <math.h>
int main()
{
double a, b, c, D ;
double x1, x2;
printf("I can solve ax^2 + bx + c = 0.\n");
printf("Input (a b c): ");
scanf("%lf %lf %lf", &a, &b, &c);
D = pow(b,2) - 4 * a * c ;
if(a == 0)
{
if(b == 0)
{
printf("ERROR.\n");
}else
{
x1 = - ( c / b ) ;
printf("I am solving...\n");
printf("x = %6.3f\n", x1);
}
}else
{
if(D > 0)
{
x1 = (-b + sqrt(D)) / (2 * a) ;
x2 = (-b - sqrt(D)) / (2 * a) ;
printf("I am solving...\n");
printf("x = %6.3f, %6.3f\n", x1,x2);
}else if(D == 0)
{
x1 = - (b / (2 * a)) ;
printf("I am solving...\n");
printf("x = %6.3f\n", x1);
}else
{
x1 = (-b) / (2 * a) ;
x2 = (sqrt(-D)) / (2 * a) ;
printf("I am solving...\n");
printf("x = %6.3f +%6.3f i, %6.3f -%6.3f i\n", x1,x2,x1,x2);
}
}
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
このプログラムを実行してみると、以下のように表示された。
% ./a.out
I can solve ax^2 + bx + c = 0.
Input (a b c): 1 5 6
I am solving...
x = -2.000, -3.000
HAPPY SMILE (^_^)v
そろそろ「HAPPY SMILE (^_^)v」が意味をなしてきている。ところで、二次方程式の解を求めるプログラムについては、以下のサイトが参考になるかもしれない。
switch
条件分岐の方法としては、if以外にもswitchを用いた方法もある。switch文は、以下のような形で書く。
switch(式)
{
case 条件1:
文1
break;
case 条件2:
文2
break;
case 条件3:
文3
break;
default:
文n
break;
}
「switch」で指定した式が「case」で指定した条件と等しいときに、それぞれの「case」と「break」で挟まれた部分が実行される。いずれの「case」にも当てはまらないときには、「default」と「break」で挟まれた部分が実行される。ちなみに、「default」部分を省略すると、いずれの「case」にも当てはまらないとき、何も実行されなくなる。教科書を参考にして、EURとUSD、JPYの両替を行うプログラムコードを書いた。
#include <stdio.h>
#include <math.h>
int main()
{
double r_euro, r_yen ;
double e, d, y ;
double price ;
char unit ;
r_euro = 0.9467 ; // euro/dollar
r_yen = 136.0960 ; // yen/dollar
printf("EUR:E, USD:D, JPY:Y\n");
printf("Input the money unit (E, D or Y): ");
scanf("%c", &unit);
printf("Input the price: ");
scanf("%lf", &price);
switch(unit)
{
case 'D':
d = price ;
e = d * r_euro ;
y = d * r_yen ;
printf("%6.3f EUR =%6.3f USD =%6.3f JPY.\n", e,d,y );
break;
case 'E':
e = price ;
d = e / r_euro ;
y = d * r_yen ;
printf("%6.3f EUR =%6.3f USD =%6.3f JPY.\n", e,d,y );
break;
case 'Y':
y = price ;
d = y / r_yen ;
e = d * r_euro ;
printf("%6.3f EUR =%6.3f USD =%6.3f JPY.\n", e,d,y );
break;
default:
printf("Error in unit.\n");
}
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
もっと短く書けそうな気がしたので、短くできたら、次回、短くなったコードを記録したい。
-----
動け!タイムライン