プログラミング入門2 第5回 配列 変数宣言、初期化について

Slides:



Advertisements
Similar presentations
1 第5回 配列. 2 今回の目標 マクロ定義の効果を理解する。 1次元配列を理解する。 2次元配列を理解する。 ☆2 × 2の行列の行列式を求めるプログラ ムを作成する.
Advertisements

配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
初年次セミナー 第8回 データの入力.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング基礎I(再) 山元進.
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
問題提起その 1 一文字ずつ文字(数字)を読み込み、それぞれの文字が何回入力されたかを数えて出力するプログラム。
C言語 配列 2016年 吉田研究室.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
構造体.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミング入門2 第2回 複合文、繰り返し 情報工学科 篠埜 功.
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
第10回 プログラミングⅡ 第10回
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
C言語講座 第3回 ポインタ、配列.
情報処理Ⅱ 2007年11月5日(月).
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
精密工学科プログラミング基礎 第10回資料 (12/18実施)
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
プログラミング入門2 第11回 共用体、列挙体 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
プログラミング序論演習.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 3 2 次元配列.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
アルゴリズムとプログラミング (Algorithms and Programming)
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
情報処理Ⅱ 2006年11月8日(金).
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
第4回 配列.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
第5回 配列.
知能情報工学演習I 第10回( C言語第4回) 課題の回答
プログラミング演習I 補講用課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

プログラミング入門2 第5回 配列 変数宣言、初期化について 情報工学科 篠埜 功

今日の内容 配列 配列とは、同じ型のデータを格納する箱(領域)を一列に並べて添え字でアクセスできるようにしたもの。

配列の必要性 M学科に、3人の学生(学籍番号M09001, M09002, M09003)がいたとする。M学科のある科目の成績を入力し、平均点を計算したいとする。 #include <stdio.h> int main (void) { int m09001; int m09002; int m09003; double average; scanf (“%d”, &m09001); scanf (“%d”, &m09002); scanf (“%d”, &m09003); average = (double) (m09001 + m09002 + m09003) / 3; printf (“平均点は%f点です。\n”, average); return 0; }

配列の必要性 学生が100人いた場合、これまでに講義で説明した範囲だと、100個の変数を宣言しなければならない。 一度にまとめて宣言したい。 配列を使うと、 int m [100]; のように宣言することにより、100人分のint型のデータ格納場所が用意される。 m[0], m[1], m[2], … m[99] の100個分のデータ格納場所が用意される。 添え字が0から始まることに注意。

プログラム例1(打ち込んで確認) /* 長さ3の配列に数値を代入して表示 */ #include <stdio.h> int main (void) { int m[3]; m[0] = 10; m[1] = 5; m[2] = 7; printf (“m[0] = %d\n”, m[0]); printf (“m[1] = %d\n”, m[1]); printf (“m[2] = %d\n”, m[2]); return 0; }

int x ; int a [3] ; 配列の宣言 3人分の点数を格納するint型の変数を用意したい場合 int型の変数の宣言 型名 変数名 要素の型名 変数名 [ 要素数 ] int x ; int a [3] ; x a [0] a[0] ~a[2]までの3個のint型のデータの格納場所が用意される。 a [1] int型のデータの格納場所が1つ用意される。 a [2] [ ]内に書く番号(添え字という)は0から始まる。

配列の各要素へのアクセス int x [10]; int x; x[0] = 3; x = 3; 変数の場合の例 配列の場合の例 int x; x = 3; printf (“%d\n”, x + 2); int x [10]; x[0] = 3; printf (“%d\n”, x[0] + 2); 配列の各要素は、x[0]のように、配列名に続けて添え字を[ ]内に入れて表す。添え字は数字でなくても変数などの式でも構わない。ポインタの回にもう一度説明する。 変数の場合と同様に、配列の各要素がint型やdouble型の場合には、そこへ値を代入したり、そこに格納されている値を参照したりできる。

変数宣言の記法について(1) これまで変数宣言は1つずつ書いてきたが、同じ型の変数はまとめて宣言することができる。 (例) int x; int y; int z; double a; double b; は、 int x,y,z; double a, b; のように、コンマで区切って一度に宣言してよい。

変数宣言の記法について(2) 配列の宣言もまとめて書いてよい。 (例) int x; int a[3]; int b[10]; double y; double c[20]; は、 int x, a[3], b[10]; double y, c[20]; のように、同じ型のものをまとめてコンマで区切って一度に宣言してよい。

変数宣言と初期化 変数宣言時に、変数の初期値を書くことができる。 (例) int x; int y; x=3; y=10; は、 int x=3, y=10; のようにまとめて書いてよい。 変数宣言時に初期化をすることによって、その変数の値を代入前に参照するという状況が起こらなくなる。

配列の初期化(1) 変数と同様、配列も宣言時に初期化できる。 宣言時に、右辺に中括弧で囲んで値を並べる。 例えば、 int a[3]; は、 int a [3] = {10, 5, 7}; のようにまとめて書くことができる。

配列の要素数について 配列を宣言する際、要素数は定数でなければならない。 (教科書 p. 89 参照) 例えば、 int n = 5; int a[n]; のように要素数を変数で指定することは(1990年のISO規格では)許されていない。 ただし、1999年のISO規格(C99)では定数でなくてもよくなったので、上記のような宣言は許されている。 定数にしておくのが無難なので講義では1990年のISO規格に従うが、試験ではどちらでもよいこととする。

プログラム例2(打ち込んで確認) /* 長さ10のint型配列の各要素に0を代入 */ #include <stdio.h> int main (void) { int a[10]; int i=0; while (i<10) { a[i] = 0; i=i+1; } i=0; printf ("a[%d] = %d\n", i, a[i]); return 0; a[i]においては、変数式 i が添え字になっている。

プログラム例3(打ち込んで確認) #include <stdio.h> int main (void) { int m[3]; double average; printf (“M09001の成績を入力してください: “); scanf (“%d”, &m[0]); printf (“M09002の成績を入力してください: “); scanf (“%d”, &m[1]); printf (“M09003の成績を入力してください: “); scanf (“%d”, &m[2]); average = (double) (m[0] + m[1] + m[2]) / 3; printf (“平均点は%f点です。\n”, average); return 0; } &m[0]は、&(m[0])の意味。変数と同じように、&を左側につける。詳しくはポインタの回に説明する。

プログラム例4(打ち込んで確認) /* M学科10人分の点数をキーボードから入力し、平均点を出力する */ #include <stdio.h> int main (void) { int m[10], i=0, sum=0; while (i<10) { printf (“M090%02d: “, i+1); scanf (“%d”, &m[i] ); i=i+1; } i=0; sum = sum + m[i]; printf (“平均点は%f点です。\n”, (double) sum / 10); return 0; %02dの場合、表示する数が2桁未満のとき、左側に0を埋めて表示する。 %2dの場合は、0ではなく空白を埋めて表示する。

配列の初期化(2) 配列の初期化において、右辺の要素数が少ないときは、足りない部分は0 (double型の場合は0.0) で初期化される。たとえば、 int a [3] = {10, 5}; のように書くと、a[0]が10, a[1]が5, a[2]が0で初期化される。

プログラム例5(打ち込んで確認) /* 長さ10のint型配列の各要素を0で初期化 */ #include <stdio.h> int main (void) { int a[10] = {0}; int i=0; while (i<10) { printf ("a[%d] = %d\n", i, a[i]); i=i+1; } return 0; a[0]が0で初期化され、a[1]からa[9]も0で初期化される。

配列の初期化(3) 配列の初期化において、右辺に初期化子がある場合、要素数を省略できる。例えば、 int a [ ] = {10, 5, 7}; のように書くと、 int a [3] = {10, 5, 7}; と書いたのと同じ意味になる。

配列のコピー 配列のコピーを行う場合は、各要素をコピーする必要がある。 間違った例 int a[3] = {10, 5, 7}; int b[3]; b=a; b=aの代入式はコンパイル時にエラーになる。 詳しくはポインタの回に説明する。

配列のコピー(打ち込んで確認) #include <stdio.h> int main (void) { int a[5] = {3,4,5,6,7}; int b[5]; int i=0; while (i<5) { b[i] = a[i]; i=i+1; } i=0; printf (“a[%d]=%d, b[%d]=%d\n”, i, a[i], i, b[i]); return 0; b[i] = a[i]の代入式によって各要素ごとに代入を行っている。

多次元配列 配列の要素は配列でもよい。 例えば、int型を要素にもつ長さ3の配列を要素にもつ長さ2の配列は、 int a [2] [3] ; のように宣言する。これは2次元配列である。(3次元以上も同様に宣言できる。2次元以上の配列を多次元配列と呼ぶ。) 各要素は、a[0][1]のように、[ ] を並べて書くことによって表す。これは(a[0])[1]の意味である。a[0]はaの0番目の要素(int型を要素にもつ長さ3の配列)を表し、a[0][1]は、配列a[0]の1番目の要素を表す。

多次元配列のメモリ上での配置 int a [2] [3] ; a[0][0] のように宣言された2次元配列の各要素は以下のようにメモリ上に配置される。 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 配列 a[0] 配列 a[1]

多次元配列の例(打ち込んで確認) /* 2*3の配列の各要素に1を代入し、各要素の値を表示 */ /* 左の続き */ i=0; /* 2*3の配列の各要素に1を代入し、各要素の値を表示 */ #include <stdio.h> int main (void) { int i, j; int a[2][3]; i=0; while ( i < 2 ) { j=0; while ( j < 3 ) { a[i][j] = 1; j = j + 1; } i = i + 1; /* 左の続き */ i=0; while ( i < 2 ) { j=0; while ( j < 3 ) { printf ("a[%d][%d] = %d\n", i, j, a[i][j] ); j = j + 1; } i = i + 1; return 0;

初期化 1次元配列と同様に初期化できる。 (例) int a [2][3] = { {1,2,3}, {4,5,6} }; のように宣言、初期化すると、配列 a[0] が{1,2,3}で初期化され、配列 a[1] が{4,5,6}で初期化される。

プログラム例(打ち込んで確認) /* 初期化した値を表示して確認 */ #include <stdio.h> /* 初期化した値を表示して確認 */ #include <stdio.h> int main (void) { int a[2][3] = { {1,2,3}, {4,5,6} }; int i, j; i=0; while ( i < 2 ) { j=0; while ( j < 3 ) { printf ("a[%d][%d] = %d\n", i, j, a[i][j]); j = j + 1; } i = i + 1; return 0;

今日の課題 長さ10のint型の配列の各要素にキーボードから入力した整数値を格納し、それらの最大値、最小値、平均値を表示するプログラムを書け。平均値はdouble型で計算し、表示せよ。 2*2のint型の2次元配列を使って、2*2の行列の和、差、積を計算して表示するプログラムを書け。行列の値はキーボードから読み込むようにせよ。 チャレンジ課題(1も2も出来た人用): 2*2のint型の行列のn乗を計算し、表示するプログラムを書け。行列の値およびnはキーボードから読み込むようにせよ。