講習No.10

Similar documents
講習No.9

講習No.12

講習No.8

講習No.12

プログラミング実習I

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

プログラミング実習I

講習No.1

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft PowerPoint - kougi7.ppt

ゲームエンジンの構成要素

PowerPoint Presentation

gengo1-11

kiso2-09.key

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

演習課題No12

PowerPoint プレゼンテーション

プログラミング基礎

Microsoft PowerPoint - program.ppt [互換モード]

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

スライド 1

Microsoft PowerPoint - 計算機言語 第7回.ppt

memo

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

memo

Prog1_6th

PowerPoint プレゼンテーション

gengo1-10

PowerPoint Presentation

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft Word - no11.docx

Cプログラミング1(再) 第2回

cp-7. 配列

Microsoft Word - Cプログラミング演習(1)_2012

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft Word - 3new.doc

第2回講義:まとめ

Taro-ファイル処理(公開版).jtd

Microsoft PowerPoint - 11th.ppt [互換モード]

memo

02: 変数と標準入出力

Prog1_10th

kiso2-03.key

PowerPoint Presentation

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft PowerPoint - 09.pptx

演算増幅器

Microsoft PowerPoint - 13.ppt [互換モード]

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

Microsoft PowerPoint - 11.pptx

Prog1_15th

Microsoft Word - Cプログラミング演習(11)

Microsoft PowerPoint - lec10.ppt

program7app.ppt

情報処理Ⅰ演習

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

PowerPoint Presentation

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

ポインタ変数

Microsoft Word - no103.docx

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint プレゼンテーション

第1回 プログラミング演習3 センサーアプリケーション

Taro-ポインタ変数Ⅰ(公開版).j

Java講座

Microsoft PowerPoint - 4.pptx

gengo1-2

Prog1_6th

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

基礎プログラミング2015

Microsoft PowerPoint ppt

Microsoft Word - Training10_プリプロセッサ.docx

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

PowerPoint プレゼンテーション

Microsoft PowerPoint - 13th.ppt [互換モード]

プログラミング基礎

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Microsoft Word - Cプログラミング演習(3)

PowerPoint プレゼンテーション

プログラミング基礎

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

初歩のC言語ターミナル_2014_May.pages

Microsoft PowerPoint - C4(反復for).ppt

計算機プログラミング

02: 変数と標準入出力

数値計算

Microsoft PowerPoint - 3.ppt [互換モード]

Microsoft PowerPoint - prog03.ppt

Microsoft Word - 03

ポインタ変数

PowerPoint プレゼンテーション

Transcription:

2 次元配列 復習 float d[3][4]; 2 次元配列 d[i][j] 2 つのインデックス i と j でデータが指定される 縦が 3 行横が 4 列の float 型の表 4 列 横のインデックスは 3 まで j = 0 j = 1 j = 2 j = 3 3 行 i = 0 i = 1 i = 2 d[0][0] d[0][1] d[0][2] d[0][3] d[1][0] d[1][1] d[1][2] d[1][3] d[2][0] d[2][1] d[2][2] d[2][3] 縦のインデックスは 2 まで d[3][4] は存在しない

2 次元配列の初期化 (2) 復習 int aa[][] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; int aa[][4] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; 縦の行数は省略可 横の列数は省略不可 使用予定の最大の列数を指定する int aa[][4] = 1, 2, 3, 4, 5, 6, 9, 10, 11 ; i = 0 j = 0 j = 1 j = 2 j = 3 この部分は 0に初期化 される d[0][0] = 1 d[0][1] = 2 d[0][2] = 3 d[0][3] = 4 i = 1 d[1][0] = 5 d[1][1] = 6 d[1][2] d[1][3] i = 2 d[2][0] = 9 d[2][1] = 10 d[2][2] = 11 d[2][3] 注意 int aa[3][4]; のように初期化しな 初期化は宣言と同時に! い配列の値は未定義 int aa[3][4]; aa[][4] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ;

2 次元配列を用いたソースプログラムの例 (3) 改良型 : 縦の合計を出力 #include <stdio.h> main() int aa[][4] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; int i, j, sum = 0; for (i = 0; i < 3; i++) // 配列内容を出力 for (j = 0; j < 4; j++) d[0][0] = 1 printf("%2d ", aa[i][j]); d[1][0] = 5 printf(" n"); printf("============== n"); for (j = 0; j < 4; j++) sum = 0; for (i = 0; i < 3; i++) sum = sum + aa[i][j]; printf("%2d ", sum); printf(" n"); // 縦の合計を出力 合計を求める外側ループ 合計を求める内側ループ d[2][0] = 9 d[0][1] = 2 d[1][1] = 6 d[2][1] = 10 d[0][2] = 3 d[1][2] = 7 d[2][2] = 11 1 2 3 4 5 6 7 8 9 10 11 12 ============== 15 18 21 24 続行するには何かキーを... 復習 d[0][3] = 4 d[1][3] = 8 d[2][3] = 12

printf() 関数における書式指定 復習 #include <stdio.h> main() int xx = 5; float yy = 3.14; printf("xxの値は %dである n", xx); printf("xxの値は %3dである n", xx); printf("xxの値は %03dである n", xx); printf("yyの値は %fである n", yy); printf("yyの値は %10fである n", yy); printf("yyの値は %10.3fである n", yy); xx の値は 5 である xx の値は 5 である xx の値は 005 である yy の値は 3.140000 である yy の値は yy の値は 3.140000 である 3.140 である 3 文字右詰 3 文字右詰で左は 0 で埋める 10 文字右詰 ( 少数以下 6 桁 ) 続行するには何かキーを押してください... // 全体で3 文字の範囲に右詰 // 同上に加えて,0を詰める // 全体で10 文字の範囲に右詰 // 同上に加えて, 小数以下 3 桁 10 文字右詰で少数以下 3 桁 少数以下 3 文字 3.140 全体で 10 文字

文字列の配列 char ss[4][7] = "kandai", "denki", "densi", "joho" ; ss[0] "kandai" ss[2] "densi" ss[4] は無い i = 0 i = 1 i = 2 i = 3 j = 0 j = 1 j = 2 j = 3 j = 4 j = 5 j = 6 'k' 'a' 'n' 'd' 'a' 'i' 0 'd' 'e' 'n' 'k' 'i' 0 'd' 'e' n' 's' i' 0 'j' 'o' 'h' 'o' 0 行数は省略可 ss[2][2] = 'n' #include <stdio.h> main() char ss[][7] = "kandai", "denki", "densi", "joho" ; printf(" 例えばss[0][4] は %c,ss[2][2] は %cという文字である. n", ss[0][4], ss[2][2]); printf(" 横方向に見れば,ss[0] は %s, ss[2] は %sという文字列である. n", ss[0], ss[2]); 列数は省略不可. 最大文字数プラス 1 にする. 例えばss[0][4] はa,ss[2][2] はnという文字である. 2つ目の [ ] を付けない. 横方向に見れば,ss[0] はkandai, ss[2] はdensiという文字列である. 続行するには何かキーを押してください... ss[0][4] = 'a' 値が 0 最後は 0 4 行

文字列の配列を用いたプログラムの例 char ss[4][31]; int i; for (i = 0; i < 4; i++) printf("%d 人目の名前を入れてください (30 文字まで ):", i + 1); scanf("%s", ss[i]); & と2つ目の [ ] を付けない. printf(" 入力された名前は次のとおりである n"); for (i = 0; i < 4; i++) printf("%d 番 %-11s n", i + 1, ss[i]); %-11s で, 11 文字で左詰め表示 となる ( マイナス記号は左詰め指定 ) 1 人目の名前を入れてください (30 文字まで ):Matsushima 2 人目の名前を入れてください (30 文字まで ):Abe 3 人目の名前を入れてください (30 文字まで ):Putin 4 人目の名前を入れてください (30 文字まで ):Trump 入力された名前は次のとおりである 1 番 Matsushima 2 番 Abe 3 番 Putin 4 番 Trump 続行するには何かキーを押してください... 横方向の列数は最大文字数プラス 1 にする 2 つ目の [ ] を付けない. char 型 2 次元配列 普通, 0 人目 とは言わないので, ここではプラス 1 しておいた! 特殊ルール! & が不要なのは文字列を %s で入力する場合だけ! 文字列の配列のポイント ss[i][j] のようにインデックスを二つ指定した場合は文字コードを表すchar 型変数 ss[i] のようにインデックスを一つだけ指定した 場合は文字列を表す char 型変数の 1 次元配列

関数の作成 : なぜ自分で関数を作るのか? 大規模なプログラムの例 #include <stdio.h> char err[] = "BMPOut"; int i, j; outpath = fname; if ((outfile = fopen(outpath, "wb")) == NULL) LW_ERROR(FILEOPEN, outpath); int Wx = w.right - w.left; int Wy = w.top - w.bottom; int Ox; if (Wx % 4 == 0) Ox = Wx; else Ox = (Wx/4 + 1)*4; // バッファー領域の確保 int imagesize = Ox * Wy; unsigned char* bmpimage = (unsigned char*) Malloc(sizeof(char)*Ox, err); BITMAPFILEHEADER bfh; bfh.bftype = ('M'<< 8) 'B'; bfh.bfoffbits = sizeof(bitmapfileheader) + sizeof(bitmapinfoheader) + sizeof(rgbquad)*256; bfh.bfsize = bfh.bfoffbits + imagesize; bfh.bfreserved1 = bfh.bfreserved2 = 0; ewrite(&bfh, sizeof(bfh), 1); BITMAPINFOHEADER bmih; bmih.bisize = sizeof(bmih); bmih.biwidth = Wx; bmih.biheight = Wy; bmih.biplanes = 1; bmih.bibitcount = 8; bmih.bicompression = BI_RGB; 長いプログラム例えば, ソース 500 行変数 100 個 プログラムの見通しが悪い 後から見て理解できない 一つの修正が別の箇所に影響 デバッグ困難 複数人で共同作業できない 大量の変数を用いる 変数名が重複する ある変数に関係する修正が他の変数に影響

プログラムモジュール1 モジュール2 モジュール3 int a; モジュール 4 int a; プログラムのモジュール化 プログラムを小さな機能単位であるモジュールに分割 モジュール内では見通しが良い 複数のプログラマーが異なったモジュールを担当できる ( 共同作業 ) モジュールを部品として再利用できる このようなモジュールをサブルーチンと呼ぶ 注意ここでは 機能単位の意味で モジュール という用語を用いているが より専門的なソフトウェア工学では用語 モジュール にはもっと厳密な定義がある 各モジュールごとに変数名が独立 プログラム内で変数名が重複しない 同じ変数名 a でもモジュールごとに異なった変数と見なされる. ローカル変数

プログラムのモジュール例 データ入力モジュール scanf() を用いて配列に 100 個までのデータを入力する 平均値計算モジュール配列の値の平均値を求める 最大値計算モジュール配列の値の最大値を求める 確率誤差計算モジュール配列の値とその平均値から確率誤差を求める 画面表示モジュール配列の値を綺麗に画面表示する プログラムB モジュール1 モジュール2 モジュール3 モジュール4 結果の表示 プログラムA モジュール1 モジュール2 モジュール3 結果の表示

C 言語においてモジュールとして働くもの C 言語のおける機能単位 ( モジュール ) = 関数 #include <stdio.h> #include <math.h> double x, y; scanf( %lf, &x); y = sqrt(x); printf( %e, y); 入力をする関数 平方根を求める関数 出力をする関数 プログラムは関数の組み合わせでできている! 自分で作ったプログラムをモジュール化するにはどうするか? 関数を自分で作る!

関数とは何か? 底辺 a で高さ b の三角形の面積を求める関数 数学の場合 f ( a, b) 関数値を代入引数の代入 ab 2 三角形の面積を表す関数 もしも底辺 3 [cm] で, 高さ 4 [cm] なら s f (3,4) s は 6 [cm 2 ] になる プログラミングでは 変数には型がある 変数が文字や配列の場合もある 関数値の代入でも型が重要 関数値が文字や配列の場合もある

#include C における関数の宣言と呼び出し (1) 関数値の型 <stdio.h> 関数の定義 ( 実行ではない ) ローカル変数 ( 関数内でのみ有効 ) float menseki(float a, float b) float s; 2 s = a * b / 2; return s ; 1 3 関数値の代入 引数の代入 関数の名前 float kekka; printf(" 面積を求めます. n"); kekka = menseki(3, 4); printf(" 面積は %f です. n", kekka); 引数の型と名前! 注意! プログラムは必ず main() 関数の先頭から実行される 関数の呼び出し ( 関数の実行 )

float menseki(float a, float b) float s; s = a * b / 2; return s; int func(int x, int y) if (x*y % 2 == 0) return 1; return 文を実行しない場合があるのでダメ. 関数定義における return 文 int func(int x, int y) if (x*y % 2 == 0) return 1; else return 0; float menseki(float a, float b) return a * b / 2; return 文の文法 return 式 ; return 文を実行すると関数を終了する. 式で計算した値を返す. return 文は複数あっても OK. 但し, どのような場合でも必ずその一つを実行すること. return 文で返る値を返却値, 返り値あるいは戻り値と呼ぶ

C における関数の宣言と呼び出し (2) #include <stdio.h> float menseki(float a, float b) return a * b / 2; float x, y, kekka; printf(" 底辺は?"); scanf("%f", &x); printf(" 高さは?"); scanf("%f", &y); kekka = menseki(x, y); printf(" 面積は %f です. n", kekka); a, b: 仮引数仮引数もローカル変数 関数内でのみ有効 x,y: 実引数 printf(" 面積は %f です. n", menseki(x, y)); でも OK

menseki() 関数内のローカル変数 a と b #include ローカル変数 (1) <stdio.h> float menseki(float a, float b) float s; s = a * b / 2; return s; main() 関数内のローカル変数 a と b float a, b, kekka; menseki() 関数 ローカル変数同じ変数名 a, b でも, 関数が違うと, 別の変数と見なされる 赤色 a,b と青色 a,b は別の変数 main() 関数 printf(" 底辺は?"); scanf(" %f ", &a); printf(" 高さは?"); scanf(" %f ", &b); kekka = menseki(); printf(" 面積は %f です. n", kekka);

ローカル変数 (2) #include <stdio.h> float menseki(float a, float b) kekka = a * b / 2; 関数 menseki() 内では kekka という変数は定義されていない エラー! 変数 kekka は main() 関数中でのみ使える float a, b, kekka; printf(" 底辺は?"); scanf(" %f ", &a); printf(" 高さは?"); scanf(" %f ", &b); menseki(a,b); printf(" 面積は %fです. n", kekka); 変数は, それを宣言した関数内でのみ有効

プログラムのモジュール化 ( 関数化 ) のススメ ダメプログラマ A さん #include <stdio.h> float a, b, x[100]; int i, j, n; 優秀プログラマ B さん #include <stdio.h> int Input(float x[]) // データ入力 for (i = 0; i < n; i++) scanf(" %f ", &a); // データ処理 for (i = 0; i < n; i++) 全ての処理が main() 関数にダラダラ書かれて // 結果出力 いる printf(" 面積は %fです. n", kekka); int Calculation(float x[], int n) int Output(float x[], int n) Input() Calculation() Output() // データ入力 // データ処理 // 結果出力 機能ごとにくっきりと関数 ( モジュール ) 分け main() 関数は短くすっきり