Download presentation
Presentation is loading. Please wait.
1
C言語講座 配列と文字列 Ver 0.3
2
文字を表示しよう。 printf(“%c%c\n”,75,51);
まず、思い出してほしいのは「%cが文字をそこにひとつ表示する」ということ。 CはcharacterのCで、変数型でもchar型っていうのがありましたね^^ 上の文を実行すると「K3」と表示されます。これが意味する事は文字がコンピュータの中で数字で表されていると言うことですね。 char ch=‘a’; printf(“%d = %c\n”,ch,ch); まず、シングルクオーテーションで一文字を囲むと、それはその文字を現す「数字」に変わるわけです。つまり、変数chには97が入っています。 だから上の文を実行すると、「97 = a」と表示されるはずです。 この数字のことを「ascii code(アスキーコード)」と呼びます。
3
理解を深めタイ 入力した文字を数字と文字で表すプログラム 文字を「a」から「z」まで表示するプログラム
Main(void) { char ch=0; printf(“>”); scanf(“%c”,&ch); printf(“%c = %d\n”,ch,ch); } 文字を「a」から「z」まで表示するプログラム Main(void) { char ch=0; for(ch=‘a’;ch<=‘z’;ch++){ printf(“%c “,ch); } } ‘a’=97,’b’=98,’c’=99,….という規則性がある。
4
アスキーコード表 <アドバイス> Aとaは32だけ離れている。もし、小文字から大文字に変換したいのなら、文字コードから32を引けば、実現できそうですね。 注) DEC:10進数 HEX:16進数
5
追加(アスキーコード) 入力した文字が、大文字だったら、そのまま、小文字だったら大文字に変換するプログラム main(void) { char ch; printf(“please type any key:”); scanf(“%c”,ch); if(‘a’<= ch && ch <=‘z’){ ch = ch + ’A’ – ‘a’; } printf(“Result is %c.\n”,ch); } ch = ch+ ‘A’ –’a’; という行はアスキーコード表を見てもらうとわかるだろうが、大文字に変換する計算である。a(アスキーコード97)をA(アスキーコード65)に変換するには、現在のアスキーコードから32をひく(つまり+(65 – 97))すればよいということ。
6
配列1 配列とは 配列は変数の拡張だと考えるので、とりあえず、変数について心配な人は復習しましょう^^。
配列1 配列とは 配列は変数の拡張だと考えるので、とりあえず、変数について心配な人は復習しましょう^^。 配列とはいってしまえば、変数がずらっと並んだものをさします。とりあえず、図 a[0] a[1] a[2] a[3] a[4] a[5] a[6] …. a[N] というような感じに数字等を入れる箱を連続で(番号をつけて)並んでいるのが、「配列」となります。「そんなにたくさん変数つくったって、しょうがないじゃん」って突っ込まれるかもしれませんが、配列はけっこー便利です。まぁ、ひとつ例を挙げれば、100個の数字を入力して、それをすべて記憶(変数に入れる)するには、どうすればいいか。変数名をa,b,c,dと100個宣言するのは、明らかにおかしいですよね。そこで、配列が登場するわけです。
7
配列2 配列を使う 宣言 変数型 配列名[配列数]; 内容の参照 初期化
配列2 配列を使う 宣言 変数型 配列名[配列数]; 例) int array[500]; char moji[30]; 注) 実際にa[10]と宣言すると、箱はa[0]からa[9]までの10個の箱が用意されます 内容の参照 例 printf(“%d”,a[2]); a[0]=a[2]; if(a[10]==0){} 初期化 int array[10]={0,1,2,3,4,5,6,7,8,9}; これで、配列に0,1,2,3・・・・の数字が入るわけです。もし int array[10]={0}; と省略されると、配列が全部0となる。
8
配列3 配列の利用法 10個の数字を入力して、それをすべて足すプログラム
配列3 配列の利用法 10個の数字を入力して、それをすべて足すプログラム main(void) { int a[10]; /* これが、配列の宣言 */ int i=0,ans=0; for(i=0;i<10;i++){ printf(“>”); a[i]=getchar(); /* 一文字読み込む */ } for(i=0;i<10;i++){ ans=ans+a[i]; } printf(“ANS = %d\n”,ans); } どうかな、便利さがわかると思う。繰り返しの中で、配列を次々に読むことが可能なのだ。 getchar()は一文字だけ読み取ることを指す。
9
配列による文字列の表示 いままでやったなかで文字列を表現するにはこうすればよい。
char str[9]={‘h’,’o’,’s’,’e’,’i’,’u’,’n’,’i’,’v’}; for(i=0;i<9;i++){ printf(“%c”,str[i]); } 入力だったら、 char str[9]; for(i=0;i<9;i++){ scanf(“%c”,str[i]); /* %cであることに注意。 */ }
10
もっと便利に・・ 一文字ずつ入力するのでは、プログラムが見にくくてしょうがないでしょう。そこで、C言語ではこのような機能を提供してくれている。 printf(“%s”,str); scanf(“%s”,str); printf(“%s”,str);はstr配列の中の文字を頭から読んで表示してくれます。 例)str[0]=‘N’,str[1]=‘A’,str[2]=‘R’,str[3]=‘C’ なら、NARCと表示される scanf(“%s”,str);は、エンターか、スペースが押されるまでに押された文字、つまり入力文字列を配列の先頭から入れて言ってくれる。 これで、文字列を入力し、それを表示するプログラムがすぐに作れる気がするね。 注)scanf(“ %s ”,ココ);が配列の場合、&はつけないこととする。
11
Scanf後の配列の中身 scanf(“%s”,str);で「keisanz」と入力すると配列には下のようにデータが入る
‘\0’ a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 注目してもらいたいのは最後の’\0’で、これはNULL文字といって、「ここで文字列が終わりですよ」という記号なのです。Printf(“%s”,str);の中身は多分 for(i=0;str[i]!=‘\0’;i++){ 処理 } となっているはずです。ですから、配列を宣言するとき、ぎりぎりに宣言するのではなく、NULL文字のひとつを考えて宣言するようにしましょう。( N個の文字数を使用したいとき、 char str[N+1];と宣言しよう。)
12
文字列と御戯れ 入力された文字列の長さを表示するプログラム 入力された文字列の中の「.(ドット)」を改行に変換するプログラム
Main(void) { char str[50]; int i=0; scanf(“%s”,str); for(i=0;str[i]!=‘\0’;i++){} /* NULL文字まで、iを加算し続ける それ以外何もしない*/ printf(“STR_LENGTH = %d\n”,i); } 入力された文字列の中の「.(ドット)」を改行に変換するプログラム Main(void) { char str[50]; int i=0; scanf(“%s”,str); for(i=0;str[i]!=‘\0’;i++){ if(str[i]==‘.’){ /* もし、ドットのアスキーコードならば、 */ str[i]=‘\n’; /* 改行コードに変換 */ } } printf(“%s\n”,str); }
13
課題 課題 まず、文字列を入力する。もし、それが小文字だったら大文字に、大文字だったら小文字に、アルファベットでなければ「.(ドット)」に変換して表示させるプログラム。 やる気のある人へ 入力した文字列を左右逆さまに「変換」し、printf(“%s”)で表示するプログラムを書け。例)「keisangijyutukenkyukai」→「iakuyknekutuyijgnasiek」 ヒント:配列のi番目とj番目を交換する方法 tmp=a[i]; a[i]=a[j]; a[j]=tmp;
14
その他の入出力関数 getchar(); putchar();
文字を一文字だけキーボードから読み取る関数。戻り値はint型が望ましい。 例) int ch; ch=getchar(); putchar(); 文字を一文字だけ表示。 例) putchar(ch); putchar(‘A’);
15
その他の入出力関数 gets(配列); puts(配列);
一行入力。Scanfだと、スペースなどが入力できないが、gets()は、エンターが押されるまでを、すべて指定の配列に入れてくれる。まさにゲッツ 例) gets(str); puts(配列); 一行出力。強制的に改行されるため、微妙に使いにくい。僕はprintf()を薦めます 例) put(str); ここには大まかに書いてしまいましたが、実は奥が深くて、こんな書き方をしたら怒られてしまうかもしまいません(汗)。とりあえず、詳細は参考書に譲ります。
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.