プログラミング

コンピュータ基礎実験 第6回
コンピュータープログラミング
(C言語)(3)
1.関数と分割コンパイル
(復習)
2.キーボード入力
「関数と分割コンパイル」の復習
「関数」:データ処理の「ひとまとまり」
「f(a,b)」は、データa,bに対する、決まった処理(計
算や文字出力等)を表す
見通しのよさ、定型処理の繰り返し
「分割コンパイル」:巨大なプログラムを複数
のファイルに分けて、個々でコンパイル
編集、変更、分担開発が容易
コンパイル時間の短縮
分割コンパイルの手順
• 「ex-5-4-1.c」をコンパイル
$ cc -c ex-5-4-1.c ⇒ ex-5-4-1.o (オブジェクトファイル)
• 「ex-5-4-2.c」をコンパイル
$ cc -c ex-5-4-2.c ⇒ ex-5-4-2.o (オブジェクトファイル)
• 「ex-5-4-1.o, ex-5-4-2.o」をリンク
$ cc ex-5-4-1.o ex-5-4-2.o ⇒ a.exe (実行ファイル)
ex-5-4-1.c
ex-5-4-1.o
コンパイル
「cc -c」
ex-5-4-2.c
ソース
ファイル
リンク
「cc 」
ex-5-4-1.o
オブジェクト
ファイル
a.exe
実行ファイル
3
前回課題2:分割コンパイル:
ex5-5-1.c, ex-5-5-2.c,ex5-5-3.c
(a,b)=(1,2)、(3,4)、(5,6)…(19,20)の10個の実
数の組に対し、積a*b、商a/bを計算するプロ
グラムを、「main()」(ex5-5-1.c)と「basiccalc()」
(ex5-5-2.c)の2つのソースファイルに分けて、
分割コンパイルせよ。
「ex5-5-2.c」をコピーして「ex5-5-3.c」というソー
スファイルを作り、これを改造して和、差を計
算するプログラムを作れ
4
前回課題2回答例1/2:
ex5-5-1.c, ex5-5-2.c 「printf()」は、この
ファイル内で使う
ex5-5-1.c:
ex5-5-2.c:
void basiccalc(float a, float b);
#include <stdio.h>
int main(void)
このファイル内では定義さ
{
float a,b; れていない「basiccalc」
void basiccalc(float a, float b)
{
float c,d;
という関数を使うことを宣言
a=1; b=2; basiccalc(a,b);
a=3; b=4; basiccalc(a,b);
a=5; b=6; basiccalc(a,b);

c=a*b; b=a/b;
printf(”a=%f b=%f の時、”,a,b);
printf(”積%f 商%f\n”,c,d);
}
a=17; b=18; basiccalc(a,b);
a=19; b=20; basiccalc(a,b);
return 0;
}
5
前回課題2回答例2/2:
ex5-5-3.c
ex5-5-3.c:
#include <stdio.h>
void basiccalc(float a, float b)
{
float c,d;
c=a+b; b=a-b;
printf(”a=%f b=%f の時、”,a,b);
printf(”和%f 差%f\n”,c,d);
}
6
前回分割コンパイルの手順
• 「ex-5-5-1.c」をコンパイル
$ cc -c ex-5-5-1.c ⇒ ex-5-5-1.o
• 「ex-5-5-2.c」をコンパイル
$ cc -c ex-5-5-2.c ⇒ ex-5-5-2.o
• 「ex-5-5-3.c」をコンパイル
$ cc -c ex-5-5-3.c ⇒ ex-5-5-3.o
• 組み合わせを変えてリンク
– 「積」と「商」: $ cc ex-5-5-1.o ex-5-5-2.o
– 「和」と「差」: $ cc ex-5-5-1.o ex-5-5-3.o
7
キーボードからの入力
コンピューターは、「キーボード」や「マウス」、
「タブレット」などからデータを入力することが
できます
例えば、「四則計算プログラム」でもキーボー
ドから好きな数を入力して計算できると便利
ですね
C言語では、「データの入力」も、「関数」(入出
力関数)を利用して実現可能です
キーボード入力関数「scanf()」
変数型宣言
int a;
のあとに
scanf(“%d”, &a);
とすると,キーボードから入力した整数の値が
aに入力される.
9
• 2つ以上の数の場合も同様に
int a, b, c, …, ;
☜ 整数型の
変数の場合
printf(“2つの整数? ”);
scanf(“%d %d”, &a, &b);
・ 実数型なら ☜ 実数型の
変数の場合
float x;
printf(“x= ”);
scanf(“%f”, &x);
文字型変数
☟ の場合
文字型なら
char name[10];
printf(“%s”);
scanf(“%s”, name);
& は不要
10
アドレス修飾演算子「&」(発展)
 「scanf(”%d”,&a)」では、変数「a」に「&」という記号
が付いています。これは何でしょう?
「scanf(”%d”,&a)」は、「キーボードから読み込んだ
データを「a」という箱に記録してくれ」という命令です
「a」に記録するには、「a」が何番目の箱かがわからな
ければなりません(今「a」に何が記録されているかは
どうでもよい)
「&a」は、「a」の番号(アドレス)の値になります
アドレス(箱番号) 0
値
325
1
2441
2
3
-523
39
4
812
「a」と名付けた
a ⇒ 39
&a ⇒ 3
5
-3665
‥‥
課題6-1: ex1-4で用いたa,bをキーボードから入力するプログラムに
書き替えてみよう.
/* ex1-4 */
#include <stdio.h>
main()
{
int a,b;
a=11,b=3;
printf("a=%d",a);
printf(", b=%d\n",b);
printf(" a+b=%d\n",a+b);
printf(" a-b=%d\n",a-b);
printf(" a*b=%d\n",a*b);
printf(" a/b=%d",a/b);
printf(" あまり %d\n",a%b);
printf("2つの整数?");
scanf("%d %d",&a, &b);
のように書き替える
 このファイル名は
ex6-1.c として
下さい.
}
12
■ 以下の課題に対するプログラムを作り,実行例を3つ以上示せ.
課題 6-2: 半径を与え,周囲の長さと面積を求めるプログラム
( ex6-2.c )を作成せよ.ただし,円周率π= 3.14159265
とする.
課題 6-3: 三角形の底辺の長さaと高さhを与え,面積を求める
プログラム( ex6-3.c )を作成せよ.
課題 6-4: 質量m1の質点の置かれている座標をx1,質量m2の
質点の置かれている座標をx2とする.x1, m1, x2, m2を与え,
重心の座標xGを求めるプログラム( ex6-4.c )を作成せよ.
ただし,例としてx1= 0, m1=10, x2 = 1, m2=1の場合を含めて
実行例を3つ以上示せ.
13
■ 発展課題
課題 6-5: 三角形の3辺の長さa, b, cを与え,面積を求めるプロ
グラム( ex6-5.c )を示せ.ただし,三角形の面積を与える
公式(Heronの公式)は既知とする.
Heronの公式
S = s(s - a)(s - b)(s - c)
ここで,平方根の計算は
where 2s = a + b + c
sqrt(…) とすればよい.
[ヒント] プログラムの最初に #include <math.h> を加えること
発展課題 6-6: 課題 6-5において,平方根の計算を正確に
計算するプログラムを示せ.( ex6-6.c )
[ヒント]変数をdouble a,b,c,…  scanf(“%lf,…,&a, …) 、
printf(“%1.15f…”,a)として下さい.
14
算術関数
三角関数や指数関数など、数学で使う関数
はワープロやウエブブラウザなどの、よく使わ
れる普通のソフトではめったに使われません
算術関数を使いたい時には、その旨宣言す
る必要があります
「prinf()」を使いたいときには「#include <stdio.h>」
「sin()」を使いたいときには「#include <math.h>」
リンクのとき、算術関数を含むオブジェクト
ファイル(既に用意されている)をリンクする必
要があります
算術関数のリンク
算術関数の例
sin(), cos(), asin(), exp(), sqrt(), pow() ⇒ WEB検索
算術関数のオブジェクトファイルをリンクする
場合には「-lm」のオプションをつける
 $ cc -lm hoge.c (単一ソース)
「hoge.c」はsin()」を含む単一ソース
 $ cc -lm hoge1.o hoge2.o (分割コンパイル)
分割コンパイルの場合の最後のリンク時
既に準備されている「オブジェクトファイル」を「ラ
イブラリ」と呼びます
実習結果のレポート
• 3つのソースファイル「ex6-2.c」、「ex6-3.c」、
「ex6-4.c」を添付ファイルにしてメールを送って
ください。
• 宛先: [email protected]
• 件名:コンピューター基礎実験6
• 本文:感想および一言
17