170 likes | 271 Views
コンピュータ基礎実験 第6 回. コンピュータープログラミング( C 言語)(3) 1.関数と分割コンパイル (復習) 2.キーボード入力. 「関数と分割コンパイル」の復習. 「関数」:データ処理の「ひとまとまり」 「 f( a,b ) 」は、データ a,b に対する、決まった処理(計算や文字出力等)を表す 見通しのよさ、定型処理の繰り返し 「分割コンパイル」:巨大なプログラムを複数のファイルに分けて、個々でコンパイル 編集、変更、分担開発が容易 コンパイル時間の短縮. 分割コンパイルの手順. 「 ex-5-4-1.c 」をコンパイル
E N D
コンピュータ基礎実験 第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」 リンク 「cc 」 a.exe ex-5-4-2.c ex-5-4-1.o 実行ファイル ソース ファイル オブジェクト ファイル
前回課題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」というソースファイルを作り、これを改造して和、差を計算するプログラムを作れ
前回課題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); int main(void) { float a,b; a=1; b=2; basiccalc(a,b); a=3; b=4; basiccalc(a,b); a=5; b=6; basiccalc(a,b); a=17; b=18; basiccalc(a,b); a=19; b=20; basiccalc(a,b); return 0; } #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); } このファイル内では定義されていない「basiccalc」 という関数を使うことを宣言
前回課題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); }
前回分割コンパイルの手順 • 「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-4-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
キーボードからの入力 • コンピューターは、「キーボード」や「マウス」、「タブレット」などからデータを入力することができます • 例えば、「四則計算プログラム」でもキーボードから好きな数を入力して計算できると便利ですね • C言語では、「データの入力」も、「関数」(入出力関数)を利用して実現可能です
キーボード入力関数「scanf()」 変数型宣言 int a; のあとに scanf(“%d”, &a); とすると,キーボードから入力した整数の値が aに入力される.
☜ 整数型の 変数の場合 • 2つ以上の数の場合も同様に inta, b, c, …, ; printf(“2つの整数? ”); scanf(“%d %d”, &a, &b); ・実数型なら float x; printf(“x= ”); scanf(“%f”, &x); 文字型変数 ☟ の場合 文字型なら char name[10]; printf(“%s”); scanf(“%s”, name); ☜ 実数型の 変数の場合 &は不要
アドレス修飾演算子「&」(発展) • 「scanf(”%d”,&a)」では、変数「a」に「&」という記号が付いています。これは何でしょう? • 「scanf(”%d”,&a)」は、「キーボードから読み込んだデータを「a」という箱に記録してくれ」という命令です • 「a」に記録するには、「a」が何番目の箱かがわからなければなりません(今「a」に何が記録されているかはどうでもよい) • 「&a」は、「a」の番号(アドレス)の値になります アドレス(箱番号) 1 2 3 4 0 5 ‥‥ 値 「a」と名付けた a⇒ 39 &a ⇒ 3
課題6-1: ex1-4で用いたa,bをキーボードから入力するプログラムに書き替えてみよう. /* ex1-4 */ #include <stdio.h> main() { inta,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として • 下さい.
■以下の課題に対するプログラムを作り,実行例を3つ以上示せ.■以下の課題に対するプログラムを作り,実行例を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つ以上示せ.
■ 発展課題 課題6-5: 三角形の3辺の長さa, b, cを与え,面積を求めるプロ グラム(ex6-5.c)を示せ.ただし,三角形の面積を与える 公式(Heronの公式)は既知とする. Heronの公式 ここで,平方根の計算は sqrt(…) とすればよい. 発展課題 6-6: 課題6-5において,平方根の計算を正確に 計算するプログラムを示せ.(ex6-6.c) [ヒント] プログラムの最初に #include <math.h> を加え, 変数もdouble a,b,c,… scanf(“%lf,…,&a, …) として下さい.
算術関数 • 三角関数や指数関数など、数学で使う関数はワープロやウエブブラウザなどの、よく使われる普通のソフトではめったに使われません • 算術関数を使いたい時には、その旨宣言する必要があります • 「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」を添付ファイルにしてメールを送ってください。 • 宛先: muroo@cc.tuat.ac.jp • 件名:コンピューター基礎実験6 • 本文:感想および一言