プログラミング実習(C言語)

プログラミング実習(C言語)
ハードウェアとソフトウェアとの関係
の理解のためのプログラミング体験
講師:坂口利裕
横浜市立大学・国際総合科学研究院
第2日の目標

第1日の復習


プログラミング作業全体の流れの確認
練習 sample3.c の拡張問題の解答例



繰り返しの表現
アルゴリズムによる表現



計算問題の作成
反復処理と配列表現


条件判断の使い方
アルゴリズム表現の重要性の認識
既存アルゴリズムによる例題
実用プログラム作りへのステップ



データファイルの扱い方
文字列データの扱い方
プログラムの分業化
2008.08.07~08
(おおむねp.59まで-最低目標)
プログラミング実習(C言語)
2
テキストp.39
プログラムの設計から実行までの流れ
(設計段階)
コーディング
設計書
・計算の手順
プログラミング言語に
よる表現
・必要な答と
必要なデータ
(ソースプログラム)
2008.08.07~08
プログラミング実習(C言語)
3
テキストp.39
プログラムの設計から実行までの流れ
(ソース・プログラムの作成)
プログラム入力・編集
プログラミング言語に
よる表現
編集用ソフトウェア
(エディタ)
(ソースプログラム)
データ・ファイルとして保管
2008.08.07~08
(電子化された)
ソースプログラム
プログラミング実習(C言語)
4
テキストp.39
プログラムの設計から実行までの流れ
(ソース・プログラムの翻訳)
コンパイルとリンク
翻訳用ソフトウェア
(コンパイラ)
(電子化された)
ソースプログラム
データ・ファイルとして保管
2008.08.07~08
実行可能
プログラム
プログラミング実習(C言語)
5
テキストp.39
プログラムの設計から実行までの流れ
(実行可能プログラムの実行)
プログラムの実行
実行可能
プログラム
CPU
(マイクロプロセッサ)
2008.08.07~08
オペレーティング
システム
メインメモリ
プログラミング実習(C言語)
周辺装置
6
テキストp.35~37
実習(2)-その4

プログラム sample3.c の実行と内容の観察



(再掲)
条件式の使い方・組合わせ方の確認
フローチャートの見方
改変



角度も考慮した種別判定へ
表4.1(p.36)をうまく埋める
フローチャートを考えましょう

1度の判断で2つに区分できるのだから,7種の判定を行うに
はいくつの判断(if構文)が必要か?
2008.08.07~08
プログラミング実習(C言語)
7
補足資料p.11,14~15
実習(3)

既存プロジェクトの呼出し手順



コマンドラインによるプログラミング手順




一度作成したプロジェクトを「開く」
プロジェクトに関連付けられたファイルはそのまま呼び出される
コマンド(文字列入力による操作指示)によるプログラミング
古典的な(GUIのない時代の)環境
単独ファイルで完結している小規模プログラムの開発には十分
いずれかの手順にてsample3.cを完成



フローチャートの解答を確認
プログラムの文として表現
出来上がった人から一休み
2008.08.07~08
プログラミング実習(C言語)
8
(休憩)

休憩後に午前分の出欠をとります
2008.08.07~08
プログラミング実習(C言語)
9
テキストp.40
実習(4)-その1

練習 sample4.c


判断処理を利用したゲーム
実行した後,ifの使い方を確認
2008.08.07~08
プログラミング実習(C言語)
10
テキストp.40~41
実習(4)-その2

1日目の総復習


練習 sample5.c の完成
余力のある方は,改変問題にチャレンジ



結果の判定を追加
BMI指数も追加
標準体重の計算
2008.08.07~08
プログラミング実習(C言語)
11
テキストp.43~45,101~104
反復処理の表現(for構文)

構文の形式


for( 初期化 ; 継続条件 ; 再初期化 )
文 ; またはブロック
条件式の成立している間,文を繰り返して実行
通常は,特定の変数を用いて,反復回数を表現
する

for( n=1 ; n<=10 ; n=n+1 )
printf(“n=%d\n”, n) ;
変数nを,1から始めて1ずつ増加させながら10以下の間(10を
超えるまで) printf文を反復
2008.08.07~08
プログラミング実習(C言語)
12
テキストp.43~47
実習(5)-その1

補足資料p.12~13
ソースプログラムの新規作成手順



既存プログラムは[ソリューションを閉じる]で終了
[ファイル]メニューから[新規作成]でプロジェクトを作
成
[既存項目の追加]の代わりに[新規項目の追加]を選
択



ファイルの種類を[C++ソースファイル]に
保存場所([位置])を確認し,必要に応じて変更
[ファイル名]の指定にも注意(.cは省く)
2008.08.07~08
プログラミング実習(C言語)
13
テキストp.43~47
実習(5)-その2

C言語プログラム全体の構成の確認


補足資料p.12~13
プログラム全体の新規作成の体験
単純な反復処理の確認


構文 for() の基本形の理解と確認
改変問題を行うことで理解を深める
2008.08.07~08
プログラミング実習(C言語)
14
(休憩・昼食)

ここまでくれば占めたモノ!

栄養を十分補給して午後に備えましょう
2008.08.07~08
プログラミング実習(C言語)
15
テキストp.49~50,105
データの構造化-配列型

数列,ベクトル,行列を扱うためのデータ表現

これまでの変数→単純変数と区別
3.1
4.5
変数x
3.1
4.5
3.1
単純変数の場合には,同じ変数には,同時
に二つ以上のデータを記憶できない!
2008.08.07~08
プログラミング実習(C言語)
16
テキストp.49~50,105
配列変数の構造

同じ名前の変数を区分け
→それぞれに別のデータを記憶
float x[5] ; x という名前の5つに区分けされた変数
x[0]
2.5
x[1]
4.2
x[2]
3.5
x[3]
6.9
x[4]
2.5
それぞ
れの区
画は単
純変数
と同じ
配列変数x (全体で)
2008.08.07~08
プログラミング実習(C言語)
17
テキストp.49~50,105
配列変数の表記

定義



型名(それぞれの区画の型) 名前[全体の区画数] ;
例)
float x[5] ;
データの記憶・参照-区画ごとに行なう


名前[区画の番号(添え字:subscript)]
添え字は0からの順序番号
添え字として,式を用いることが可能
例)
x[0] = 3.2 ;
x[1] = x[0]+3 ;
x[n] = x[n-1]+x[n-2] ;
2008.08.07~08
プログラミング実習(C言語)
18
テキストp.50,75~76
反復処理における配列の利用

5つのデータを(それぞれ)読み取って記憶する


複数の単純変数を用いる場合
float a,b,c,d,e ;
scanf(“%g”,&a) ; scanf(“%g”,&b) ;
scanf(“%g”,&c) ; scanf(“%g”,&d) ;
scanf(“%g”,&e) ;
配列変数を用いる場合
float x[5] ; int m ;
for( m=0 ; m<5 ; m=m+1 )
mが変化することを
利用
scanf(“%g”,&x[m]) ;
2008.08.07~08
プログラミング実習(C言語)
19
テキストp.50
実習(6)-その1

配列表現の確認


練習 sample6.c と sample7.c の比較
それぞれ実行してみて,「結果は同じ」ことを
確認
2008.08.07~08
プログラミング実習(C言語)
20
テキストp.50
実習(6)-その2

練習 sample7.c を改良し,配列の特徴を
生かす


規則性をうまくとらえる(取り出す)ことがポイ
ント
データ数を増やすには?
2008.08.07~08
プログラミング実習(C言語)
21
テキストp.50
実習(6)-その3


最低限 sample7 の改良を終えたら休憩
練習 sample8 を実行 (余裕のある方)

「表引き」処理への配列表現の応用

限定された範囲の検索処理の基本
2008.08.07~08
プログラミング実習(C言語)
22
テキストp.51~56
複雑な問題の考え方

(人間にとっては簡単でも)コンピュータにとって
は,理解できる言葉(プログラミング言語)でない
と伝わらない





条件判断 if
反復処理 for (やwhile)
計算処理 変数 = 式(代入)
データの入力 scanf
メッセージやデータの表示 printf
の組み合わせで表現し直すのが非常にやっかい
2008.08.07~08
プログラミング実習(C言語)
23
テキストp.51~56
アルゴリズム

計算手順(算法)





図式による表現


特定のプログラミング言語に依らない
判断基準や処理内容が明確である
(答えがない時も含めて)必ず答を導ける
自然言語や数式による記述が中心
フローチャート
代表的なアルゴリズムとそのプログラム表現を学習


ユークリッドの互除法-最大公約数を求める
単純選択法-データを順序に応じて並べかえる
2008.08.07~08
プログラミング実習(C言語)
24
テキストp.51~56
実習(7)-その1

アルゴリズムを考える実習

ユークリッドの互除法
アルゴリズム表現とフローチャートの比較
 プログラム例の入力と実行

2008.08.07~08
プログラミング実習(C言語)
25
テキストp.51~56
実習(7)-その2

アルゴリズムを考える実習

単純選択法
練習 sample9.c の実行
 並べ替え機能を追加
 フローチャートからプログラムへの読み替え


余力のある方は,
演習問題-金種計算に挑戦!
2008.08.07~08
プログラミング実習(C言語)
26
テキストp.53~56
単純選択法の動き
x[0]
x[1]
x[2]
x[3]
x[4]
3
2
5
6
8
アルゴリズムAによる
探索範囲(i=1~n)
アルゴリズムBによる
探索範囲(j=i+1~n)
i
imin j
より小さい値の場所に更新
2008.08.07~08
本来の最小値の場所iと,実際の最小値の場所
iminとが異なった場合はデータを入れ替え
プログラミング実習(C言語)
27
テキストp.57~62,109~111
実用プログラムの作成に向けて



ファイル入出力
文字情報の扱い
大規模なプログラム→部品化(分業化)→
独立した関数に分解して開発
2008.08.07~08
プログラミング実習(C言語)
28
テキストp.57~59,109~110
ファイル入出力

キーボードからのデータ入力



計算結果の画面表示



手軽にできる(特に大げさな準備は不要)
大量データに対する処理・同一データに対して
別のプログラムで処理→入力ミスの恐れ
情報量が少ない時は手軽に利用できる
直接ワープロなどに利用できない
ファイルを直接利用する手段
2008.08.07~08
プログラミング実習(C言語)
29
テキストp.57~59,109~110
C言語におけるファイルの扱い方




“ファイル”を表す特別な型の変数:FILE型
FILE *f ;
実際のファイルを指定して“開く”
f = fopen(ファイル名,ファイルモード) ;
f = fopen(“ex13.txt”, “r”) ;
ファイル入出力関数 fscanf, fprintfを使う
fscanf(f, …) ;
fprintf(f, …) ;
“閉じる”
fclose(f) ;
2008.08.07~08
プログラミング実習(C言語)
30
テキストp.106~107
文字情報の扱い

C言語における文字型




char (<character)の配列
(最大)10文字分の文字情報→10個の要素を持つ
char型配列変数
ただし,実際には余分に1文字分必要。
使い方




読み取り:scanf(“%s”,name); /*配列名のみ*/
表示:printf(“%s”,name) ;
四則演算:不可能
許される演算:比較・複写(代入)・連結→標準ライブラ
リ関数使用
2008.08.07~08
プログラミング実習(C言語)
31
テキストp.61,82~83
分業化のための表現

関数を自前で定義

一般的書き方
関数の型
関数名
(【引数の型 引数の名前【,…】 】 )
{
関数の処理
return 関数の処理結
果;
}
2008.08.07~08
定義側
float sum( int n, float x[ ] ) {
int k ;
float s ;
s=0 ;
for( k=0 ; k<n ; k+=1 )
s += x[k] ;
return s ;
}
参照側
xmean = sum(n,x)/n ;
プログラミング実習(C言語)
32
(総合実習)

消化不良の例題



自発的に復習してみましょう
質問ももちろんOK
余力のある方

演習問題(p.87~88)にも挑戦
2008.08.07~08
プログラミング実習(C言語)
33