プログラミング基礎覚え書き⑧(多次元配列と文字列)

参考文献:高橋麻奈著『やさしいC第5版』

多次元配列
複数の次元のある配列。例えばエクセルのような表は縦と横の二次元に広がる二次元配列。
作り方は、要素数の[ ]をもうひとつ作ればOK。

○×ゲームの模様を描く二次元配列
先生の専門がセルオートマトンだからか、ソースコードでお絵かきをする課題が多い。そして辛い。

これを描く。
+-+-+-+-+
|x| |o| |
+-+-+-+-+
| |o| |x|
+-+-+-+-+
| | |o| |
+-+-+-+-+
|o|x|o|x|
+-+-+-+-+

#include

int main(void)
{
int ar[4][4] = { { -1, 0, 1, 0 },
{ 0, 1, 0, -1 },
{ 0, 0, 1, 0 },
{ 1, -1, 1, -1 }
};

int i,j;

printf("+-+-+-+-+\n");
for(i=0; i < 4; i++){
printf("|");

for(j=0; j < 4; j++){

printf(ar[i][j]==1?"o":ar[i][j]==-1?"x":" ");
//○か×か半角スペースかの場合分け(配列の要素が1のところは「o」、-1のところは「x」、0のところは「半角空白」)。

printf("|");
}
printf("\n+-+-+-+-+\n");
}

return 0;
}

九九を表示する二次元配列
二次元配列a[ ][ ]と、かける数とかけられる数を表す変数nとmを宣言する。

表示例
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 ...以下略

#include

int main(void) {

int n,m,a[9][9];

for(n=0;n<9;n++)
{for(m=0;m<9;m++){a[n][m]=(n+1)*(m+1);}}

for(n=0;n<9;n++)
{for(m=0;m<9;m++)printf("%3d",a[n][m]);
printf("\n");
}

return 0;
}

NULL文字
無効、価値がないという意味。
'\0'というエスケープシーケンスで記述する。
文字列を扱う配列をつくる場合は、要素数は最低でも文字数+1にして、最後の箱に文字列の最後を認識するためのNULL文字を格納しなければならない。

char str[6];
str[0] ='H';
str[1] ='e';
str[2] ='l';
str[3] ='l';
str[4] ='o';
str[5] ='\0'; ☚NULL文字。

文字列を扱う2つの配列を連結するコード
手順は以下の3つ。
①配列str1を、' \0 ' になる前まで 配列str3の先頭から格納する。
②配列str2を、' \0 ' になる前まで 配列str3の続きから格納する。
③配列str3の最後に ' \0 ' を入れる。

#include

int main(void)
{
char str1[15] = "Hello ";
char str2[15] = "World!";
char str3[30];

int i,j;

//手順①
NULL文字になるまで一文字ずつstr3に格納しろという意味。
for(i=0; str1[i]!='\0'; i++)
{str3[i] = str1[i];}

//手順②
NULL文字になるまで一文字ずつstr3の続き(str3[i+j])に格納しろという意味。
for(j=0; str2[j]!='\0'; j++)
{str3[i+j] = str2[j];}

//手順③
str3の最後のi+j番目の箱はNULL文字'\0'が入っているよという意味。
str3[i+j] = '\0';

printf("%s\n",str3);

return 0;
}

文字列の入力
お馴染みのscanfを使うのだが、文字列の場合は変数名(str)の前になぜか&をつけない。

char str[100];
printf("文字列を入力してください。\n");
scanf("%s",str); //&がないのに注意!
printf("入力した文字列は%sです。\n",str)

入力された文字列中の英小文字を英大文字に変換するコード
文字にはそれぞれ文字コードが割り振られており、英語の小文字は文字コードで97から122までで、これらの文字コードから32を引くと対応する大文字の文字コードになるらしい。

#include

int main(void)
{

int i;
char str[256];

printf("文字列を入力してください。\n");
scanf("%s",str);
for(i=0; str[i]!='\0'; i++)
{
if(97<=str[i] && str[i]<=122){printf("%c",str[i]-32);} //文字コード97~122なら32を引いて大文字にする。

else{printf("%c",str[i]);} //文字コード97~122以外ならそのまま。
}
printf("\n");

return 0;
}

文字列の長さを求めて表示するコード
繰り返し文forを使って、文字配列の先頭から1文字ずつ数えていき、NULL文字 '\0' まで行ったら繰り返しを終了するように記述する。

#include

int main(void) {

char str[15] = "Hello";
int i,count=0;

for(i=0;str[i]!='\0';i++){count++;}

printf("文字列の長さは%dです\n",count);

return 0;
}
Calendar
<< June 2020 >>
SunMonTueWedThuFriSat
 123456
78910111213
14151617181920
21222324252627
282930
search this site.
tags
archives
recent comment
recent trackback
others
にほんブログ村 科学ブログへ にほんブログ村 科学ブログ 恐竜へ カウンター
admin
  • 管理者ページ
  • 記事を書く
  • ログアウト