Cygwinでデバッグ/ループの書き方の習慣
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Cygwinでデバッグ]]
#contents
** ループの書き方の習慣 [#iaec056c]
*** 最初に考えるべきこと [#a474e5e6]
繰返し処理をしようとする時、当然 for ループや while ルー...
そうです、ループの制御をする''ループ変数を何にするか''を...
ループ変数は、ループ処理中に頻繁に出現するので短い名前に...
> 文字列に関する処理だと s, t、ポインタに関係する処理だと...
> ループ変数が足りなくなってきたら、それは関数の設計に問...
*** 良いループ・悪いループ [#i30d69db]
さて、10回ループの書き方は、もちろん何通りもあるのですが...
○(1) for ( i=0; i<10; i++ ) { ... }
○(2) for ( i=1; i<=10; i++ ) { ... }
×(3) for ( i=0; i<=9; i++ ) { ... }
×(4) for ( i=1; i<11; i++ ) { ... }
×のついているものは、なぜ悪いのか、一目瞭然ですね。確かに...
ここからわかることは、次のようにまとめられます。
- (1) ループ変数を 0 から始めるなら、条件は < (イコール...
- (2) ループ変数を 1 から始めるなら、条件は <=
つまり、もし(n-1)回のループをさせたいなら、(n-1)という表...
○(1) for ( i=0; i<n-1; i++ ) { ... }
○(2) for ( i=1; i<=n-1; i++ ) { ... }
×(4) for ( i=1; i<n; i++ ) { ... }
(1)(2) のどちらを使うかは、場面によって判断します。C言語...
*** 常套句との類似性 [#q161740c]
次の2つのプログラムは、どちらも同じ働きをしますが、どち...
プログラム[A]
for ( i=0; i<10; i++ ) {
a[i] = -i;
}
プログラム[B]
for ( i=0; i>-10; i-- ) {
a[-i] = i;
}
どちらも a[0] = 0, a[1] = -1, ..., a[9] = -9 のように代入...
配列 a[] を 0 で初期化する処理といえば、次の処理を思い浮...
for ( i=0; i<10; i++ ) {
a[i] = 0;
}
おそらく、この常套句に似ている方が読み易いのでしょう。ル...
*** ループ変数の役割 [#tf3438b0]
最後に、ループ変数の扱いについて触れておきます。ループ処...
プログラム[A]
for ( i=0; i<10; i++ ) {
if ( i%2 == 0 ) i++; // 偶数なら奇数にする
printf("%d\n", i);
}
プログラム[A]が奇数を5個表示すると言われても、(コメント...
プログラム[B]
for ( i=0; i<10; i+=2 ) {
printf("%d\n", i+1);
}
プログラム[C]
for ( i=0; i<10/2; i++ ) {
printf("%d\n", i*2+1);
}
プログラム[B][C]ならば素直で、コメントがなくても理解でき...
次のプログラムは、そもそもループ変数がどれだかよくわから...
for ( i=0; j<10; k++ ) {
if (i==0) k=0;
j=i; i=k;
printf("%d\n", j);
}
さて、ループ変数が2個あるように見えるのも、あまりよい気...
例えば次のプログラムは、入門書に例としてよく載せられるも...
void string_copy(char *dst, char *src) {
char *d, *s;
for ( d=dst,s=src; *s!='\0'; d++,s++ ) {
*d = *s;
}
*d = '\0';
}
よく見ると、終了条件に関係するのは s だけですから、これが...
void string_copy(char *dst, char *src) {
char *d, *s;
d = dst; s = src;
while ( *s != '\0' ) {
*d = *s;
d++; s++;
}
*d = '\0';
}
あるいは、ポインタをやめて、配列でアクセスすることにすれ...
void string_copy(char *dst, char *src) {
int i;
for ( i=0; src[i]!='\0'; i++ ) {
dst[i] = src[i];
}
dst[i] = '\0';
}
このように、ループ変数の役割は大切です。ループ変数には、...
そしてループ処理には、ループ変数が主役となって登場します...
「とりあえず無限ループを書いて、適当な条件で break する」...
> 以下はキーボードから1文字ずつ受け取る常套句ですが、な...
while ((c=getc()) != EOF) { ... } ファイルの終わりまで...
同じ処理の条件式分割版
while ( 0 == 0 ) { ループ1回ごとに変化...
c = getc(); ループの終了はいつ?
if (c == EOF) break;
...
}
常套句ですから、このような複雑な条件式も許されます。しか...
終了行:
[[Cygwinでデバッグ]]
#contents
** ループの書き方の習慣 [#iaec056c]
*** 最初に考えるべきこと [#a474e5e6]
繰返し処理をしようとする時、当然 for ループや while ルー...
そうです、ループの制御をする''ループ変数を何にするか''を...
ループ変数は、ループ処理中に頻繁に出現するので短い名前に...
> 文字列に関する処理だと s, t、ポインタに関係する処理だと...
> ループ変数が足りなくなってきたら、それは関数の設計に問...
*** 良いループ・悪いループ [#i30d69db]
さて、10回ループの書き方は、もちろん何通りもあるのですが...
○(1) for ( i=0; i<10; i++ ) { ... }
○(2) for ( i=1; i<=10; i++ ) { ... }
×(3) for ( i=0; i<=9; i++ ) { ... }
×(4) for ( i=1; i<11; i++ ) { ... }
×のついているものは、なぜ悪いのか、一目瞭然ですね。確かに...
ここからわかることは、次のようにまとめられます。
- (1) ループ変数を 0 から始めるなら、条件は < (イコール...
- (2) ループ変数を 1 から始めるなら、条件は <=
つまり、もし(n-1)回のループをさせたいなら、(n-1)という表...
○(1) for ( i=0; i<n-1; i++ ) { ... }
○(2) for ( i=1; i<=n-1; i++ ) { ... }
×(4) for ( i=1; i<n; i++ ) { ... }
(1)(2) のどちらを使うかは、場面によって判断します。C言語...
*** 常套句との類似性 [#q161740c]
次の2つのプログラムは、どちらも同じ働きをしますが、どち...
プログラム[A]
for ( i=0; i<10; i++ ) {
a[i] = -i;
}
プログラム[B]
for ( i=0; i>-10; i-- ) {
a[-i] = i;
}
どちらも a[0] = 0, a[1] = -1, ..., a[9] = -9 のように代入...
配列 a[] を 0 で初期化する処理といえば、次の処理を思い浮...
for ( i=0; i<10; i++ ) {
a[i] = 0;
}
おそらく、この常套句に似ている方が読み易いのでしょう。ル...
*** ループ変数の役割 [#tf3438b0]
最後に、ループ変数の扱いについて触れておきます。ループ処...
プログラム[A]
for ( i=0; i<10; i++ ) {
if ( i%2 == 0 ) i++; // 偶数なら奇数にする
printf("%d\n", i);
}
プログラム[A]が奇数を5個表示すると言われても、(コメント...
プログラム[B]
for ( i=0; i<10; i+=2 ) {
printf("%d\n", i+1);
}
プログラム[C]
for ( i=0; i<10/2; i++ ) {
printf("%d\n", i*2+1);
}
プログラム[B][C]ならば素直で、コメントがなくても理解でき...
次のプログラムは、そもそもループ変数がどれだかよくわから...
for ( i=0; j<10; k++ ) {
if (i==0) k=0;
j=i; i=k;
printf("%d\n", j);
}
さて、ループ変数が2個あるように見えるのも、あまりよい気...
例えば次のプログラムは、入門書に例としてよく載せられるも...
void string_copy(char *dst, char *src) {
char *d, *s;
for ( d=dst,s=src; *s!='\0'; d++,s++ ) {
*d = *s;
}
*d = '\0';
}
よく見ると、終了条件に関係するのは s だけですから、これが...
void string_copy(char *dst, char *src) {
char *d, *s;
d = dst; s = src;
while ( *s != '\0' ) {
*d = *s;
d++; s++;
}
*d = '\0';
}
あるいは、ポインタをやめて、配列でアクセスすることにすれ...
void string_copy(char *dst, char *src) {
int i;
for ( i=0; src[i]!='\0'; i++ ) {
dst[i] = src[i];
}
dst[i] = '\0';
}
このように、ループ変数の役割は大切です。ループ変数には、...
そしてループ処理には、ループ変数が主役となって登場します...
「とりあえず無限ループを書いて、適当な条件で break する」...
> 以下はキーボードから1文字ずつ受け取る常套句ですが、な...
while ((c=getc()) != EOF) { ... } ファイルの終わりまで...
同じ処理の条件式分割版
while ( 0 == 0 ) { ループ1回ごとに変化...
c = getc(); ループの終了はいつ?
if (c == EOF) break;
...
}
常套句ですから、このような複雑な条件式も許されます。しか...
ページ名: