これは初心者の質問です。という配列があり、次のCounter[N][N]
ようなことをしたい:
While (each element of Counter < 10000) {do something}
While (there exists an element of Counter < 10000) {do something}
Cでそれを行う簡単な方法はありますか?
これは初心者の質問です。という配列があり、次のCounter[N][N]
ようなことをしたい:
While (each element of Counter < 10000) {do something}
While (there exists an element of Counter < 10000) {do something}
Cでそれを行う簡単な方法はありますか?
この関数は、渡されたカウンター配列に指定された値より小さい要素があるかどうかをテストします。
bool has_element_less_than(int value, int counter[N][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (counter[i][j] < value)
return true;
}
}
return false;
}
あなたはそれを使用します:
if (has_element_less_than(10000, counter))
do_something();
N をパラメーターとして関数に渡すことにより、C99 で可変次元配列を処理できます。C99 ヘッダーが<stdbool.h>
利用可能で含まれていることを前提としています。
これはあなたが求めているものですか?「While」に言及しているため、ループを使用する必要があるかどうかは明確ではありません。使用するwhile
場合は、これでうまくいくと思います。
int i = 0;
while (i < N)
{
int j = 0;
while (j < N)
{
if (counter[i][j] < 10000)
{
counter[i][j] = do_something(i, j, counter[i][j]);
}
j++;
}
i++;
}
または、より口語的ですが、for
ループを使用します。
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (counter[i][j] < 10000)
{
counter[i][j] = do_something(i, j, counter[i][j]);
}
}
}
このコードは C99 を使用していることに注意してください。ループ外で宣言するi
とj
C89コードになります。また、何らかの理由でループの後にi
or j
(または、おそらく両方) が必要な場合は、ループの外側で変数を宣言する必要があります。
for
ループを使用した 2 番目のソリューションは、より慣用的な C です。for
ループはこの仕事に非常に適しており、使用を計画する必要があります。特に、初期化コードが 1 行 (ループの外側) にあるループ ソリューションとは異なり、すべてのループ コントロールが 1 行にパッケージ化while
されているためです。別の条件、およびさらに 3 行目の再初期化。
あなたができる
for(int x = 0; x < N; x++) {
for(int y = 0; y < N; y++) {
if (Counter[x][y] < 10000){
//Do something with Counter[x][y]
}
}
}
すべての要素が 10000 未満の場合に 1 を返す関数を作成できれば簡単です。
int check_array_lt(int row_count, int col_count, int** array, int value)
{
int i,j;
for(i=0;i<row_count;i++)
for(j=0;j<row_count;j++)
if (array[i][j]>=value)
return 0;
return 1;
}
それを使用します:
while( check_array_lt(N,N,counter,10000) ) {
do something
}
質問の2番目のバージョンの場合(「各要素<10000」ではなく、「少なくとも1つの要素<10000」):
int check_array_lt_atleast(int row_count, int col_count, int** array, int value)
{
int i,j;
for(i=0;i<row_count;i++)
for(j=0;j<row_count;j++)
if (array[i][j]<value)
return 1;
return 0;
}
Jonathan Leffler が述べたように、このソリューションは配列が動的に作成された場合にのみ機能します。Counter が#define
d N の配列として宣言されている場合、私のソリューションは Jonathan のソリューションで減衰します。
これはポインタでうまく行うことができます
while(true)
{
int* pEnd = &Counter[0][0] + N*N;
int* pCurrent = &Counter[0][0];
bool AnyLess = false;
while(pCurrent < pEnd && !AnyLess) { AnyLess |= *pCurrent++ < 10000; }
if(!AnyLess)
break;
}
編集済みの質問の解決策
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(counter[i][j]<10000)
{
//Do something
}else
goto OUT;
}
OUT:
printf("out of loops");
私の傲慢な意見では
後藤
ステートメントは、プログラミング言語で最も洗練された構造です。ビル・ゲイツのように億万長者になりたい人は、道を切り開くソフトウェアを開発する際に、何度も何度も goto を使用する必要があります。
あなたはc#を求めていませんでしたが、とても簡単なのでc#のソリューションを以下に示します:
var Counter = new int[N,N];
while(Counter.Cast<int>.Any(i => i < 10000)) { dosomething(); }
ネストされた for ループを使用する
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(counter[i][j]<10000)
{
//Do something
}
}
これはどうですか?
int flag=0;
for(i=o;i<n;i++)
{
for(j=o;j<n;j++)
{
if(counter[i][j]<10000)
//statements;
else
{
flag=1;
break;
}
}
if(flag==1)
break;
}