文字列と配列
Point1 基礎事項
「文字」と「文字列」は扱いが異なる。
文字…1文字 文字列…2文字以上(1文字でも文字列扱いになる)
5.5.1 文字コード
アルファベットの大文字と小文字はアスキーコードで0x(20)(10進数で32)違うだけ。
また、例28の「!='z'」となっているところを「!='\n'」とするとエンターキーで終了できる。
5.5.2 1次元配列
配列変数を使う。(配列変数…複数の変数を番号(添字)で管理し、まとめたもの)
※宣言文で宣言した数字より1少ないので注意。a[8]で宣言したらa[7]まで使える。
5.5.3 文字列
※配列の最後の要素に「\0(数値の0)」が置かれる。(文字列の最後を表すため)
これは自動的に代入されるのでプログラマは代入する必要がない。
Point2問題
練習44 小文字を大文字に変換するプログラムを作れ。
{int c,d;
while((c=getchar())!='z'){ d=c-0x20; printf("%c-->%c\n",c,d); }}
練習45 getchar()を用いて、大文字は小文字に、小文字は大文字に変換するプログラムを作れ。
{int c,d;
while((c=getchar())!='\n'){
if(c>0x60) ←小文字ならば
d=c-0x20;
else d=c+0x20;
printf("%c-->%c\n",c,d); }}
練習46 英文を1行小文字で入力したとき、文の先頭の文字を大文字にするプログラムを作れ。
{int c,flag; flag=1; 状態変数flag→状態を知るために使う
while((c=getchar())!='\n'){ flag…旗
if(flag==1){ c-=0x20; flag=0; } 0…降ろす(何もしない)
else if(c=='.') flag=1; 1…挙げる(次にくる文字を
printf("%c",c); } 大文字にしなさい)
printf("\n"); }
練習47 例29のプログラムを改良し、8人の合計点と平均点を出力せよ。
{int i,s;
int a[8]={10,20,15,25,41,35,33,22};
float avg;
s=0;
for(i=0;i<8;i++){ s=s+a[i]; }
avg=s/8.0;
printf("合計=%d 平均=%5.2f\n",s,avg); }
練習48 例29のプログラムを改良し、8人の最高点と最低点を出力せよ。
{int i,max,min;
int a[8]={10,20,15,25,41,35,33,22};
max=min=a[0]; →暫定1位、暫定最下位
for(i=1;i<8;i++){ if(max<a[i]){ max=a[i]; } if(min>a[i]){ min=a[i]; } }
printf("最高=%d 最低=%d\n",max,min); }
練習49 文字列の長さを求めるプログラムを作れ。
{int i;
char a[256]="This is a pen";
i=0;
while(a[i] !='\0'){ i++; } →(a[13] !='\0')になったら抜けなさい、という指示。
printf("%s=%d文字\n",a,i); }
練習50 練習49のプログラムを改良し、gets(a)を用いて、キーボードから入力した文字の文字数を表示するプログラムを作れ。
{int i;
char a[256];
gets(a);
i=0;
while(a[i] !='\0'){ i++: }
printf("%s=%d文字\n",a,i); }
「文字」と「文字列」は扱いが異なる。
文字…1文字 文字列…2文字以上(1文字でも文字列扱いになる)
5.5.1 文字コード
例28の実行結果 |
A[Enter] A 65 41 →Aは文字、65は10進数、41は16進数表現 z[Enter] (%c) (%d) (%x) %(終了)■ |
また、例28の「!='z'」となっているところを「!='\n'」とするとエンターキーで終了できる。
5.5.2 1次元配列
配列変数を使う。(配列変数…複数の変数を番号(添字)で管理し、まとめたもの)
int a[8]のメモリ空間 |
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 10 20 15 25 41 35 33 22 |
使い方 |
データ型 配列変数名[要素数]; (例) int a[4] a[0]〜a[3]も計4つが使える。 |
5.5.3 文字列
printfの補足 | %c:文字表示 %s:文字列表示 %d:10進表示 %x:16進表示 %o:8進表示 |
定数の補足 | 0x20:16進数 015:8進数 'a':文字 "abc":文字列 |
配列宣言とともに文字列を代入する方法 |
char 配列変数名[要素数]=”代入したい文字列”; 代入したい文字列…文字数=要素数−1以内 |
実行時に文字列を代入する方法(キーボードから) |
gets(配列変数名); |
これは自動的に代入されるのでプログラマは代入する必要がない。
Point2
練習44 小文字を大文字に変換するプログラムを作れ。
{int c,d;
while((c=getchar())!='z'){ d=c-0x20; printf("%c-->%c\n",c,d); }}
練習45 getchar()を用いて、大文字は小文字に、小文字は大文字に変換するプログラムを作れ。
{int c,d;
while((c=getchar())!='\n'){
if(c>0x60) ←小文字ならば
d=c-0x20;
else d=c+0x20;
printf("%c-->%c\n",c,d); }}
練習46 英文を1行小文字で入力したとき、文の先頭の文字を大文字にするプログラムを作れ。
{int c,flag; flag=1; 状態変数flag→状態を知るために使う
while((c=getchar())!='\n'){ flag…旗
if(flag==1){ c-=0x20; flag=0; } 0…降ろす(何もしない)
else if(c=='.') flag=1; 1…挙げる(次にくる文字を
printf("%c",c); } 大文字にしなさい)
printf("\n"); }
練習47 例29のプログラムを改良し、8人の合計点と平均点を出力せよ。
{int i,s;
int a[8]={10,20,15,25,41,35,33,22};
float avg;
s=0;
for(i=0;i<8;i++){ s=s+a[i]; }
avg=s/8.0;
printf("合計=%d 平均=%5.2f\n",s,avg); }
練習48 例29のプログラムを改良し、8人の最高点と最低点を出力せよ。
{int i,max,min;
int a[8]={10,20,15,25,41,35,33,22};
max=min=a[0]; →暫定1位、暫定最下位
for(i=1;i<8;i++){ if(max<a[i]){ max=a[i]; } if(min>a[i]){ min=a[i]; } }
printf("最高=%d 最低=%d\n",max,min); }
練習49 文字列の長さを求めるプログラムを作れ。
{int i;
char a[256]="This is a pen";
i=0;
while(a[i] !='\0'){ i++; } →(a[13] !='\0')になったら抜けなさい、という指示。
printf("%s=%d文字\n",a,i); }
練習50 練習49のプログラムを改良し、gets(a)を用いて、キーボードから入力した文字の文字数を表示するプログラムを作れ。
{int i;
char a[256];
gets(a);
i=0;
while(a[i] !='\0'){ i++: }
printf("%s=%d文字\n",a,i); }
br→
main_box