第1回 プログラミング応用(担当 三輪)
数値計算の基本的なアルゴリズムを学修し、C言語に
よるプログラムを作成して実行することにより、数値計
算の考え方を習得する。
C言語プログラミングのための各種ツールの使い方
や簡単なグラフィックス・プログラミング、デバッグの方
法も学習し、ある程度実用的なプログラムが作成でき
る技量を身につける。
講義の目標
この講義の前半部分のHPは三輪研HPにあるhttp://www.el.gunma-u.ac.jp/~miwalab/c_prog
授業の概要
C言語の初級者を対象とする。
プログラミング基礎
を履修し、
Unixの基本(ファイル操作)、エディタの使い方、C言語プログ
ラムのコンパイルと実行方法、for文,if文,printf関数などを理解
していること
授業内容のレベル
総合情報メディアセンターの演習室の端末を利用する。
最初に30分程度の説明を行った後、一人一台づつのPCを用いて、
実際にプログラミングを行う。
毎回、課題を提出
する。
中間と最後に
総合的な課題
を行う。
評価法
毎回の課題提出(5点)
中間課題(20点)
最終課題(20点)
の合計点により評価する。
配列や入出力、関数などを用いた簡単なプログラ ムを作成することができる。 数値計算の基本的なアルゴリズムを用いた簡単 なプログラムを作成することができる。60点以上を合格
60~69点をC
70~79点をB
80点以上をA
90点以上の上位5パーセント程度をSとする。
授業の展開
第1回 おさらい(数値表現、for文、if 文)
第2回 配列変数の取り扱い
第3回 ファイル入出力
第4回 gnuplotによるグラフ化の方法
第5回 関数 の取り扱い
第6回 最小二乗法によるフィッティング(1)
第7回 【中間課題】 最小二乗法によるフィッティング(2)
第8回 非線形方程式
第9回 常微分方程式
第10回 数理計画法
第11回 数値積分
第12回 モンテカルロ法
第13回 連立一次方程式
第14回 【最終課題】最小二乗法によるフィッティング(多変数)
第15回 〃
シェル( gnome ターミナル) コマンドを受け付け、入力を解釈してOSに指令を出す GUI (グラフィカルユーザインターフェイス) マウスの動きを判断してOSに指令を出す
OS
基本的な処理プログラムの集合 機械語プログラム実行の交通整理 例)画面表示 ハードディスクに保存コンピュータの構造
CPUは機械語(01の羅列)のみ理解可能
入力装置
CPU
主記憶装置
キーボード、
マウス
演算
(内部記憶装置)
半導体メモリ
出力装置
ディスプレイ
補助記憶装置
(外部記憶装置)
ハードディスク
CD-ROM
判断
機械語の処理
コンパイル
CPUはメモリから機械語プログラムを取り出し、その手順に
従って
数値データを処理
することしかできない
C言語ソースファイル C言語、柔軟性高い、OS 内部まで操作 機械語の生成 実行可能ファイル CPUに直接命令、最も低 級な言語、理解困難 CPU演算
判断
プログラムの実行
内部記憶装置 データ 変数記憶領域 プログラム格納領域 機械語プログラムX
画面出力 ファイル出力 数値データの やり取り プログラムコンパイルの手順
エディタ
により
C言語のソース
ファイルを作成
ccコマンド
により
ソースファイルの
コンパイル
機械語で書かれた
実行可能ファイル
の作成
コンパイルエラーが出れば再編集ディレクトリの作成の準備 (gnome ターミナル上で)
> mkdir src
> ls
> cd src
ディレクトリの作成 (作成は一度だけ)
ディレクトリの確認
ディレクトリの移動
ソースファイルの作成
> emacs ソースファイル名 &
ファイルの編集
注意1)コマンド最終行の
&
は命令をバックグラウンドで起動することを意味
する。ここでは、emacsがコマンドウインドウの裏でも動くため、コマンド受付
とファイル編集を同時に操作できる。
注意2)ファイル名は末尾の拡張子に.cをつけるのが慣習である。
#include <stdio.h> int main() { int i; i=10; printf(“i=%d n”,i); i=i+100; printf(“i=%d n”,i); return 0; }sample.c
Cソースファイルのコンパイル、実行
> cc ソースファイル名
コンパイルの実行
コンパイルが成功すれば
a.out
という名前の
実行可能ファイル
が生成される。
入力に誤りがあれば、エラーメッセージがでてコンパイルに失敗する。このとき、 emacsに戻って編集し直す。コンパイルが成功するまで繰り返す。> cc
-o 実行可能ファイル名
ソースファイル名
注意)-o オプションにより
任意の名前の実行可能ファイル
が生成できる。
>
./
a.out
または
>
./
実行可能ファイル名
プログラムの実行
i = 10
i = 110
プログラムの実行により、例のプログラムでは以下のような結果が出力される。
cc
というunixコマンドを使用する
ピリオドスラッシュの後に実行可能ファイル名を指定#include <stdio.h> int main() { int i; i=10; printf(“i=%d n”,i); i=i+100; printf(“i=%d n”,i); return 0; }
C言語の特徴
sample.c
#include <stdio.h> プリプロセッサ指令 コンパイルの前処理としてさまざまな処理を 実行する. #include命令は<~.h>のようなヘッダー ファイルを読み込んである特定の機能をも つ関数群を使用できるようにする. stdio.h は標準入出力用の関数群であり, ほとんどのプログラムに使用する main 関数 どのプログラムも必ず一つのmain関数を 持つ.プログラムの最初に実行される 左中括弧 { で始まり } で終了する { } 命令文 {}で囲まれた文は命令文と呼ばれる. 命令文は単文と { } で囲まれた複文で構成される. 単文は ;(セミコロン)で終了する. 命令文には右の要素を含む int i; i=10; printf(“i=%d n”,i); i=i+100; printf(“i=%d n”,i); return 0; 5.変数宣言 6.代入文 7.関数 8.リターン文ビットとバイト
・計算機の中ではCPUは0と1のみを判断できる. ・ 0か1を表す最小単位を1ビット呼ぶ. ・メモリにはプログラムやデータが格納されるがビット毎に並んでいるわけではない 1ビットの足し算 0+0=0 0+1=1 1+0=1 1+1=10 (次の桁に1繰り上がる) 10進数 2進数 0 0000 1 0001 2 0010 3 0011 4 0100 00100101101001000000010100101101 ・メモリには均等に番号(アドレス)が割り当てられている. 1バイトのデータでは1,0の組み合わせで,256の範囲の整数を表せる 8個のビットデータの集まりを1バイトと呼ぶ. 各アドレスは1バイトの整数倍(CPUによって異なる) を基本単位とするビットデータが格納される アドレス 番号 データ 217 218 219 220C言語で扱えるデータ型(1)
ビットの羅列の数や,ビット情報を何に対応させるかで扱えるデータの種類が異なる 整数型 (ビットの羅列を符号付の二進数で表される整数と見る) short 16ビット(2バイト)長 -32,768~32,767 long 32ビット(4バイト)長 -2,147,483,648~2,147,483,647 long long 64ビット(8バイト)長 -9,223,372,036,854,775,808 ~9,223,372,036,854,775,807 int システムによって異なる 整数型には int 型を指定することが多い。 char 8ビット(1バイト)長 -128~127 char型は数値ではなく文字を表すときにも使用 これらの型に unsigned が付くとビットの羅列を符号なしの二進数で表される整数 と見る.すなわち,下限が0で,符号付きの場合の上限の二倍+1が上限となる.ビット長に比例して有効桁数が増加する
C言語で扱えるデータ型(2)
実数型 (ビットの羅列をIEEE浮動小数点で表される実数と見る)float 32ビット長 1.1e-38 ~3.4e+38 単精度浮動小数点型
double 64ビット長 2.2e-308 ~1.7e+308 倍精度浮動小数点型
long double 96ビット長 1.1e-4932 ~3.3e+4932 拡張精度浮動小数点型
符号ビット 指数部 8 ビット 仮数部 23 ビット 単精度のIEEE浮動小数点形式( 32ビット ) 値=(-1)符号ビット×2 ×(1+c)a-127 指数部を符号なし 二進数としたとき の整数値 = a 各ビット列をb(n)としたとき
23 12
)
(
n nn
b
c
ビット長に対して指数関数的に有効桁数が増加する
変数の型宣言
int main() {
型名 変数名;
メイン関数の命令文の先頭で指定
short seisuu; 変数 seisuu を16ビットの符号付整数型として宣言
float jissuu1, jissuu2; 単精度の浮動小数点型として変数 jissuu1 と
jissuu2 をコンマで区切って同時に宣言
char i=10; 宣言文と代入文を組み合わせて,
初期値を設定可能
hensuu
jissuu1
jissuu2
i
10
seisuu
メモリ内に割り当てられた変数の様子(箱の大きさが8bitの場合)
変数名と、 領域の先頭番号,占有バイト数,データの種類(整数?実数?)は対応 プログラマは変数名を取り扱う、CPUにとっては、先頭アドレスから定められた範囲にある bitの羅列を数値に変換して取り扱う。標準入出力関数
printf ( “ 出力文字列 および 変換文字 “, 変数名1 , 変数名2 , ・ ・ ・)
文字や数値を変換文字(フォーマット指定子)で示された表示法で表示
scanf ( “変換文字 “, &変数名1 , &変数名2 , ・ ・ ・)
変換文字で示された書式で,キーボードからの入力を変数に代入する関数
変換文字の書式指定が重要
端末画面に文字を表示する関数
printf関数
printf(“出力文字列 および 変換文字“,数値もしくは変数名, ・ ・ ・,・ ・ ・)
printf(”Hello”); Hello printf(”i=%ddd”,i); i=10dd
printf(”i=%d : j=%d”,i,j); i=10 : j=5 printf(”%d %d %d”,1,2,3); 1 2 3
printf(”abc ndef”); abc def
改行文字 バックスラッシュ(もしくは ¥マーク) n
int i=10, j=5; float a=3.141592; ・第一引数の変換文字と代入する変数のデータ型は一致させる ・第二引数以降は数値を指定する.変数で表される数値でもよい改行文字を入れない限り、最後に表示された位置の右に書かれていくので注意
フォーマット指定子
データの種類 変換文字 浮動小数点数 %f 浮動小数点数(指数表示) %e 文字 %c 文字列 %s データの種類 10進数 8進数 16進数 int型 %d %o %x short型 %hd %ho %hx long型 %ld %lo %lx long long型 %Ld %Lo %Lxprintf(”%5d”,i); 表示桁数の指定 10 printf(”%f”,a); 浮動小数点表示 3.141592
printf(”%5.3f”,a); 書式付浮動小数点表示 3.142
%小数点も含む総文字数.小数点以下の桁数f
printf(”%e”,a*100); 浮動小数点指数表示 3.141592e+02 printf(”%d”,a); データ型を間違えた場合 -57999238
表示する数値をフォーマット指定子を使って、表示形式を変えられる
scanf関数
scanf ( “変換文字“, &変数名1 , &変数名2 , ・ ・ ・)
標準入力関数 scanf は変換文字で示された書式で,キーボードからの入力 を変数に代入する関数である. ・第一引数の変換文字には printf 関数と同じものを用いる ・変換文字と代入する変数のデータ型は一致させる ・第二引数以降の変数には変数名の前に & をつける. &変数名は,その変数が格納されているメモリ内のアドレス番号を関数に渡すことになる 引数に変数名のみを指定すれば,変数が今現在持っている数値を関数に渡すことにな る.この場合アドレス番号10番にデータを入力しようとする。そうすると実行時に「セグメ ンテーションエラー」が出てプログラムは停止する。
i
10
アドレスに変数型に対 応するバイト数分の データを格納
scanf関数の働き
int i; scanf(”%d”,&i); 変数が格納されたアドレスを示す数値が入る 1 2 入力を受け付ける 12をint型として変換 00000000000000000000000000001100i
10
変数 i が格納される 先頭のアドレスを受 け取る 214 215 216 217 218 219 220 221 222 223 224i
プログラムの流れの制御
条件式
によって流れを変える
start end 処理1 処理2 処理3 上から下のみの流れ 条件に対してYes か Noで 処理を2分岐 start 処理2’ end 処理1 処理2 処理3 条件成立? ある処理からジャンプ Yes No No流れの順序を変える
流れを枝分かれ
Yes 処理2 end 処理3 start 処理1 条件成立?条件式
条件式が真(YES)か偽(No)かの結果を出力する
関係演算子 == != > < >= <= 等しい 異なる より大きい より小さい 以上 以下 a==0 a!=0 a>0 a<0 a>=0 a<=0 && || ! 論理積(AND) 論理和(OR) 論理否定(NOT) (a==0) && (b==0) (a==0)||(b=0) !(a==0) a=0 かつ b=0か? a=0 または b=0か? a=0 でないか? aが0と等しいか? a が0以外か? a が0より大きいか? a が0より小さいか? a が0以上か? a が0以下か? 論理演算子複数の条件を組み合わせた条件を表現可能
記号 意味 例 例の意味 記号 意味 例 例の意味NO
文1
条件式1を判断
YES
文3
対応するif文の条件式に当てはまらないときelse 以降の中括弧を実行。 一つのif文に対してelse文は一つ。なくてもよい文2
if 文
if(条件式1) 条件式は括弧( )でくくる 条件式が真のときだけ条件式以降の中括弧{ }でくく られた文を実行 else {文2;} 文3; {文1;}if 文の入れ子
if(条件式1) {文1;} else 中括弧は必ず1対1に対応させないといけないNO
文1
条件式1を判断
YES
文4
条件式2を判断
文2
文3
NO
YES
文4; else if(条件式2) {文2;} … else {文3;} else の処理文が条件文のみのとき else if 文を使うとスマートに書ける else ifは複数記述できる。while 文
While文は繰り返しの回数がわからないとき便利な構造である while(条件式){ 文1; } 条件式が満たされている間,文1を繰り返す No 文1 条件式の判定 Yes 文2if文
ある条件を満たすとき1回だけ文1を実行While 文
繰り返す ある条件を満たす間文1を繰り返す 文1で条件を変更させることが必要 文1 条件式の判定 No Yes 文2 if(条件式){文1;} 文2; while(条件式){文1;} 文2;文1 条件の判定 No Yes
for 文
カウンタ変数のみを条件式とする カウンタの初期化 カウンタの更新for 文
決められた回数だけ同じ処理を繰り返す カウンタの初期化 繰り返し回数を数えるため の変数(カウンタ)を初期化 for(カウンタの初期化 ; 継続条件式 ; カウンタの更新方法){ 文1; } 継続の条件 繰り返しを継続するかを判定 するための カウンタ変数に対する条件式 カウンタの更新方法 カウンタ変数の値を更新す るための数式for 文の例
for(i=0; i<5; i++){
printf(“i=%d ”,i); }
i = 0, 1, 2, 3, 4 と繰り返す
for(i=5; i>=1; i--){printf(“i=%d ”,i);} i = 5, 4, 3, 2, 1 と繰り返す
for(i=0;i<10;i=i+2){printf(“i=%d ”,i);} i = 0, 2, 4, 6, 8 と繰り返す
i=0 i=1 i=2 i=3 i=4
for(i=0; i<2; i++){ }
二重ループ.内側のループが先に繰り返される
for(j=0; j<2; j++){printf(“[i=%d j=%d] ”,i,j);}
[i=0 j=0] [i=0 j=1] [i=1 j=0] [i=1 j=1] i=5 i=4 i=3 i=2 i=1
課題 1
1. for 文と printf 文を使って10個の異なる数値を表示するプログラムを作成する
2. cc コマンドによりコンパイルを行う。
3. 実行結果をscriptコマンドでファイルに出力する。
提出物 : Cソースファイル、及び、コンパイル後に実行した実行結果(scriptコマンド の出力ファイル)をメールに添付して送る 課題締め切り : 次回講義開始日の12:00まで #include <stdio.h> int main() { int i; for(i= ){ printf( ); } return 0; }kadai1.c
> script result_2_09305024 スクリプトを開始しました、ファイルは result_1_09305024.txt です > cc kadai1.c > ./a.out i=10 > exit exit スクリプトを終了しました、ファイルは result_1_09305024.txt です ./a.out