cp-7. 配列

Similar documents
Microsoft PowerPoint - kougi6.ppt

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

Microsoft PowerPoint - lec4.ppt

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - lec10.ppt

Microsoft Word - 3new.doc

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

kiso2-09.key

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

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

memo

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

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

gengo1-8

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

Microsoft PowerPoint - å®�æ−•è©¦é¨fi3ㆮ対ç�Œ.pptx

gengo1-11

Microsoft PowerPoint - kougi4.ppt

Microsoft PowerPoint - while.ppt

Microsoft PowerPoint - 11.pptx

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

memo

Microsoft PowerPoint - kougi2.ppt

プログラミング実習I

Microsoft PowerPoint - C4(反復for).ppt

ポインタ変数

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

Microsoft PowerPoint - prog08.ppt

プログラミング基礎

JavaプログラミングⅠ

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

memo

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

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

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

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

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

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

memo

演算増幅器

Taro-最大値探索法の開発(公開版

Microsoft PowerPoint - prog04.ppt

PowerPoint Presentation

PowerPoint プレゼンテーション

PowerPoint Presentation

ポインタ変数

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

情報処理概論(第二日目)

Microsoft PowerPoint - prog06.ppt

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

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

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

Microsoft PowerPoint - 09.pptx

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

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

Microsoft PowerPoint - kougi8.ppt

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

プログラミングA

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

スライド 1

PowerPoint Presentation

PowerPoint プレゼンテーション

情報処理演習 B8クラス

物質工学科 田中晋

Microsoft PowerPoint - 4.pptx

gengo1-10

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

プログラミングA

pp2018-pp9base

02: 変数と標準入出力

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

プログラミング基礎

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

Microsoft Word - no103.docx

プログラミング基礎

PowerPoint Presentation

Microsoft PowerPoint - guidance.ppt

Microsoft Word - no11.docx

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog03.ppt

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

gengo1-2

今後の予定 6/29 パターン形成第 11 回 7/6 データ解析第 12 回 7/13 群れ行動 ( 久保先生 ) 第 13 回 7/17 ( 金 ) 休講 7/20 まとめ第 14 回 7/27 休講?

講習No.10

Microsoft PowerPoint - class04.ppt

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

プログラミング基礎

3. 標準入出力

講習No.9

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft Word - no204.docx

演算増幅器

JavaプログラミングⅠ

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

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

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

ポインタ変数

Transcription:

cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1

本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2

今日の到達目標 配列とは何かを理解し,int, double を使った配列 の宣言と使用ができるようになる 配列と繰り返し文を組み合わせて, 多量のデータ を扱えるようになる 3

配列 添字 0 1 2 3 データの並びで,0 から始まる番号 ( 添字 ) が付いている 4

例題 1. 月の日数 年と月を読み込んで, 日数を求めるプログラムを作る うるう年の 2 月ならば 29 日数を求めるために, サイズ 12 の配列を使う 例 ) 2001 年 11 月 30 5

月の日数 #include <stdio.h> #pragma warning(disable:4996) int main() { } int num_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int y; int m; printf( "y=" ); scanf( "%d", &y ); printf( "m=" ); scanf( "%d", &m ); if ( (m == 2) && (((y % 400) == 0) (((y % 100)!= 0) && ((y % 4) == 0)))){ printf( "number of days(%d) = 29 n", m ); } else { printf( "number of days(%d) = %d n", m, num_days[m-1] ); } return 0; 配列の宣言 配列からの読み出し m-1 に意味がある 6

月の日数 実行結果の例 y=2001 m=11 number of days(11) = 30 7

プログラムとデータ メモリ num_days[m-1]; 配列からの値の 読み出し num_days[0] num_days[1] num_days[2] num_days[3] num_days[4] num_days[5] num_days[6] num_days[7] num_days[8] num_days[9] num_days[10] num_days[11] 31 28 31 30 31 30 31 31 30 31 30 31 8

配列の宣言 配列には, 名前と型 ( データの種類のこと ) とサイズがある 整数データ 浮動小数データ int double 配列を使うには, 配列の使用をコンピュータに伝えること ( 宣言 ) が必要 int num_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 整数データ 名前は num_days 配列のサイズは 12 9

配列の添字 添字 0 1 2 3 4 5 6 7 8 9 10 11 配列の中身を読み書きするときには, 配列の名前と添字を書く 例 ) num_days[m-1] これが添字 添字は0から ( サイズー 1) まで 例 ) サイズ 12 の配列の添字は,0 から 11 まで 10

配列の読み書き 添字を付けて, 普通の変数と同じように使う 例 ) v[0]=1.3; a=v[1]; printf("%f", v[2]); scanf("%lf", &v[3]); 11

例題 2. ベクトルの内積 ベクトル (1.9, 2.8, 3.7) と, ベクトル (4.6, 5.5, 6.4) の内積を表示するプログラムを作る 2つのベクトルの内積の計算のために, サイズ3の配列を2つ使う 12

例題 2. ベクトルの内積 #include <stdio.h> int main() { double u[]={1.9, 2.8, 3.7}; double v[]={4.6, 5.5, 6.4}; int i; double ip; ip = 0; for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; } printf(" 内積 =%f n", ip); return 0; } 配列からの 読み出し 配列の宣言 13

ベクトルの内積 実行結果の例 内積 =47.820000 14

プログラムとデータ メモリ u[0] u[1] u[2] v[0] v[1] v[2] 1.9 2.8 3.7 4.6 5.5 6.4 ip = ip + u[i]*v[i]; 配列からの値の 読み出し 15

配列の宣言 double u[]={1.9, 2.8, 3.7}; double v[]={4.6, 5.5, 6.4}; 浮動小数データ 名前は u と v 配列のサイズは 3 16

プログラム実行順 ip = 0.0; i = 0; No i < 3 printf(" 内積 =%f n",ip); Yes ip = ip + u[i]*v[i]; i++; 17

ベクトルの内積 繰り返し 1 回目 繰り返し 2 回目 繰り返し 3 回目 繰り返し 4 回目 i の値 i = 0 i < 3 が成り立つ ip = ip + u[0] * v[0]; i = 1 i < 3 が成り立つ ip = ip + u[1] * v[1]; i = 2 i < 3 が成り立つ ip = ip + u[2] * v[2]; i = 3 繰り返し条件式が成り立つか i < 3 が成り立たない ip の値 つまり ip の値は u[0]*v[0] つまり ip の値は u[0]*v[0] + u[1]*v[1] つまり ip の値は u[0]*v[0] + u[1]*v[1] +u[2]*v[2] 18

例題 3. 合計点と平均点 点数を読み込んで, 合計点と平均点を表示するプログラムを作る. 平均点の計算では, 小数点以下切捨て プログラムは, 点数を読み込み続けるが, 読み込んだ点数が -1 のときには, 合計点と平均点を表示して終了する 読み込んだ点数は, いったんサイズ 100 の配列に格納する ( 点数の数は 100 を超えないものと仮定する ) 例 ) 50, 85, 30, 20 合計点 185 平均点 46 19

#include <stdio.h> #pragma warning(disable:4996) int main() { } int x[100]; int sum; int i; int n; n = 0; do { printf( "x[%d]=", n ); scanf( "%d", &x[n] ); n++; 配列の宣言 } while ( ( x[n-1] >= 0 ) && ( n < 100 ) ); sum = 0; for (i=0; i<(n-1); i++) { sum = sum + x[i]; } printf(" 合計 =%d, 平均 =%d n", sum, sum/(n-1) ); return 0; 20

合計点と平均点 実行結果の例 x[0]=50 x[1]=85 x[2]=30 x[3]=20 x[4]=-1 合計 =185, 平均 =46 21

プログラムとデータ x[0] メモリ 1 scanf("%d",&x[n]); 2 sum = sum + x[i]; 合計値の計算 x[1] x[2] x[3] x[4] 整数データを 読み込み 22

プログラム実行順 n = 0; printf( "x[%d]=", n ); scanf( "%d", &x[n] ); n++; ( x[n-1] >= 0 ) && ( n < 100 ) Yes No sum = 0; i = 0; i < n - 1 No Yes sum = sum + x[i]; i++; 23

合計点と平均点 (5 回目で -1 を読み込んだとき ) 繰り返し 1 回目 n の値 繰り返し条件式が成り立つか 読み込まれる配列の要素 n = 1 (x[0] > 0 && n < 100) が成り立つ x[0] 繰り返し 2 回目 繰り返し 3 回目 繰り返し 4 回目 繰り返し 5 回目 n = 2 (x[1] > 0 && n < 100) が成り立つ x[1] n = 3 (x[2] > 0 && n < 100) が成り立つ x[2] n = 4 (x[3] > 0 && n < 100) が成り立つ x[3] n = 5 (x[4] > 0 && n < 100) が成り立たない x[4] -1 を読み込んだらこの部分が成り立たない 24

配列の宣言 1. 配列の宣言時にサイズを指定例 ) int x[100]; サイズとして 100 を書いている 2. 配列の宣言時に初期値を設定例 ) double u[]={1.9, 2.8, 3.7}; double v[]={4.6, 5.5, 6.4}; int a[]={6,4,7,1,5,3,2}; 初期値を並べて 書いている 25

例題 4. 棒グラフを描く 整数の配列から, その棒グラフを表示するプ ログラムを作る. ループの入れ子で, 棒グラフの表示を行う 26

棒グラフを描く #include <stdio.h> int main() { int a[]={6,4,7,1,5,3,2}; int i; int j; for (i=0; i<7; i++) { for (j=0; j<a[i]; j++) { printf("*"); } printf(" n"); } return 0; } 配列の宣言 配列からの 読み出し 27

棒グラフを書く 実行結果の例 ****** **** ******* * ***** *** ** 28

プログラムとデータ メモリ a[0] a[1] a[2] a[3] a[4] a[5] a[6] 6 4 7 1 5 3 2 for (j=0; j<a[i]; j++) { 配列からの値の 読み出し 29

配列の宣言 int a[]={6,4,7,1,5,3,2}; 整数名前はデータ a 配列のサイズは 7 30

プログラム実行順 i = 0; i < 7 No return 0; Yes j = 0; j < a[i] No printf(" n"); i++; Yes printf("*"); j++; 31

ここまでのまとめ 配列の宣言 [] の意味 [] の中に, 配列のサイズを書く. 但し, 配列の初期値を設定するときには 空 にする. 配列の使用 [] の中に, 使用したい配列の添字を書く 32

課題 1 n 次の多項式 2 n f(x) = a0 + a1 x + a2 x + +an x について, 次数 n と, 係数 a0 から an を読み込んで,f(x) を計算するプログラムを作りなさい n は高々 20 までとする.( ユーザが 20 以上の数を n として与えたら, メッセージを表示して止まること ). 次ページで説明する Horner 法を使うこと 読み込んだ点数は, いったんサイズ 21 の配列に格納する x を繰り返し入力できるようなプログラムであること ( つまり f(x) を何度も計算する ) 33

Horner 法 f(x) = a0 + a1 x + a2 x 2+ +an n x = a0 + ( a1 + ( a2 + + ( an-1 + an x ) x ) x ) x 例えば, 5 + 6x + 3x = 5 + ( 6 + 3x ) x2 計算手順 1 an 2 an-1 + an x 3 an-2 + ( an-1 + an x ) x (an まで続ける ) 34

課題 1 のヒント sum = a[n]; i = n - 1; Yes i >= 0 No ここを考える i --; 35

課題 2. エラトステネスのふるい エラトステネスのふるい の原理に基づいて100 以下の素数を求め, 結果を表示するプログラムを作成せよ. 100 以下の素数を求めるために, サイズ10 0の配列を使う 添字が素数の要素に1, そうでない要素に0を代入する 36

エラトステネスのふるい (1/4) 2 3 4 5 6 7 8 9 10 11 2 2 2 3 2 4 2 5 まず,2 の倍数を消す 37

エラトステネスのふるい (2/4) 2 3 4 5 6 7 8 9 10 11 3 2 3 3 次に,3 の倍数を消す 38

エラトステネスのふるい (3/4) 2 3 4 5 6 7 8 9 10 11 5 2 次に,5 の倍数を消す ( 4 の倍数 は考えない. それは, 4 がすでに消えているから ) 39

エラトステネスのふるい (4/4) 2 3 4 5 6 7 8 9 10 11 以上のように,2,3,5,7 の倍数を消す. 10( これは 100 の平方根 ) を超えたら, この操作を止める (100 以下で,11,13 の倍数はすでに消えている ) 40

例題 5. 行列の和 2 行 3 列の行列の和を計算して表示するプログラムを作る. 2 つの行列を扱うために,2 行 3 列の 2 次元配列を 2 つ使う a b 2 行 3 列の2 次元配列浮動小数 2 行 3 列の2 次元配列浮動小数 41

2 次元配列とは ary[0][0] ary[0][1]... ary[1][0] ary[2][0] 42

行列の和 #include <stdio.h> int main() { int a[2][3]={{1,2,3},{4,5,6}}; int b[2][3]={{9,8,7},{6,5,4}}; int i; int j; for (i=0; i<2; i++) { for (j=0; j<3; j++) { printf("%d, ", a[i][j]+b[i][j]); } printf(" n"); } return 0; } 配列の宣言 配列からの 読み出し 43

行列の和 実行結果の例 10, 10, 10, 10, 10, 10, 44

2 次元配列の宣言 2 次元配列の宣言では, 名前, 型, サイズを指定することが必要 int a[2][3]={{1,2,3},{4,5,6}}; 整数データ 名前は a 配列のサイズは 2 3 2 次元以上の配列の宣言では, サイズを書く ( 省略できない ) ことになっている 45

課題 3 3 3 行列の積を計算して表示するプログラムを作成しなさい 2つの行列を扱うために,3 行 3 列の2 次元配列を2 つ使う 46

多次元配列についての補足 多次元配列は, 普通, 最大 7 次元まで ( 処理系により異なる ). 例 ) 整数型の 3 次元配列 int a[2][3][4]; 47

変数の初期化 変数を宣言すると同時に, 値の設定もできます. int i; i = 0; 同じ意味 int i = 0; 48