課題5
以下の課題に関するレポートを、buturi-johoshori@tiger.kobe-u.ac.jp
までメイルで送りなさい
メイルのsubjectは、report5 とし
レポートの一番最初に、氏名、学籍番号を記すこと
送付するのは、ソースコードのみ(実行ファイルは不要)
5−A:
以下のプログラム report5a.c は、2次方程式
X2 + BX + C = 0
の解(実根のみ)を求めるプログラム( kadai5a.c
)である。プログラムの左端の数字は行を表すために付記している。
プログラムとして使う場合は、消去するか上のリンクのファイルを用いよ。
このプログラムは、コンパイルが通らない。
( gcc -lm -o kadai5a kadai5a.c )
エラーは以下の通り
vostok2:~/joho-shori/lesson5 okubo$ gcc
-o kadai5a kadai5a.c
report4a.c: In function 'main':
report4a.c:16: error: subscripted value is neither array nor pointer
report4a.c:17: error: subscripted value is neither array nor pointer
report4a.c: At top level:
report4a.c:23: error: parse error before "else"
report4a.c: に続く数字がプログラムの最初の行からの行数である。
このプログラムの間違いを正せ。正したプログラムをレポートとして提出せよ。
report4a.c
1: #include <stdio.h>
2: #include <math.h>
3:
4: int main()
5: {
6: double b =10.0;
7: double c = 9.0;
8:
9: printf("x^2 + %fx + %f = 0 ¥n",b,c);
10:
11: double d, x1, x2;
12:
13: d=(b*b-4*c);
14:
15: if(d>0) {
16: x1=-b/2+sqrt[d]/2;
17: x2=-b/2-sqrt[d]/2;
18: printf("anwswer: x=%f,
%f¥n¥n",x1,x2);
19:
20: } else if (d==0)
21: printf("answer: x=%f
¥n¥n",-b/2);
22:
23: } else {
24: printf("No answer in real
number¥n");
25:
26: return 0:
27: }
Hint: 平方根を求めるためには、関数 sqrt ( ) を使用すること。
この場合
#include <math.h>
をプログラムの冒頭に記し、コンパイルには
gcc -lm -o kadai5a kadai5a.c
とすること。
5−B:
2次方程式
AX2 + BX
+ C = 0
の解を
実根 (重根)
虚根
の場合全てについて求めるプログラム(kadai5b.c)を作成せよ。
(Aが 0 の場合も解を求めよ。)
但し、係数A, B, C は標準入力より入力し(*1)、結果は標準出力(*2)に出力するものとする。
*1:
倍精度実数(double)変数aに、標準入力から値を読み込むには、以下のようなscanf関数を用いる。
double a;
scanf ("%f",
a);
*2: 倍精度実数(double)変数aの値を標準出力へ出力するには、以下の様にprintfを使う。
double a;
printf("%f", a);
5−C:
自然数 M, N (M, N<10000) の最小公倍数、最大公約数を求めるプログラムを作りなさい。
但し、M, N は標準入力から読み込むものとする
数学的背景:
最大公約数の求め方: ユークリッドの互除法を用いる。
(Greatest Common Divisor)
1. 入力を m, n とする。
2. nが0なら、mを出力して終了
3. nがmを割り切るなら nを出力してアルゴリズムを終了する
4. そうでないならmをnで割った余りを新たにmとし、更に mと nを取り替えて3に戻る。
このm が解
最小公倍数の求め方:
(Least Common Multiple)
LCM = a * b / gcd