ページ 1 / 1
配列なんですが。
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 緋闇
>↑こんな感じでしらべてはどうでしょうか?
試してみて成功しました。ありがとうございます。
> 入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
参考にさせて頂きました。ありがとうございます。
無事に作り終えました。
お答えくださった方々、本当にありがとうございました!