線形探索(番兵法)のプログラムについて考えています。
メイン関数からsearch関数に値を渡してそこで探索させるのですが、
int search(int a[], int n, int key)
{
int i = 0;
a[n] = key;
while (1) {
if (a[i] == key)
break;
i++;
}
return (i == n ? -1 : i);
}
のwhileを使ったやり方からfor文を使ったやり方に変更したいと思っています。
色々な方法でプログラムを考えてみたいので。
そうすると、なんかうまくいきません。
for文だとどのように考えたらいいのでしょうか?
No.4ベストアンサー
- 回答日時:
番兵法の意義からすると冗長な表現を省いた#2の方法もそう悪くはないと思いますが、ソースの見やすさを考えると、私ならwhileを使って、
while(a[i]!=key) i++;
とします。
これは、
for(;a[i]!=key;i++);
と同義ですが、whileのほうが直感的に理解しやすいかと思います(慣れれば大して変わらないですが)。
多分動作速度もあまり変わらないでしょう。
#2ぐらいの変則的な使い方ならどうということは無いですが、中にはアルゴリズムを理解するのに「解読」が必要なほど難解な表現が使われることがあります(C/C++プログラマに多いような)。
そうしたほうがソースが短くて済んだり、動作が速かったりするのですが、あまり多用するとわけのわからない代物になります。
ここの#6さんの回答とかは面白いです。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=653025
初歩のforの使い方(規定回数ループさせるだけ)で番兵法は多分無理だと思います。
どうしてもループの継続条件と検索のためのif文で計2回の比較が入りますから、逐次検索と変わらなくなってしまいます。
多分ここでつまづかれていたんでしょうけど。
No.3
- 回答日時:
No1です。
>for(i=0;;i++)の終了条件は書かなくてもいいのでしょうか?
>こういう書き方をはじめてみました。
かまいません。No2のかたも言ってますが、
for(;;)とwhile(1)は同じ動作です。
forに関する説明文を注意深く読んでみて下さい。
話は変わりますが、今回の解の方法としては、
for(i=0;i<n;i++){
if (a[i]==key) return i;
}
return -1;
が最も素直な解でしょう。
No.2
- 回答日時:
もっと簡略化して
for(i=0;a[i]!=key;i++);
最後のセミコロンを忘れずに。
ちなみに、
while (1)
はそのまま、
for(;;)
と置き換えても、同じ動作をします。
継続条件を書かないのは、無限ループさせたいときによく使われる手法です。
http://www.kusa.ac.jp/~kajiura/c/kurikaeshi/newp …無限ループ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した文字列から母音だけを...
-
break文でループを一気に抜ける...
-
C言語forループが完結した場合...
-
入力した数値を倍々するプログラム
-
C言語、自己参照構造体のプログ...
-
VBScriptでSQLに接続し、CSV出...
-
エクセルVBAで Do While (1)って?
-
C言語のfor文の{}について
-
fortran 論理変数? true
-
ループを途中で抜けたいのですが。
-
猫でもわかる、がわかりません。
-
C言語の関数の戻り値がおかしい?
-
プログラムのmatlabを使ってい...
-
do-while文が禁止される理由
-
プログラムの『軽い』と『重い...
-
if文の中にfor文なのか、for文...
-
C言語、whileループを抜け出す...
-
ループ文出力から バイナリフ...
-
繰り返し文の利点について
-
pic12f675の待ち時間関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報