Taro-C言語の基礎Ⅰ(公開版).j

Similar documents
Taro-Basicの基礎・条件分岐(公

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

PowerPoint Presentation

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

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

Taro-プログラミングの基礎Ⅱ(公

kiso2-03.key

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

プログラミング実習I

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

プログラミング実習I

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

プログラミング基礎

ポインタ変数

< F2D837C E95CF CF68A4A94C5816A2E6A>

JavaプログラミングⅠ

PowerPoint プレゼンテーション

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

物質工学科 田中晋

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

gengo1-12

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

PowerPoint プレゼンテーション

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

gengo1-2

Java講座

Microsoft PowerPoint - 4.pptx

Microsoft PowerPoint - C_Programming(3).pptx

講習No.12

Microsoft Word - no103.docx

数値計算

Microsoft Word - no02.doc

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

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

gengo1-8

cp-7. 配列

Microsoft PowerPoint - class04.ppt

第2回講義:まとめ

Microsoft PowerPoint - prog04.ppt

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

Microsoft Word - 3new.doc

8 / 0 1 i++ i 1 i-- i C !!! C 2

スライド 1

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

Taro-リストⅠ(公開版).jtd

Microsoft PowerPoint - 3.pptx

C 言語固有の命令で全部で32 個 の関数C 言語第 1 回 C 言語って?( シラバス 1 2 回目 ) 関数型言語 コンピュータに実行してもらう命令はすべて関数の中に記述されている 関数がプロ グラム

講習No.1

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

kiso2-06.key

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

プログラミング基礎

プログラミング基礎

fuga scanf("%lf%*c",&fuga); 改行文字を読み捨てる 10 進数の整数 おまじない取り込んだ値を代入する変数 scanf( %d%*c,&hoge); キーボードから取り込め という命令 1: scanf 1 1: int double scanf %d %lf printf

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

Microsoft Word - VBA基礎(3).docx

プログラミングA

Prog1_6th

ポインタ変数

Taro-スタック(公開版).jtd

プログラミングA

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

Microsoft Word - java a.doc

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

gengo1-12

計算機プログラミング

PowerPoint Presentation

Microsoft PowerPoint - lec4.ppt

講習No.9

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

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

JavaプログラミングⅠ

gengo1-12

ガイダンス

kiso2-09.key

Report#2.docx

JavaプログラミングⅠ

memo

PowerPoint プレゼンテーション

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

Prog1_10th

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint ppt

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

Microsoft Word - no11.docx

Microsoft PowerPoint - ruby_instruction.ppt

講習No.8

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

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

Report#2.docx

slide5.pptx

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - 11.pptx

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

Javaによるアルゴリズムとデータ構造

memo

Microsoft PowerPoint - C4(反復for).ppt

Transcription:

C 言語の基礎 Ⅰ 0. 目次 1. はじめに 1. 1 簡単な例 1. 2 C 言語プログラムの翻訳と実行 2. 条件分岐 2. 1 i f 文 2. 2 s w i t c h 文 3. 制御構造 3. 1 w h i l e 文 3. 2 f o r 文 3. 3 d o 文 3. 4 c o n t i n u e 文, b r e a k 文 4. 変数 配列 4. 1 変数 4. 2 1 次元配列 4. 3 2 次元配列 4. 4 局所変数の有効範囲 - 1 -

1. はじめに 1. 1 簡単な例 簡単な例 ( ソースプログラム ) で C 言語を紹介する [ 例 1 ] 出力 プログラム 解説 1 /* << a001.c >> */ 注釈は /* と */ で囲み 2 行以上にわたってもよい 空行はプログラム中どこにでも入れることができ プログラムを見やすくするために使われる stdio.hという名前のファイルをプログラム中に取り込む このファイルには入出力関係の規則などが書かれており プログラム中で使う命令がうまく動作するように設定する stdio.hのように.h をつけたファイルをヘッダファイルという 3 int main() { C のプログラムはいくつかの関数から構成され 実行は mainという名前の関数から始まる 関数を構成する文 ( コンピュータに指示を与える基本単位で 必ずセミコロンで区切る ) は { と } で囲む この部分を関数の本体という 4 printf("sample\n"); 画面に文字列 sampleと出力する 5 } \nは改行を意味する printfも関数のひとつ ソースプログラムの作成 /* << a001.c >> */ #include <stdio.h> int main() { printf("sample\n"); } ソースプログラムのコンパイル % cc a001.c ソースプログラムの実行 %./a.out sample - 2 -

[ 例 2 ] 計算処理 プログラム 解説 1 /* << a002.c >> */ 3 int main() { 4 int a,b; プログラム実行中に値が変わるデータを変数という 変数には名前をつけることができ それを変数名という プログラム中の変数は すべて関数の本体の始めで宣言しておかなければならない そのための文を宣言文という 変数がとる値は決められており 整数型と浮動小数点型がある 整数型には int 型,short 型,long 型がある int 型は -32768~ 32767 または -2147483648~ 2147483647 short 型は -32768~ 32767 long 型は -2147483648~ 2147483647 5 a = 123; 代入文 ( 変数 = 式 ) という 6 b = 2 * a; = は 右辺の計算結果を左辺の変数に代入する 7 printf("%d %d\n",a,b); %dは対応する変数の値を出力するための形式で変換仕様という 変換仕様 %dは対応する整数型の変数と同じ桁数の欄がと 8 } られ その中に値が出力される ソースプログラムの作成 /* << a002.c >> */ #include <stdio.h> int main() { int a,b; a = 123; b = 2 * a; printf("%d %d\n",a,b); } ソースプログラムのコンパイル % cc a002.c ソースプログラムの実行 %./a.out 123 246-3 -

[ 例 3 ] 入力 プログラム 解説 1 /* << a003.c >> */ 3 #define MAX 1000 記号名または記号変数を定義する プログラム中の MAXという文字列をすべて 1000に置き換える 記号名は大文字を使う習慣がある この機能により プログラムが分かりやすくなる また プログラムの変更が容易にできる 4 int main() { 5 int a; 6 scanf("%d",&a); %dは対応する変数の値を入力するための形式で変換仕様という 変換仕様 %dは 入力を整数とみなし 対応する整数型の変数に値を代入する &aと書くことに注意 7 a = MAX * a; 8 printf("a=%8d \n",a); 変換仕様 %8dは 8 桁の欄をとり 9 } 右寄せで変数の値を出力する ソースプログラムの作成 /* << a003.c >> */ #include <stdio.h> #define MAX 1000 int main() { int a; scanf("%d",&a); a = MAX * a; printf("a=%8d \n",a); } ソースプログラムのコンパイル % cc a003.c ソースプログラムの実行 %./a.out 123 a= 123000-4 -

[ 例 4 ] 計算処理 プログラム 解説 1 /* << a004.c >> */ 3 int main() { 4 float x,y; 浮動小数点型には float 型と double 型がある float 型は 有効数字がおよそ 10 進 6 桁ぐらいで 10の -37 乗から 10の 38 乗の範囲の数を扱うことができる double 型は 有効数字の桁数および範囲が float 型よりも大きい 5 scanf("%f",&x); %fは対応する変数の値を入力するための形式で変換仕様という 変換仕様 %fは 入力を 10 進浮動小数点数とみなし 対応する浮動小数点型の変数にその値を代入する 6 y = x * x; 7 printf("x=%f\n",x); 変換仕様 %fは 浮動小数点数を 10 進数に変換し 小数点以下 6 桁で表すのに必要な欄をとり そこに出力する 8 printf("y=%10.3f\n",y); 変換仕様 %10.3fは 浮動小数点数を 10 進数に変換し 10 桁の欄をとり 小数点以 9 } 下 3 桁で出力する ソースプログラムの作成 /* << a004.c >> */ #include <stdio.h> int main() { float x,y; scanf("%f",&x); y = x * x; printf("x=%f\n",x); printf("y=%10.3f\n",y); } ソースプログラムのコンパイル % cc a004.c ソースプログラムの実行 %./a.out 1.2 x=1.200000 y= 1.440-5 -

1. 2 C 言語プログラムの翻訳と実行 cc コマンドでソースプログラムの翻訳とリンクまで行い 実行可能プログラムを作成する 手順は次のようになる ( 1 ) プリプロセス プリプロセッサが起動され # で始まる行が処理される # で始まる行はプリプロセッサへの指示である # で始まる行はソースプログラムのどこに現れてもよい #include や #define などの文が展開される 入力 ソースプログラム ( x.c) 出力 標準出力 ( 通常画面 ) コマンド % cc -E ファイル名 ( 2 ) コンパイル コンパイラを起動する 入力 ソースプログラム ( x.c) 出力 アセンブラプログラム ( x.s) コマンド % cc -S ファイル名 ( 3 ) アセンブル アセンブラを起動する 入力 ソースプログラム ( x.c) 出力 オブジェクトプログラム ( x.o) コマンド % cc -c ファイル名 ( 4 ) リンク ローダを起動する 作成されたオブジェクトプログラムと C 言語ライブラリを連結して実行可能プログラムを作成する 入力 ソースプログラム ( x.c) 出力 実行可能プログラム ( a.out) コマンド % cc ファイル名 - 6 -

d e f i n e 文 define 文で 文字列や式の置換が行える 1 /* << dp111.c >> */ 3 #define MAX 1000 /* 文字列の置換 */ 4 #define INPUT(a,b) scanf("%d%d",&a,&b) /* 式の置換 */ 5 #define OUTPUT(a,b) printf("%d %d\n",a,b) /* 式の置換 */ 6 main() { 7 int a,b; 8 INPUT(a,b); 9 OUTPUT(a+b,MAX); 10 } 実行結果 % cc -E dp111.c < < 途中省略 > > main() { int a,b; scanf("%d%d",&a,&b); printf("%d %d\n",a+b,1000); } % cc dp111.c %./a.out 12 345 357 1000 コンパイラのオプションから #define 名前値 と同等のことができる %cc -D 名前 = 値ファイル名 1 /* << dp112.c >> */ 3 main() { 4 int a=234; 5 printf("%d \n",a+max); 6 } 実行結果 % cc dp112.c dp112.c: In function main : dp112.c:5: error: MAX undeclared (first use in this function) dp112.c:5: error:(each undeclared identifier is reported only once dp112.c:5: error: for each function it appears in.) % cc -DMAX=1000 dp112.c %./a.out 1234-7 -

i n c l u d e 文 include 文でヘッダファイルの取り込みを行う ヘッダファイルには定数や型の宣言などが記述され 複数のソースプログラムから参照される ファイル名には拡張子として.h がつけられる < ファイル名 > の場合 : 標準のディレクトリ (/usr/include) から探す " ファイル名 " の場合 : (1) ソースファイルのあるディレクトリ (2)-I オプションで指定したディレクトリ (3) 標準のディレクトリの順に探され初めて見つかったものが採用される 1 /* << dp121.c >> */ 3 #include "dp121.h" 4 main() { 5 int a; 6 scanf("%d",&a); 7 printf("a = %d MAX = %d \n",a,max); 8 } 実行結果 標準ディレクトリの確認 % cd /usr/include % ls -l stdio.h -rw-r--r-- 1 root root 31568 11 月 21 13:09 2012 stdio.h ホームディレクトリに移動 % cd % ls dp121.c % cc dp121.c dp121.hが見つからないというエラーメッセージがでる dp121.c:3:19: error: dp121.h: そのようなファイルやディレクトリはありません dp121.c: In function main : dp121.c:7: error: MAX undeclared (first use in this function) dp121.c:7: error: (Each undeclared identifier is reported only once dp121.c:7: error: for each function it appears in.) ヘッダファイル (dp121.h) の作成 % cat > dp121.h #define MAX 1000 ^d % cat dp121.h #define MAX 1000 ヘッダファイル (dp121.h) の確認 % ls dp121.c dp121.h % cc dp121.c %./a.out 123 a = 123 MAX = 1000-8 -

2. 条件分岐 2. 1 i f 文 if 文は一般につぎのように書く 書き方 if( 条件 ) 文 意味 条件が真の場合 文が実行される 条件 真 偽 文 書き方 if( 条件 ) 文 1 else 文 2 意味 条件が真ならば文 1が 偽ならば文 2が実行される 偽 条件 真 文 2 文 1 書き方 if( 条件 1) 文 1 else if( 条件 2) 文 2 else 文 3 意味条件 1が真ならば文 1が実行され 条件 1が偽でしかも条件 2が真のとき 文 2が実行される 条件 1も条件 2も偽のとき 文 3が実行される - 9 -

条件 1 真 偽 文 1 条件 2 真 偽 文 2 文 3 [ 例 ] 1+2+ +10 を求める 1 #include <stdio.h> 2 int main() { 3 int i,s; ( 注意 ) 文には loopのような名札を 4 s = 0; i = 1; つけることができる 5 loop: goto 文で 名札 ( loop) の 6 if( i <= 10 ) { ついた文へ飛び越す 7 s = s + i; i = i + 1; 8 goto loop; 9 } 10 printf("s=%d\n",s); 11 } 条件には値の大小を比較する関係式や論理式がよく用いられる たとえば a==b, a*b<=c*d, (1<=a)&&(a<=n) などである == や <= を関係演算子といい つぎの 6 種類ある a < b a <= b a == b a!= b a >= b a > b aが bより小さい aが bより小さいか等しい aが bと等しい aが bと等しくない aが bより大きいか等しい aが bより大きい && を論理演算子といい つぎの 3 種類ある a && b 条件 a,b がともに真のときに限り真になり 他の場合は偽になる a b 条件 a,b がともに偽のときに限り偽になり 他の場合は真になる!a 条件 a が真のとき偽 偽のとき真になる ( 注意 ) 論理演算子は関係演算子よりも先に評価される - 10 -

2. 2 s w i t c h 文 switch 文は一般につぎのように書く 分岐が多くなると便利である 書き方 switch( 式 ) { case 定数 1: 文 1 ; break; case 定数 2: 文 2 ; break; case 定数 n: 文 n ; break; default: 文 n + 1 ; break; } 意味式の値に応じて 定数 i( 1 i n ) のところへ分岐し文 i を実行する break 文を実行すると switch 文は終了する 式の値がどの定数 iとも一致しないとき defaultのところへ分岐し 文 n + 1 を実行する 式 定数 1 定数 2 定数 n default 文 1 文 2 文 n 文 n + 1 [ 例 ] 1,2,3 の数値を読み込み それぞれの英単語を表示する 1,2,3 以外の数値の場合は? を表示する 1 #include <stdio.h> 2 int main() { 3 int a; 4 scanf("%d",&a); 5 switch( a ) { 6 case 1: printf("one \n"); break; 7 case 2: printf("two \n"); break; 8 case 3: printf("three \n"); break; 9 default: printf("? \n"); break; 10 } 11 } - 11 -

3. 制御構造 3. 1 w h i l e 文 while 文は一般につぎのように書く 書き方 while( 条件 ) 文 意味 条件が真の間 文を実行し偽になるまで繰り返す 最初から条件が偽の場合には 文は 1 回も実行されない このような構造を while ループという 条件真 偽 文 [ 例 ] 1+2+ +10 を求める 1 #include <stdio.h> 2 int main() { 3 int i,s; 4 s = 0; i = 1; 5 while( i <= 10 ) { 6 s = s + i; i = i + 1; 7 } 8 printf("s=%d\n",s); 9 } - 12 -

3. 2 f o r 文 for 文は一般につぎのように書く 書き方意味 for( 初期設定 ; 条件 ; 更新 ) 文まず初期設定が行われる そして条件が真ならば文が実行され更新が実行される その後条件が真の間 文と更新が実行され条件が偽になると文を実行せずに for 文のつぎの文を実行する 最初から条件が偽の場合 文は 1 回も実行されない このような構造を for ループという 初期設定 真 条件 文 偽 更新 [ 例 ] 1+2+ +10 を求める 1 #include <stdio.h> 2 int main() { 3 int i,s; 4 s = 0; 5 for( i=1; i<=10; i++ ) { 6 s = s + i; 7 } 8 printf("s=%d\n",s); 9 } ( 注意 ) i++ は 変数 i に 1 を加えることを意味する - 13 -

3. 3 d o 文 do 文は一般につぎのように書く 書き方 do 文 while( 条件 ); 意味まず 文が 1 回実行される 条件が真の間 文を実行し偽になるまで繰り返す 文は少なくとも 1 回実行される このような構造を do-while ループという 文 真 条件偽 [ 例 ] 1+2+ +10 を求める 1 #include <stdio.h> 2 int main() { 3 int i,s; 4 s = 0; i = 1; 5 do { 6 s = s + i; i = i + 1; 7 } 8 while( i<=10 ); 9 printf("s=%d\n",s); 10 } - 14 -

3. 4 c o n t i n u e 文, b r e a k 文 while や for などのループから抜け出すときに break 文や continue 文を使う break 文を実行すると この break 文を含む最も内側のループを終了し つぎの文を実行する 書き方 while( 条件 1 ) { 文 1 ; while( 条件 2 ) { 文 2 ; if( 条件 3 ) { break; } 文 3 ; } 文 4 ; } 意味条件 3 が真になると break 文が実行され文 4 が実行される 条件 1 真 偽 文 1 条件 2 最真も内文 2 側のル条件 3 偽プ文 3 偽 真 文 4-15 -

break 文の例 1 /* << ba341a.c >> */ 3 int main() { 4 int i,j; 5 for( i=1; i<=3; i++ ) { 6 for( j=1; j<=3; j++ ) { 7 printf("(1) i=%d j=%d\n",i,j); 8 if( i+j == 5 ) { printf("break\n"); break; } 9 } 10 printf("(2) i=%d j=%d\n",i,j); 11 } 12 printf("(3) i=%d j=%d\n",i,j); 13 } 実行結果 % cc ba341a.c % a.out (1) i=1 j=1 (1) i=1 j=2 (1) i=1 j=3 (2) i=1 j=4 (1) i=2 j=1 (1) i=2 j=2 (1) i=2 j=3 break (2) i=2 j=3 (1) i=3 j=1 (1) i=3 j=2 break (2) i=3 j=2 (3) i=4 j=2-16 -

goto 文で一気に複数のループを抜けることができる 1 /* << ba341b.c >> */ 3 int main() { 4 int i,j; 5 for( i=1; i<=3; i++ ) { 6 for( j=1; j<=3; j++ ) { 7 printf("(1) i=%d j=%d\n",i,j); 8 if( i+j == 5 ) { printf("goto next\n"); goto next; } 9 } 10 printf("(2) i=%d j=%d\n",i,j); 11 } 12 next: 13 printf("(3) i=%d j=%d\n",i,j); 14 } 実行結果 % cc ba341b.c % a.out (1) i=1 j=1 (1) i=1 j=2 (1) i=1 j=3 (2) i=1 j=4 (1) i=2 j=1 (1) i=2 j=2 (1) i=2 j=3 goto next (3) i=2 j=3-17 -

continue 文が実行されると この continue 文を含む最も内側のループの残りの部分を無視して 条件の部分を調べる 書き方 while( 条件 1 ) { 文 1 ; while( 条件 2 ) { 文 2 ; if( 条件 3 ) { continue; } 文 3 ; } 文 4 ; } 意味条件 3 が真になると continue 文が実行され文 3 は実行されず条件 2 が調べられる 条件 1 真 偽 文 1 条件 2 最真も内文 2 側のル条件 3 偽プ文 3 偽 真 文 4-18 -

continue 文の例 1 /* << ba341c.c >> */ 3 int main() { 4 int i,j; 5 for( i=1; i<=3; i++ ) { 6 for( j=1; j<=3; j++ ) { 7 printf("(1) i=%d j=%d\n",i,j); 8 if( i+j == 5 ) { printf("continue\n"); continue; } 9 } 10 printf("(2) i=%d j=%d\n",i,j); 11 } 12 printf("(3) i=%d j=%d\n",i,j); 13 } 実行結果 % cc ba341c.c % a.out (1) i=1 j=1 (1) i=1 j=2 (1) i=1 j=3 (2) i=1 j=4 (1) i=2 j=1 (1) i=2 j=2 (1) i=2 j=3 continue (2) i=2 j=4 (1) i=3 j=1 (1) i=3 j=2 continue (1) i=3 j=3 (2) i=3 j=4 (3) i=4 j=4-19 -

4. 変数 配列 4. 1 変数 int a で変数 a の宣言をする 変数 a の値を保存する記憶領域の位置 ( 番地 ) が決定される 変数 a に対応づけられる番地を参照するには &a とする 番地 記憶領域 &a a の値 1 #include <stdio.h> 2 int main() { 3 int a; 4 a = 123; 5 printf(" a = %d \n",a); 6 printf("&a = %x \n",&a); /* 16 進数で出力 */ 7 a = -a; 8 printf(" a = %d \n",a); 9 printf("&a = %x \n",&a); 10 } 実行結果 a = 123 &a = effffb84 a = -123 &a = effffb84-20 -

4. 2 1 次元配列 変数を多く使うとき そのつど名前を考えなければならないとしたら困ってしまう そこで 数学で使われる数列と同様の記法を考える 同じ型のデータを順に並べたものを配列という 配列はひとつの名前 ( 配列名 ) をもつ 各データを配列要素といい 配列名の後に添字を [ と ] で囲んで示す 添字は 0 から始まる 配列要素 a[i] の番地は &a[i] で参照する 1 /* << ba421.c >> */ 3 int main() { 4 int i; 5 int a[9]; /* 配列名を aとし 9 個の配列要素 6 a[0],a[1],...,a[8] を宣言する */ 7 a[0] = 1; a[1] = 1; 8 for( i=2; i<=8; i++ ) { 9 a[i] = a[i-1] + a[i-2]; 10 } 11 for( i=0; i<=8; i++ ) { 12 printf("a[%2d] = %3d ",i,a[i]); 13 printf("&a[%2d] = %x \n",i,&a[i]); 14 } 15 } 実行結果 % cc ba421.c %./a.out ( 注意 ) int 型は 4 バイト a[ 0] = 1 &a[ 0] = e2a59eb0 必要とすること a[ 1] = 1 &a[ 1] = e2a59eb4 から番地は 4 ずつ a[ 2] = 2 &a[ 2] = e2a59eb8 増加する a[ 3] = 3 &a[ 3] = e2a59ebc a[ 4] = 5 &a[ 4] = e2a59ec0 a[ 5] = 8 &a[ 5] = e2a59ec4 a[ 6] = 13 &a[ 6] = e2a59ec8 a[ 7] = 21 &a[ 7] = e2a59ecc a[ 8] = 34 &a[ 8] = e2a59ed0 実行ごとに割り当てられる番地は異なる %./a.out a[ 0] = 1 &a[ 0] = f3419ed0 a[ 1] = 1 &a[ 1] = f3419ed4 a[ 2] = 2 &a[ 2] = f3419ed8 a[ 3] = 3 &a[ 3] = f3419edc a[ 4] = 5 &a[ 4] = f3419ee0 a[ 5] = 8 &a[ 5] = f3419ee4 a[ 6] = 13 &a[ 6] = f3419ee8 a[ 7] = 21 &a[ 7] = f3419eec a[ 8] = 34 &a[ 8] = f3419ef0-21 -

4. 3 2 次元配列 int a[m][n] と宣言すると a[0][0],a[0][1],...,a[0][n-1] a[1][0],a[1][1],...,a[1][n-1]... a[m-1][0],a[m-1][1],...,a[m-1][n-1] の mn 個の配列要素が決定される 配列要素 a[i][j] の番地は &a[i][j] で参照する 1 /* << ba431.c >> */ 3 int main() { 4 int a[3][3],i,j; /* 配列 aの宣言 */ 5 a[0][0]=0; a[0][1]=1; a[0][2]=2; 6 a[1][0]=10; a[1][1]=11; a[1][2]=12; 7 a[2][0]=20; a[2][1]=21; a[2][2]=22; 8 for( i=0; i<=2; i++ ) { 9 for( j=0; j<=2; j++ ) { 10 printf("a[%d][%d]=%d ",i,j,a[i][j]); 11 printf("&a[%d][%d]=%x \n",i,j,&a[i][j]); 12 } 13 } 14 } 実行結果 a[0][0]=0 a[0][1]=1 a[0][2]=2 a[1][0]=10 a[1][1]=11 a[1][2]=12 a[2][0]=20 a[2][1]=21 a[2][2]=22 &a[0][0]=effffb64 &a[0][1]=effffb68 &a[0][2]=effffb6c &a[1][0]=effffb70 &a[1][1]=effffb74 &a[1][2]=effffb78 &a[2][0]=effffb7c &a[2][1]=effffb80 &a[2][2]=effffb84 ( 注意 ) 行優先で番地が割り当てられている - 22 -

4. 4 局所変数の有効範囲 ブロック ({} で囲まれた部分 ) 内で宣言された変数 ( 局所変数 ) はその内部でのみ有効である すなわち ブロック 1 内にブロック 2 が定義されているとき { ブロック 1 { ブロック 2 } } ( 1 ) ブロック 1 で宣言された変数は ブロック 2 で同じ名前で宣言されない限り有効である ( 2 ) ブロック 2 で同じ名前で宣言されると 新たに宣言された方が優先する ( 1 ) の例 1 /* << ba441a.c >> */ 3 int main() { 4 int a; 5 a = 111; 6 printf("mainブロック内 : a=%d\n",a); 7 { 8 printf(" サブブロック内 : a=%d\n",a); 9 a = 222; 10 printf(" サブブロック内 : a=%d\n",a); 11 } 12 printf("mainブロック内 : a=%d\n",a); 13 } 実行結果 main ブロック内 : a=111 サブブロック内 : a=111 サブブロック内 : a=222 main ブロック内 : a=222-23 -

( 2 ) の例 1 /* << ba441b.c >> */ 3 int main() { 4 int b; 5 b = 111; 6 printf("mainブロック内 : b=%d\n",b); 7 { 8 int b; 9 printf(" サブブロック内 : b=%d\n",b); 10 b = 222; 11 printf(" サブブロック内 : b=%d\n",b); 12 } 13 printf("mainブロック内 : b=%d\n",b); 14 } 実行結果 main ブロック内 : b=111 サブブロック内 : b=0 サブブロック内 : b=222 main ブロック内 : b=111-24 -