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