第5回

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