introduction c languagenakalab.depe.titech.ac.jp/.../07/introduction_c_language.pdfpartial...
TRANSCRIPT
Partial Differential Equations for Science and Engineering
§9 C言語によるプラグラミングPrograming in C-Language
Partial Differential Equations for Science and Engineering
§ 9.0 C言語
Ø プログラミング用の高水準言語の一つ
高水準言語:人間が容易に理解できる形態(文章,数式)で,プログラムを記述するもの.
Ø C言語(C-Language): 1972年に提案.非常に広範な分野で使用.
制限が少なく,様々な用途に利用可能
(OS; UNIX を記述するために開発されたから)反面,間違いをおかし易い.
非インタプリタ言語(コンパイルが必要)
インタプリタ言語(Python, Ruby, Perl,…)に比べ高速FORTRANとともに科学計算に広く利用される
Partial Differential Equations for Science and Engineering
§ 9.1 C言語によるプログラム開発の流れ
Ø 以下の3段階がC言語による解析の手順
Describe Calculationto be done by Computer
in C-Language
1st Step : Coding
C=A+B
(Source Code)
2nd Step : Compile
C=A+B010100101000101001
Translate Source Code to“Executable File (Program)”.
Source code Executable File(Program)
3rd Step : Execution
010100101000101001
Executable File(Program)
Run the “Executable File” on a Computer.
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造
Ø C言語のソースコードの一例(二分法による求根プログラム)
#include <stdio.h>#include <math.h>
void main( ){int n;int n_max;double x1;double x2;double f_at_x1;double f_at_x2;double xm;double f_at_xm;double x_theory;
x_theory=1.5-sqrt(1.25);
n_max=100;x1=0.0;x2=2.0;f_at_x1=x1*x1-3.0*x1+1.0;f_at_x2=x2*x2-3.0*x2+1.0;
for(n=1;n<=n_max;n++){xm=0.5*(x1+x2);f_at_xm=xm*xm-3.0*xm+1.0;if(f_at_xm*f_at_x1>=0.){x1=xm;f_at_x1=f_at_xm;
}else{x2=xm;f_at_x2=f_at_xm;
}printf("%d %e %e¥n",n,xm,fabs(xm-x_theory));
}
return;}
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造#include <stdio.h>#include <math.h>
void main( ){
(省略)
return;}
#include <stdio.h> → standard I/O (Input & Output): 出力・入力に関する関数#include <math.h> → 数学の関数(sin, cos, tan, exp, log,…)
Ø ヘッダーファイルの読み込み
C言語には様々な関数が用意されているが,その定義が書かれているファイル(ヘッダーファイル “*.h”)を読み込む必要がある.
Ø プログラムの本体:main関数
l C言語では,ソースコード中にmain関数がひとつ必要.l プログラムの実行時には,main関数の”{“ と”}”で囲まれた範囲が,上から順番に実行される.
l 終了時には,”return”を書いておしまい.
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造
#include <stdio.h>#include <math.h>
void main( ){int n;int n_max;double x1;double x2;double f_at_x1;double f_at_x2;double xm;double f_at_xm;double x_theory;
x_theory=1.5-sqrt(1.25);
n_max=100;x1=0.0;x2=2.0;f_at_x1=x1*x1-3.0*x1+1.0;f_at_x2=x2*x2-3.0*x2+1.0;
(省略)
return;}
変数の型宣言
Ø main関数の書き方
l 最初に,以降で用いる変数について,それぞれの種類(型)を宣言する必要がある.
l 変数の型宣言を行わない変数は,使用できない.
l 文の最後にはセミコロン “ ; ” を付ける.
l 大文字と小文字を区別する.
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ー変数型
Ø C言語における変数の型(代表例)
整数(-1,0,1,2,3…) int型実数(eg. 0.123) float型(単精度実数) or double型(倍精度実数)文字 char型
Partial Differential Equations for Science and Engineering
コンピュータ内での数値の表現
• 全ての情報は,メモリー(半導体)上に電気的に保存される.
>メモリー上には,”素子”が並んでいる
電圧Viは高・低,ふたつの状態のみとる.
V1 V2 V3 V4 V5 V6 V7 V8 V9
>素子の電圧の高低で情報が保存される → 2つの状態のみとる.
高電圧: “0” 低電圧: “1” と対応(2進数)
§ 9.2 C言語のソースコード(Source Code)の構造ー変数型
Partial Differential Equations for Science and Engineering
• コンピュータ上では,10進数は2進数で表現される.EX. 十進数”150”の二進数での表記
V1 V2 V3 V4 V5 V6 V7 V8
150 = 128 + 16 + 4 +2 = 27 + 24 + 22 + 21
= 1×27 +0×26+0×25+1×24+0×23+1×22 +1×21+0×20
2進数での表記: 1 0 0 1 0 1 1 0 (8桁の数字→8bits)
8個の素子で保存(1桁:1素子を”bit”と呼ぶ)
Quiz: 片手の5本の指だけで,0〜31まで数えてみよう.
§ 9.2 C言語のソースコード(Source Code)の構造ー変数型
Partial Differential Equations for Science and Engineering
変数型ごとのビット数
整数(int型):
bit数 値の範囲
実数(float型) :
32bits
32bits
64bits
桁数が長いほど,大きな数まで表現できる.
実数(double型) :
-2147483648〜2147483647
変数の型ごとにbits数(2進数の桁)は決まっている.
0.0 と±10-38程度〜±1038程度
0.0 と±10-38程度〜±1038程度
§ 9.2 C言語のソースコード(Source Code)の構造ー変数型
Partial Differential Equations for Science and Engineering
仮数部 指数部
単精度(float)と倍精度(double)の違い実数の表現方法(概念的説明):
ある実数: 3141592.65358972341414141…
指数表記: 3.14159265358972341414141…×106
単精度(float): 0 0 1 ... 0 0 ... 1
仮数部 指数部
32bits
仮数部と指数部を分けて,それぞれあるbits数で表現する.倍精度(double): 仮数部 指数部
64bits
0 0 1 ... 0 1 1 0 1 0 ... 1
倍精度は仮数部の桁数が長い!
Partial Differential Equations for Science and Engineering
単精度と倍精度の違い
有効桁(記憶しておける仮数部の桁数)は,bits数が大きいほど長い!
単精度(float): 7桁 → 3.141592
倍精度(double): 15桁 → 3.14159265358972
有効桁数
科学技術計算では,繰り返し計算を行う場合が多く,有効桁数の制限による計算の誤差が蓄積しやすい.
そのため,桁数の長い “倍精度型” を使うことが暗黙の了解とされる.
倍々精度(long double): 33桁
Partial Differential Equations for Science and Engineering
Ø 計算にまつわる演算子
§ 9.2 C言語のソースコード(Source Code)の構造ー演算子
A=B+C A=B+C;
A=B-C A=B-C;
A=B×C A=B*C;
A=B÷C A=B/C;
A=BC A=pow(B, C);
足し算:
引き算:
掛け算:
割り算:
BのC乗:
※ B,Cは倍精度実数(double)型
Partial Differential Equations for Science and Engineering
Ø 計算にまつわる演算子(省略型)
§ 9.2 C言語のソースコード(Source Code)の構造ー演算子
i=i+1; i++;整数iに関する省略型:
i=i-1; i--;
整数&実数に対して: A=A+B; A+=B;
A=A-B; A-=B;
A=A*B; A*=B;
A=A/B; A/=B;
Partial Differential Equations for Science and Engineering
Ø キャスト演算子・・・変数の型を変換する
§ 9.2 C言語のソースコード(Source Code)の構造ー演算子
int i;double A;
A=(double)i ;
i=(int)A;
整数iを倍精度実数(double)型に変換
倍精度実数Aを整数型(int)に変換
Partial Differential Equations for Science and Engineering
int a;int b;double c;
a=1;b=2;c=(a/b);
不適切な変数型を使用することで,想定されない間違いを生じる可能性がある.
Ex: 整数型同士の計算結果が実数に成る場合
c=0.5 となるはずだが,実際にはc=0.0 となる.
§ 9.2 C言語のソースコード(Source Code)の構造ー演算子
int a;int b;double c;
a=1;b=2;c=((double)a/(double)b);
正しい書き方(キャストする)
Partial Differential Equations for Science and Engineering
• 同じ計算を繰り返したい場合がある.
a = 1nn=1
5
∑
EX: 単純に書けば,
double a;int n;
a=0.0;n=1;a=a+1./(double)n;n=2;a=a+1./(double)n;n=3;a=a+1./(double)n;n=4;a=a+1./(double)n;n=5;a=a+1./(double)n;
nを1,2,3,4,5と+1づつしながら,同じ計算をする操作.
§ 9.2 C言語のソースコード(Source Code)の構造ーfor文
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ーfor文
• 同じ計算を繰り返したい場合がある.
a = 1nn=1
5
∑
EX: 単純に書けば,
double a;int n;
a=0.0;n=1;a=a+1./(double)n;n=2;a=a+1./(double)n;n=3;a=a+1./(double)n;n=4;a=a+1./(double)n;n=5;a=a+1./(double)n;
forループを使えば,
double a;int n;
a=0.0;for(n=1; n<=5; n++){
a=a+1./(double)n;}
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ーfor文
• forループの書き方 (C言語)
for( “式A”; “条件式B”; ”式C“){….}
A:ループの最初に行う処理
B:ループを繰り返す条件(これが満たされる間はループは繰り返される)
C:ループ内の処理(“{…}”の部分)を1回やった後に,実行される式
for(n=1; n<=5; n++){….}
A:最初にn=1を代入.B: nは5以下(“<=“は”以下”という意味)の間繰り返すC: nを1づつ増やす(“n++”は”n=n+1”という意味)
Partial Differential Equations for Science and Engineering
• 計算された変数の値によって,異なる処理を実行したい場合がある→条件分岐
§ 9.2 C言語のソースコード(Source Code)の構造ーif文
「if 文」
if(“条件式”) {
“処理A”
}else{
“処理B”
}
C言語
“条件式”が成り立つ場合 → “処理A”が実行それ以外の場合 → “処理B”が実行
Partial Differential Equations for Science and Engineering
• else文の部分は省略可能
条件分岐
「if 文」
if(“条件式”) {
“処理A”
}
C言語
“条件式”が成り立つ場合 → “処理A”が実行それ以外の場合 → なにもしない
Partial Differential Equations for Science and Engineering
• C言語の場合
条件式の種類
aとbが等しければ if(a==b) {aとbが等しくなければ if(a!=b) {
aがbより大きければ if(a>b) {aがb以上であれば if(a>=b) {
aがbより小さければ if(a<b) {aがb以下であれば if(a<=b) {
条件式
二つ以上の条件の組み合わせ
“条件A”と”条件B”が共に成り立つ(and)ならば, if( “条件A” && “条件B”){ 例: if((a==b)&&(c<=d)) {
aがbと等しく,cはd以下ならば,
“条件A”と”条件B”の何れかが成り立つ(or)ならば, if( “条件A” || “条件B”){ 例: if((a==b)||(c<=d)){
aがbと等しいか,cはd以下の何れかであれば,
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ー画面への出力
• 数値の出力C言語: printf関数を用いる.
int n;double a;double b;
n=1;a=0.;b=2.;
printf( “ %d %e %e ¥n” , n, a, b);
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ー画面への出力
• 数値の出力C言語: printf関数を用いる.
printf( “ %d %e %e ¥n” , n, a, b);画面上への出力の様子
%d :ここに整数を出力
書式指定子
%e :ここに実数(指数表示; 1.0000e+3)を出力
%f :ここに実数(小数点表示; 1000.0000)を出力
%s :ここに文字を出力
¥n :ここで改行
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ー画面への出力
• 数値の出力C言語: printf関数を用いる.
n=1; a=0.; b=2.;printf( “ %d %e %e ¥n” , n, a, b);
実際の画面上では,
1 0.0000E+00 2.00000E+00 と出力される.
ここでの並びの順番で”…”内の%d or %e の位置に値が出力.
書式指定子の個数と,変数の数は一致しなければならない
書式指定子の型と,変数の型は一致しなければならない
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ー画面への出力
• 数値の出力C言語: printf関数を用いる.
n=1; a=0.; b=2.;printf( “ %d %e¥n %e ¥n” , n, a, b);
実際の画面上では,
1 0.0000E+00 2.00000E+00
と出力される.
¥n :ここで改行
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ー画面への出力
• 数値の出力C言語: printf関数を用いる.
n=1; a=0.; b=2.;printf( “v_n=%d v_a=%e v_b=%e ¥n” , n, a, b);
実際の画面上では,
v_n=1 v_a=0.0000E+00 v_b=2.00000E+00
と出力される.
Partial Differential Equations for Science and Engineering
§ 9.2 C言語のソースコード(Source Code)の構造ーファイルへの出力
• C言語
①ファイルを開く
②書き出す( fprintf関数)③ファイルを閉じる
の3段階で行う.
Partial Differential Equations for Science and Engineering
出力ーファイルへ
• C言語 int n;double a;double b;FILE *fp;
n=1; a=0.; b=2.;
fp=fopen ( “output.txt”, “w”);fprintf(fp, “ %d %e %e ¥n” , n, a, b);fclose(fp);
Partial Differential Equations for Science and Engineering
出力ーファイルへ
• C言語
FILE *fp; ファイルを区別するための変数(お作法)
fp = fopen ( “ output.txt ”, “w”);
output.txtという名前のファイルを,書出しのために開く.
“w” : 書き出しoutput.txtというファイルが無ければ,新たに作り,ファイルが有れば,それを消去した上で,新規に作成
“a” : 追加書出し既存のファイル(output.txt)の末尾に追加して出力する.
Partial Differential Equations for Science and Engineering
出力ーファイルへ
• C言語
fprintf ( fp, “ %d %e %e ¥n” , n, a, b);
実際の書出しには,printfの代わりに,fprintf関数第一引数に,ファイル変数”fp”を指定する.
fclose (fp); ファイルを閉じる(出力終了)
Partial Differential Equations for Science and Engineering
§9.3 やってみよう!
#include <stdio.h>#include <math.h>
void main( ){
int n;double f;FILE *fp;
fp=fopen("result.dat", "w");for(n=0;n<=5;n++){
f=2.*(double)n;printf("%d %e¥n", n, f);fprintf(fp,"%d %e¥n", n, f);
}fclose(fp);
return;}
f = 2× n n = 0,1, 2,3, 4, 5( )を計算し,画面とファイル”result.dat”に出力するプログラム.
Ø このソースコードを打ち込んでみる.
Ø Editor (コードを書くアプリケーション)は何を使用しても良い.(mi, emacs, xcode,…)
Ø ソースコードのファイルの名前は“英語”とし,最後は”.c”で終わる.
Ex. sample.c , practice.c ,...
Partial Differential Equations for Science and Engineering
§9.3 コンパイルのやり方
Ø コンパイル(Compile)と実行(Execution)は, ターミナル(Terminal)から行う.
Ø コンパルには “ cc “ コマンドを使用する.
Partial Differential Equations for Science and Engineering
§9.3 コンパイルのやり方Ø コンパイルには “cc”コマンドを利用する.
Ø “cc <スペース> <ソースコードの名前>”
Partial Differential Equations for Science and Engineering
§9.3 コンパイルのやり方
Warning(警告)が一つでるが,無視してOK
Partial Differential Equations for Science and Engineering
§9.4 プログラムの実行Ø プログラムの実行は,ターミナル上で以下を打ち込む
./a.out
Partial Differential Equations for Science and Engineering
課題
2.3節ガウスの消去法を理解し、「プログラム2.2」を作成、コンパイル、実行してみる。