ページ 1 / 1
配列と条件式
Posted: 2017年7月31日(月) 12:34
by DayDreamer
お久しぶりです、と言っても前回投稿させてもらったのは数ヶ月なのですが。
細々とゲーム作りを進めていました。
(以前はパソコンからDay-Dという名前で投稿してたんですが、今回はスマホからなので名前が変わっています。というか同じ名前の人がいるとエラーが出るんですねここ…)
非常に単純なことで申し訳ないのですが、質問です。
int UP[7]={1,2,3,7,8,9,11}
と、あるint型の変数x(最終的には二次元配列の一要素にする予定なのですが、仮として)があるとして、
xが配列UP内のどれかと一致するかどうかを確かめたいと思っています。
もちろんif( x==1 || x==2 || (中略) || x==11 )
と総当たりでやれば出来る事はできるものの、だいぶ見辛い文になってしまうのでできれば避けたいです。
またUP内の変数全てと一致しなかった場合のケースも作るため、for構文で全チェックする方法も出来ませんでした。
最悪総当たりで書いてしまおうかと思ってはいるのですが、スマートな解決方がありましたらご教授いただけると幸いです。
Re: 配列と条件式
Posted: 2017年7月31日(月) 12:58
by かずま
DayDreamer さんが書きました:
またUP内の変数全てと一致しなかった場合のケースも作るため、for構文で全チェックする方法も出来ませんでした。
for文でできますよ。
コード:
#include <stdio.h>
int UP[7] = { 1, 2, 3, 7, 8, 9, 11 };
int main(void)
{
int x, i;
while (printf("x: "), scanf("%d", &x) == 1) {
for (i = 0; i < 7; i++)
if (UP[i] == x) break;
if (i < 7)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}
DayDreamer さんが書きました:
最悪総当たりで書いてしまおうかと思ってはいるのですが、スマートな解決方がありましたらご教授いただけると幸いです。
配列が昇順に並んでいるなら、二分探索でできますよ。
コード:
#include <stdio.h>
int UP[7] = { 1, 2, 3, 7, 8, 9, 11 };
int binary_search(int x)
{
int left = 0, right = 7 - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (UP[mid] < x) left = mid + 1;
else if (UP[mid] > x) right = mid - 1;
else return mid;
}
return -1;
}
int main(void)
{
int x;
while (printf("x: "), scanf("%d", &x) == 1) {
int i = binary_search(x);
if (i >= 0)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}
Re: 配列と条件式
Posted: 2017年7月31日(月) 13:18
by かずま
プログラム中に 7 と書くのはあまりよくないので、
配列の宣言を次のようにし、プログラム中の 7 は N に変更してください。
コード:
int UP[] = { 1, 2, 3, 7, 8, 9, 11 };
const int N = sizeof(UP) / sizeof(UP[0]);
二分探索はすごいですよ。
配列の要素数が 100個でも 8回の比較で探索が終了しますし、
1000個でも 10回で済みます。
ところで、プログラムは理解できましたか?
Re: 配列と条件式
Posted: 2017年7月31日(月) 13:36
by Daydreamer
早い返信ありがとうございます。
break使ってfor構文抜けた時のiの値で判定する、ということでいいんでしょうか。目から鱗が落ちた気分です。
あとDXライブラリ使ってるということを書き忘れたことに今気づきましたが、言語関係なくいけそうでよかったです。
二分探索は便利だという話はよく聞くんですが…正直よくわかってな、アッハイ勉強します…
Re: 配列と条件式
Posted: 2017年8月01日(火) 12:37
by かずま
Daydreamer さんが書きました:
break使ってfor構文抜けた時のiの値で判定する、ということでいいんでしょうか。目から鱗が落ちた気分です。
break を使わずに書くこともできます。
コード:
#include <stdio.h>
int UP[] = { 1, 2, 3, 7, 8, 9, 11 };
const int N = sizeof(UP) / sizeof(UP[0]);
int main(void)
{
int x, i;
while (printf("x: "), scanf("%d", &x) == 1) {
for (i = 0; i < N && UP[i] != x; i++) ;
if (i < N)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}