第9回 配列(array)型の変数

Similar documents
cp-7. 配列

gengo1-8

program7app.ppt

memo

Microsoft Word - no12.doc

Microsoft PowerPoint - kougi7.ppt

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

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

Microsoft Word - no103.docx

kiso2-09.key

Microsoft PowerPoint - 11.pptx

JavaプログラミングⅠ

PowerPoint プレゼンテーション

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

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

Microsoft PowerPoint - kougi6.ppt

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

Taro-再帰関数Ⅲ(公開版).jtd

講習No.9

gengo1-11

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

PowerPoint プレゼンテーション - 物理学情報処理演習

Microsoft PowerPoint - lec4.ppt

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

memo

Microsoft PowerPoint - kougi2.ppt

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

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

PowerPoint Presentation

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

Java プログラミング Ⅰ 11 回目多次元配列 2 次元配列 2 次元配列配列要素が直線上に並ぶ一次元配列に対して 平面上に並ぶ配列要素をもつ配列 直観的には 2 次元配列の準備配列変数の宣言は型と識別子を指定して次のように行う 型識別子 [ ][ ]; または 型 [ ][ ] 識別子 ; 配

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Microsoft PowerPoint - 5Chap15.ppt

02: 変数と標準入出力

プログラミング基礎

Microsoft Word - COMP-MATH-2016-FULLTEXT.doc

演算増幅器

02: 変数と標準入出力

Microsoft PowerPoint - lec10.ppt

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

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - no13.docx

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

memo

Microsoft Word - no202.docx

PowerPoint Presentation

PowerPoint プレゼンテーション

gengo1-10

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

02: 変数と標準入出力

プログラミング基礎

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

プログラミング実習I

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint プレゼンテーション

講習No.10

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

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

Prog1_6th

Microsoft Word - no11.docx

Microsoft Word - no15.docx

DVIOUT

数値計算

Prog1_10th

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

Microsoft PowerPoint - C1(演算と変数).ppt

Microsoft Word - 3new.doc

memo

PowerPoint Presentation

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

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

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

PowerPoint プレゼンテーション - 物理学情報処理演習


プログラミング基礎

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

Microsoft PowerPoint - 09.pptx

XMPによる並列化実装2

C言語7

Microsoft PowerPoint - ca ppt [互換モード]

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

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft PowerPoint pptx

第3回 配列とリスト

第2回

Microsoft PowerPoint ppt

メソッドのまとめ

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

情報処理Ⅰ

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Microsoft PowerPoint - kougi4.ppt

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

ポインタ変数

02: 変数と標準入出力

Microsoft PowerPoint - bp02.ppt

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

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Transcription:

第 12 回 配列型の変数 情報処理演習 ( テキスト : 第 4 章, 第 8 章 )

今日の内容 1. 配列の必要性 2. 配列の宣言 3. 配列変数のイメージ 4. 配列変数を使用した例 5. 範囲を超えた添字を使うと? 6. 多次元配列変数 7. 多次元配列変数を使用した例 8. データのソーティング 9. 今日の練習問題

多数のデータ処理 1. 配列の必要性 ( テキスト 31 ページ ) ( 要求 ) 10,000 人分の成績データをもらって, 合計点の大きい順に並べ替えて出力したい. ( 方法 ) ひとまず, 全部のデータを変数に入れておく. ( 問題 ) しかし,int d1,d2,d3,..,d10000; のように,10,000 個も変数を書けるか? ( 解決策 ) 配列を使おう!! int d[10000]; と書くだけで,d[0]~d[9999] の 10,000 個の変数を使うことができる.

2. 配列の宣言 ( テキスト 32 ページ ) 一般の変数を宣言する場所で配列も宣言する. 宣言の一般形 型配列名 [ 配列の要素数 ]; 配列名は変数名と同様, アルファベット 数字 記号からなる. 最初の文字はアルファベットであること. 記号は一部しか使用できない. 型は構成要素の型を表す.

int LastDay[13]; 3. 配列変数のイメージ 13 個の箱が並んでいると考える. 先頭から順番に 0,1,2, 12 と添字が付く. 0 1 2 12 LastDay LastDay[1] = 31; 代入式の文 添字 1 LastDay 31

配列変数へのデータの代入と参照 int main(int argc, const char * argv[]) { int LastDay[13]; int month; LastDay[1]=31; LastDay[2]=28; LastDay[3]=31; LastDay[4]=30; LastDay[5]=31; LastDay[6]=30; LastDay[7]=31; LastDay[8]=31; LastDay[9]=30; LastDay[10]=31; LastDay[11]=30; LastDay[12]=31; printf(" 月の日数を答えます. 何月を知りたい?"); scanf("%d", &month); printf("%d 月は %d 日です n", month, LastDay[month]); 0 1 2 12 LastDay 31 28 31 30 31 30 31 31 30 31 30 31

4. 配列を使用した例 ( テキスト 101 ページ ) ある会社に 2 つの支店 (A 支店と B 支店 ) があるとする. 各支店で 1 月 ~3 月の各月の売上額が下の表のようなデータとしてある場合, この会社の各月の売上額を計算する. Branch_A 0 1 2 1 月のデータ 2 月のデータ 3 月のデータ 100,000 70,000 80,000 Company 0 1 2 Branch_B 0 1 2 150,000 130,000 170,000 50,000 60,000 90,000 Company[0]= Branch_A[0] + Branch_B[0];

プログラム例 int main(int argc, const char * argv[]) { int Branch_A[3], Branch_B[3],Company[3]; int month; Branch_A[0] = 100000; Branch_A[1] = 70000; Branch_A[2] = 80000; Branch_B[0] = 50000; Branch_B[1] = 60000; Branch_B[2] = 90000; for(month = 0; month < 3; month++){ // 各月で計算 Company[month] = Branch_A[month] + Branch_B[month]; printf(" この会社の売上額 "); for(month = 0; month < 3; month++){ // 各月で売上額を表示 printf("%d 月は %d 円 ", month + 1, Company[month]);

配列を使用した例 (2) ( テキスト 103 ページ ) テストの成績データがあったとして各学生の偏差値を計算するプログラムを作成してみよう. 学生番号 1 2 3 4 5 6 7 8 9 10 成績 68 94 77 52 73 85 79 71 86 63 出力例 学生番号 成績 偏差値 1 68?? 2 94?? 3 77?? 上の表は下のような配列変数に格納されたデータと考えることができる. 1 2 3 10 mark 68 94 77 63 10 63??

偏差値の計算 偏差値は下に示す式で求まる. ( 学生 iの得点 平均 ) 10 学生 iの偏差値 50 標準偏差 平均と標準偏差を求める. 個々の得点の総和 d 平均 学生数 標準偏差 ( 個々の得点 平均 ) 学生数 2 1 d 2 の総和 d3 d 10 1 10 10 i 1 10 ( d i 1 10 m) 10 i 1 2 d i 総和を求める計算 繰り返し制御構造を使う 右のプログラム片で計算できる ループ終了後, 変数 wa の値が総和 プログラム片 wa = 0; for(i = 1; i <= 10; i++){ wa = wa + d[i];

#include <math.h> 偏差値計算のプログラム例 int main(int argc, const char * argv[]) { const int N = 10; int mark[] = {0, 68, 94, 77, 52, 73, 85, 79, 71, 86, 63; int wa, i; double m, sigma, wa2, y; wa = 0; for(i = 1; i <= N; i++){ wa = wa + mark[i]; m = wa / N; wa2 = 0; for(i = 1; i <= N; i++){ wa2 = wa2 + pow((mark[i] - m), 2); sigma = sqrt(wa2); printf(" 学生番号成績偏差値 n"); for(i = 1; i <= N; i++){ y = (10 * (mark[i] - m) / sigma + 50); printf("%4d %2d %2.1f n", i, mark[i], y);

5. 範囲を超えた添字を使うと? 配列のサイズは宣言のときに決定する 宣言時にメモリ領域を確保する サイズを超えて使用したら? int x, a[3]; int 型の配列,3 つの箱を作る 0 1 2 x = a[3]; この箱の値? そもそもここに箱はあるの?

配列のオーバフロー C 言語では, コンパイラは配列の添字の範囲のチェックは行わない 配列の添字のチェックはプログラマの責任 int x, a[3]; x = a[3]; a[10] = 100; この代入式では, 何らかの値が変数 x に代入される 確保されていないメモリ領域に値 100 が書き込まれる これらはエラーにならない 添字の範囲チェックを怠ると, おかしな動作をするプログラムになる

6. 多次元配列変数 1 次元配列 : 一列 ( 直線的 ) に並べた変数 0 1 2 N-1 ( テキスト 35 ページ ) 2 次元配列 : 平面的に並べた変数 0 1 0 1 2 N-1 行と列を指定して 1 つの箱を特定する. 添字として 2 つの値を持つ. B[M][N] M-1 B[1][2] 行 列

多次元配列変数の数学との対応 意味を与えた添字付きの変数を使う計算 c ij a ij b ij 例 ( 行列の和の計算 ) C 言語 1 次元配列 a[i] 数列 2 次元配列 b[i][j] 行列 3 次元配列 c[i][j][k]???? 数学 a i b ij c ijk C 言語の配列では, 何次元配列でも作ることができる. 例 ) int b[n][m]; 配列 b は,n m 行列

7. 多次元配列を使用した例 ( テキスト 114 ページ ) ある会社に 2 つの支店 (A 支店と B 支店 ) があるとする. 各支店で 1 月 ~3 月の各月の商品 0, 商品 1 の売上数が下の表のようなデータとしてある場合, この会社の各月の各商品の売上数を計算する. Branch_A 0 1 2 0 1 190 140 80 120 75 155 Branch_B 0 1 2 0 1 80 95 150 70 100 140 Company 0 1 2 0 1 270 235 230 190 175 295 Company[0][0]= Branch_A[0][0] + Branch_B[0][0];

月別, 商品別の売り上げの計算 (main 関数の中 ) int Branch_A[2][3], Branch_B[2][3], Company[2][3]; int good, month; Branch_A[0][0]=190; Branch_A[0][1]=140; Branch_A[0][2]= 80; Branch_A[1][0]=120; Branch_A[1][1]= 75; Branch_A[1][2]=155; Branch_B[0][0]= 80; Branch_B[0][1]= 95; Branch_B[0][2]=150; Branch_B[1][0]= 70; Branch_B[1][1]=100; Branch_B[1][2]=140; for(good = 0; good < 2; good++){ // 各商品で処理 for(month = 0; month < 3; month++){ // 各月で処理 Company[good][month] = Branch_A[good][month] + Branch_B[good][month]; printf(" この会社の売上数 n"); for(good = 0; good < 2; good++){ // 商品ごとに1 行で表示 printf(" 商品 %d n", good); for(month = 0; month < 3; month++){ printf("%2d 月 :%4d 個 n", month + 1, Company[good][month]);

3 行 3 列行列の和の計算 (main 関数の中 ) const int N = 3; int a[n][n], b[n][n], c[n][n]; int i, j; // 行列 A の成分を入力 printf(" 行列 A=? n"); for(i = 0; i < N; i++){ for(j = 0; j < N;j++){ scanf("%d", &a[i][j]); // 行列 B の成分を入力 printf(" 行列 B=? n"); for(i = 0; i < N; i++){ for(j = 0; j < N; j++){ scanf("%d", &b[i][j]); // 和 C=A+B を計算 for(i = 0; i < N; i++){ for(j = 0; j < N; j++){ c[i][j] = a[i][j]+b[i][j]; // 和 C=A+B を出力 printf("a+b= n"); for(i = 0; i < N; i++){ for(j = 0; j < N; j++){ printf("%3d", c[i][j]); printf(" n");

8. データのソーティング ( テキスト 110 ページ ) 並べ替えイメージ ( その 1) 小さい順 0 1 2 3 4 5 並べ替え前 4 89 6 2 23 21 89 23 89 21 23 89 6 21 23 89 1~6の最大 1~5の最大 1~4の最大 1~3の最大 並べ替え後 2 4 6 21 23 89

並べ替えイメージ ( その 2) 隣り合った数を比べ, 前の数が大きければ入れ替える. Step 1 0 1 2 3 4 5 4 > 89? No Step 2 W (1) 89 > 6? Yes!! (2) (3) 入れ換え 6 89 Step 3, 4, 5 89 2 23 21 入れ換え 4 6 Max 2 23 21 89 1~6の最大

プログラム例 (main 関数の中 ) const int N = 6; int d[]={4,89,6,2,23,25, sd[n]; int i,j,w; // 配列 d を配列 sd にコピー for(i = 0; i < N; i++){ sd[i] = d[i]; for(i = 0; i < N; i++){ for(j = 0; j < N - i - 1; j++){ if(sd[j] > sd[j+1]){ w=sd[j]; sd[j] = sd[j+1]; sd[j+1] = w; printf("sorted data= n"); for(i = 0; i < N; i++){ printf("sd[%d]=%d n", i, sd[i]);

Level C C B B+ 9. 今日の練習問題 問題 多次元配列の例題の会社において,3 ヶ月間の全売上数を求めるプログラムを作成せよ. 月と日を入力すると, その年の 1 月 1 日からの経過日数を表示するプログラムを作成せよ ( 閏年は考えない ). 配列内の変化の様子を観察できるようにソートの例題プログラムを変更せよ. n 個のデータをもらって, 各データの値だけ * を横に並べる棒グラフを描くプログラムを作成せよ. ( 参考 : テキスト p.108 例 8.7.2) B+ 3 3 行列の積を求めるプログラムを作成せよ. A 上の棒グラフを縦棒のグラフにせよ. A 棒グラフにおいて, 平均値の * を + に換えて表示せよ.