ページ 11

配列なんですが。

Posted: 2007年2月21日(水) 15:16
by tower
配列で本を見ても良く分からないことがあるんですが、
このように、
charb[/url][3] = { "1, 3, 5, 7, 9, 11, 13, 15" };
と記述した場合、何行、何列の2次元配列になりますか?

また、b[2][2]とした場合には¥0でしょうか?それとも0が入るんでしょうか?
基本の範囲内ですみませんが、よろしくお願いします。

Re:配列なんですが。

Posted: 2007年2月21日(水) 15:46
by Yuki
>charb[/url][3] = { "1, 3, 5, 7, 9, 11, 13, 15" };
その前に、本当にこのように宣言されていますか?

頭がこんがらがってきたら、1番簡単なところから考えてみると良いですよ。
char a[3] = { '1', '3', '5' }; 
char c[3][3] = { {'1', '3', '5'}, {'7', '9', '2'}, {'4', '6', '8'} }; 

printf( "%c %c %c\n", a[0], a[1], a[2] );
printf( "%c %c %c\n", c[0][0], c[0][1], c[0][2] );
printf( "%c %c %c\n", c[1][0], c[1][1], c[1][2] );
printf( "%c %c %c\n", c[2][0], c[2][1], c[2][2] );

Re:配列なんですが。

Posted: 2007年2月21日(水) 15:47
by box
> charb[/url][3] = { "1, 3, 5, 7, 9, 11, 13, 15" };
> と記述した場合、何行、何列の2次元配列になりますか?

charとbとの間は空白ですね?
また、初期化子の中にあるダブルクォーテーションは不要ですね?
以上の前提条件の下において、bはchar型の3行3列の配列です。

> また、b[2][2]とした場合には¥0でしょうか?それとも0が入るんでしょうか?

0x00が入ります。
\0が入るのか0が入るのかは、それらの前後に''を付けるつもりだったのか
付けないつもりだったのかがあいまいですので、何とも言えません。

Re:配列なんですが。

Posted: 2007年2月21日(水) 15:53
by 管理人
え、本にそんな書き方してあるんですか?
だとしたらその本は間違っていると思いますが・・。
コンパイルしたとき
「 'b' : 指定された配列には、初期化子が多すぎます。」
とかエラーが出ませんか?
ご自分でそのコードを書いてコンパイルしてみましたか?

3つしか1まとまりの配列要素を宣言していないのに、8個も代入しようとしているのでエラーになっています。
まず、2次元配列についておさらいしましょう。
int b[2][2];

このように宣言したときは

[0][0] [0][1]

[1][0] [1][1]

このような4つの配列要素が確保できます。

int b[2][3];

このように宣言したときは

[0][0] [0][1] [0][2]

[1][0] [1][1] [1][2]

このような6つの配列要素が確保できます。

int b[4][2];

このように宣言したときは

[0][0] [0][1]

[1][0] [1][1]

[2][0] [2][1]

[3][0] [3][1]

このような6つの配列要素が確保できます。

つまり
int b[x][y];
と宣言した時に、xというまとまりのなかに、y個配列要素があるので、
総計はx*y個になるんですね。
1つのまとまりは括弧で囲んで初期化できます。

int b[3]={1,2,3};

こんな風に初期化できますね。2次元配列でも

int b[2][3]={{1,2,3},{4,5,6}};

このように初期化出来ます。

int b[3][3]={{1,2,3},{4,5,6},{7,8,9}};

2次元配列は2次元であることを意識するために、2次元方向に書いて初期化することもありますが意味は同じです。

int b[5][5]={
             {0,3,0,0,0},
             {1,1,1,3,1},
             {2,2,1,4,1},
             {3,1,1,1,1},
             {4,1,1,5,1}
            };

int型は、初期化の時、何もかかなかったら0で初期化
char旗は、初期化の時、何も書かなかったら\0で初期化されます。

int b[5]={};

こうすると全て0で初期化されています。明示的に示すために

int b[5]={0,};

と書いてあるものもありますが同じ意味です。しかし

int b[5]={1,};

と書いたからといって全て1で初期化されるわけではありません。書かなかったところは0で初期化されます。

また、配列要素数は省略出来ます。

int b[/url]={1,2,3,4,5};

これならb[5]で宣言したのと同じ事。

int b[/url][2]={{1,2},{3,4}};

これならb[2][2]で宣言したのと同じ事
上記説明でおわかりになりましたでしょうか?

よって[/url][3]としているにもかかわらず、8個も1まとまりの中に入れることは出来ません。

丁寧な回答をありがとうございます。

Posted: 2007年2月22日(木) 13:17
by tower
>初期化子の中にあるダブルクォーテーションは不要ですね?
すみません。""は不要でした。

本当のプログラムは下記のものです。

#include <stdio.h>

main()
{
int b[/url][3] = { 1, 3, 5, 7, 9, 11, 13, 15 };

これを下記のように

printf(" %d ", b[0][0]);
printf(" %d ", b[0][1]);
printf(" %d ", b[0][2]);
printf(" %d ", b[0][3]);
printf(" %d ", b[0][4]);
printf(" %d ", b[0][5]);
printf(" %d ", b[0][6]);
printf(" %d ", b[0][7]);
printf(" %d\n ", b[0][8]);

と書いて実行したら最後のb[0][8]は、0でした。
その後、機会があって、知人にも確かめてもらいましたが、同じでした。

という事で解決はしたんですが、管理人さんが言うように本当はエラーなんでしょうか?
実行できる私のPCがおかしいんでしょうか?(^^;A)
嘘ではないんですけど…気になりますね。


<!--1

インプットの制限について質問です。

Posted: 2007年3月12日(月) 23:22
by 緋闇
初めまして。学校でプログラミングを習い始めたばかりの緋闇と申します。
レベル2+くらいです。

入力された2進法の数字を足し算するプログラム作成、という宿題が出ました。
インプットが2進法数字以外ならエラーメッセージを表示するように書いてあるのですが、
どのように入力制限すればいいのかわかりません。
どなたか教えてください。お願いします。

Re:インプットの制限について質問です。

Posted: 2007年3月12日(月) 23:49
by box
> インプットが2進法数字以外ならエラーメッセージを表示する

入力をいったん文字列として受けます。
その文字列を先頭から1文字ずつチェックし、
2進数を構成する'0'や'1'以外の文字が見つかったら
エラーにすればよいと思います。

Re:インプットの制限について質問です。

Posted: 2007年3月13日(火) 00:01
by むつ
数(10進数)の範囲やマイナスの扱いはどのようにせよとありますか。

Re:インプットの制限について質問です。

Posted: 2007年3月13日(火) 00:07
by 緋闇
> > インプットが2進法数字以外ならエラーメッセージを表示する
>
> 入力をいったん文字列として受けます。
> その文字列を先頭から1文字ずつチェックし、
> 2進数を構成する'0'や'1'以外の文字が見つかったら
> エラーにすればよいと思います。

回答ありがとうございます。
文字列を一文字ずつチェックする、というのはどうしたらいいのでしょうか・・・。
全然わからなくて・・・すみません。

Re:インプットの制限について質問です。

Posted: 2007年3月13日(火) 00:09
by 緋闇
> 数(10進数)の範囲やマイナスの扱いはどのようにせよとありますか。

それについては特には何も書いてありませんでした。

Re:インプットの制限について質問です。

Posted: 2007年3月13日(火) 01:34
by みるみる
文字列を1文字づつチェックする方法。
例えば文字列をstrとすると。。
for()文でまわしながら、if()文で
if(str != '0' && str != '1'){
/* 0でも1でもないとここが実行されます */
}
↑こんな感じでしらべてはどうでしょうか?

Re:インプットの制限について質問です。

Posted: 2007年3月13日(火) 08:25
by むつ
どこまで出来ているのかわかりませんが、
入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
①~⑤の虫食いを埋めると、文字サイズと切り分けられた文字が表示されます。
※④には同じ文字が入ります。

ソースを掲載する際には以下のようにしてください。
< pre>
ソースをここに記述する
< /pre>
※pre,/preの前の空白は削除してください
#include <①>
#include <②>
int main( void )
{
	unsigned char unx[ 256 ];
	unsigned int  i;
	fgets( unx, ③( unx ), stdin );
	printf( "入力文字の長さは %d\n", ④( unx ) );
	for( i = 0; i < ④( unx ); i++ )
		printf( "%d番目 %c\n", i + 1, unx[ ⑤ ] );
	return 0;
}

Re:インプットの制限について質問です。

Posted: 2007年3月13日(火) 10:29
by 緋闇
>↑こんな感じでしらべてはどうでしょうか?
試してみて成功しました。ありがとうございます。


> 入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
参考にさせて頂きました。ありがとうございます。


無事に作り終えました。
お答えくださった方々、本当にありがとうございました!