プログラミング言語 2 第 03 回 (2007 年 05 月 07 日 ) 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 1
今日やること hp://www.nlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 05 月 07 日分と書いてある部分が 本日の教材です 本日の内容 先週の課題の簡単な解凍 アドレスとポインタ C 言語におけるにおける文字列 標準入力からのからの書式付書式付き入力 第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] 21:main(){ 22: 22: char char sring[11]; 23: 23: in ini; i; 24: 24: 25: 25: scanf("%10s",sring); 26: 26: prinf("%s n",sring); 22 行目 : サイズ 11 の整数型の配列 sring を宣言 23 行目 : 整数 i を宣言 2
第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] E S 21:main(){ 22: 22: char char sring[11]; 23: 23: in ini; i; 24: 24: 25: 25: scanf("%10s",sring); 26: 26: prinf("%s n",sring); 25 行目 : 標準入力から sring に文字列を代入 26 行目 : 試しに 出力してみる 第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 27 行目 :i に 0 代入 sring[i] は suring[0] を意味するように 3
第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 28 行目 :sring[i] が でない限り繰り返す i=0 であり sring[0] は なので続ける 第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 29 行目 :sring[i] が A 以上 Z 以下であるか判定 つまり 大文字かどうかを判定 今回は小文字なので 次の文は通過する 4
第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 31 行目 :sring[i] が a 以上 z 以下であるか判定 つまり 小文字かどうかを判定 今回は小文字なので 次の文を実行する 第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] T E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 32 行目 :aoa を実行する aoa は小文字を大文字にして返す 戻り値を sring[i] に代入する 5
第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] T E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 34 行目 :i++ する sring[i] は 今までの次の文字になる 第 2 回の課題の簡単な解説 sring[0] sring[1] sring[2] sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] T E S 28: 28: while while (sring[i]!=!=''){ 29: 29: if if (sring[i] >= >= 'A' 'A'&& sring[i] <= <= 'Z') 'Z'){ 30: 30: sring[i] = Aoa(sring[i]); 31: 31: }else }else if if (sring[i] >= >= 'a' 'a'&& sring[i] <= <= 'z') 'z'){ 32: 32: sring[i] = aoa(sring[i]); 33: 33: } 34: 34: i++; i++; 35: 35: } 28~35 行目 :sring[i] が の間 繰り返す i が 4 になったとき while が終了する 6
sring[3] sring[4] sring[5] sring[6] sring[7] sring[8] sring[9] sring[10] 第 2 回の課題の簡単な解説 sring[0] T 34: 34: i++; i++; sring[1] E 35: 35: } sring[2] S 36: 36: prinf("%s n",sring); 37:} 37:} 36 行目 :sring の内容を出力する 37 行目 : 終了 第 2 回の課題の簡単な解説 03:char Aoa(char symbol){ 04: 04: char char ou; ou; 05: 05: in incoun; 06: 06: 07: 07: coun coun = symbol symbol --'A'; 'A'; 08: 08: ou ou = 'a' 'a' + coun; coun; 09: 09: reurn reurn ou; ou; 10:} 10:} 04 行目 : 文字型変数 ou を宣言 05 行目 : 整数型変数 in を宣言 07 行目 :symbol から 'A' を引き算することで symbol が 'A' から何文字先か計算 その結果を coun に保存 08 行目 :coun を 'a' に足し算することで 'a' から coun 先の文字を計算 その結果を ou に保存 09 行目 :ou を戻り値として返す 7
第 2 回の課題の簡単な解説 aoa は Aoa と ほぼ同様です 今日やること hp://www.nlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 05 月 07 日分と書いてある部分が 本日の教材です 本日の内容 先週の課題の簡単な解凍 アドレスとポインタ C 言語におけるにおける文字列 標準入力からのからの書式付書式付き入力 8
4.1 メモリとアドレス 計算機内部では データは2 進数で保存している 計算機は メモリにデータを蓄えている bi 1bi 0 もしくは 1 のどちらかを保存 bye 1bye 1biが8つ集まっている bye が メモリの基本単位として使用される 4.1 メモリとアドレス メモリは 1bye を保存できる場所が大量にある それぞれの場所には アドレスがふられている メモリの概念図 0000 0001 0002 0003 0004 0005 0006 アドレスがふられている 9
0000 0001 0002 0003 0004 4.2 アドレスの参照 C 言語で用いる変数等も 実際の値はメモリ上にある メモリ上のどこに置くかとかは OSやコンパイラが適時やってくれる C 言語では 実際にどこにデータが保存されいるのか プログラム中で参照できる 変数 T 計算機 これは此処に入れるか 変数 T を使用と 人 0000 0001 0002 0003 0004 4.2 アドレスの参照 C 言語で用いる変数等も 実際の値はメモリ上にある メモリ上のどこに置くかとかは OSやコンパイラが適時やってくれる C 言語では 実際にどこにデータが保存されいるのか プログラム中で参照できる 変数 T 計算機 0002 です 変数 T のアドレスは? 人 10
4.2 アドレスの参照 例 : 変数の前に & をつけると その値をどこに保存しているか ( アドレス ) を参照できる #include <sdio.h> main(){ in i; i; } pirnf("%u n",&i); &i とすることで i が保存されているアドレスを参照できる 4.2 アドレスの参照 どこに保存されているか はわかる 次にやりたいことは? その場所に入っている値が何か アドレスの前に * をつけると そのアドレスに保存している値を参照できる 更に C 言語では アドレスを保存する型も存在する ポインタ 11
4.2 ポインタとアドレス ポインタ アドレスを保存している変数です このポインタを型として宣言することができます 整数型や文字型と合わせて宣言されます 変数 poi はアドレスである と宣言するのではない! 変数 poi は整数型の変数を保存しているアドレス 変数 poi は文字型の変数を保存しているアドレス のように どの型を保存しているアドレスなのかを区別 例 : 4.2 ポインタとアドレス #include <sdio.h> main(){ in i; i; in *poi_01; in arr[10]; } ポインタの宣言の仕方 *poi_01 は整数型である poi_01 の部分が整数型のデータを保存するアドレスとなる 宣言するときに * をつけると * の次の文字は アドレスになる 12
4.2 ポインタとアドレス #include <sdio.h> main(){ in i; i; in *poi_01; in arr[10]; } in i; in *poi_01; in arr[10]; アドレスを参照するには 整数型の変数 i を宣言 &i poi_01( または &*poi_01) arr 整数型の変数 *poi_01 を宣言 poi_01 はアドレス サイズ 10 の整数型の配列 arr は配列の最初の要素のアドレス 値を参照するには i *po_01 arr[0] 5.2 C 言語における文字列 C 言語では 文字列は配列として扱うことができる 例えば 文字列 "es" が サイズ 10 の文字型の配列 s に保存されているなら s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] e s 文字列の最後には NULL がつきます ( つきます というか つけます ) 13
5.2 C 言語における文字列 NULL がないと どうなるのか? s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] e s e s 計算機 文字列は es と この が違う文字だと s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] 計算機 e s - e s 文字列は es-es と 文字列を扱うときには 文字列の末尾に NULL がついているかどうかが重要になる 4.2 ポインタとアドレス #include <sdio.h> 人 文字列の比較... main(){ char s[11]; s=="es-es"; } 駄目 文字列を扱うときには 文字列を扱う命令を用いることになります 文字列を便利に扱う関数は 今日はやりません 駄目 駄目です sはアドレスアドレスです 14
7.2 書式付きの入力 (scanf) scanf(forma [,poiner]) 標準入力からの入力を forma に従って変換し 結果を各ポインタ (poiner) に値を代入します 例 : #include<sdio.h> main(){ in i; i; 標準入力から読み込んだ入力を 符合付き整数として i に代入 } scanf("%d",&i); prinf("inpued value is is %d n",i); 7.2 書式付きの入力 (scanf) scanf(forma [,poiner]) 標準入力からの入力を forma に従って変換し 結果を各ポインタ (poiner) に値を代入します 例 : #include<sdio.h> main(){ in i; i; char c; c; } 標準入力から読み込んだ 2 つの入力を 1 つ目は符合付き整数として i に 2 つ目は文字として k に代入 scanf("%d%c",&i,&c); prinf("inpued value is is %d n",i); 改行やスペースを区切りとして認識 15
7.2 書式付きの入力 (scanf) scanf(forma [,poiner]) 標準入力からの入力を forma に従って変換し 結果を各ポインタ (poiner) に値を代入します 例 : #include<sdio.h> main(){ char sr[11]; 標準入力から読み込んだ文字列を 文字列として sr に代入 最後に NULL が挿入される } scanf("%10s",sr); prinf("inpued value is is %d n",i); 16