3

これは初心者の質問です。という配列があり、次のCounter[N][N]ようなことをしたい:

While (each element of Counter < 10000) {do something}

While (there exists an element of Counter < 10000) {do something}

Cでそれを行う簡単な方法はありますか?

4

8 に答える 8

2

この関数は、渡されたカウンター配列に指定された値より小さい要素があるかどうかをテストします。

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 を使用していることに注意してください。ループ外で宣言するijC89コードになります。また、何らかの理由でループの後にior j(または、おそらく両方) が必要な場合は、ループの外側で変数を宣言する必要があります。

forループを使用した 2 番目のソリューションは、より慣用的な C です。forループはこの仕事に非常に適しており、使用を計画する必要があります。特に、初期化コードが 1 行 (ループの外側) にあるループ ソリューションとは異なり、すべてのループ コントロールが 1 行にパッケージ化whileされているためです。別の条件、およびさらに 3 行目の再初期化。

于 2012-09-22T15:36:20.137 に答える
2

あなたができる

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]
        }
    }
}
于 2012-09-22T15:37:28.300 に答える
1

すべての要素が 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 が#defined N の配列として宣言されている場合、私のソリューションは Jonathan のソリューションで減衰します。

于 2012-09-22T15:40:39.200 に答える
1

これはポインタでうまく行うことができます

  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;

  }
于 2012-09-22T15:33:56.800 に答える
0

編集済みの質問の解決策

    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 を使用する必要があります。

于 2012-09-22T15:56:13.660 に答える
0

あなたはc#を求めていませんでしたが、とても簡単なのでc#のソリューションを以下に示します:

    var Counter = new int[N,N];
    while(Counter.Cast<int>.Any(i => i < 10000)) { dosomething(); } 
于 2012-09-22T16:02:00.360 に答える
0

ネストされた for ループを使用する

for(i=0;i<N;i++)
for(j=0;j<N;j++){

if(counter[i][j]<10000)
{
//Do something
}
}
于 2012-09-22T15:36:00.707 に答える
0

これはどうですか?

 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;
        }
于 2012-09-22T15:36:03.513 に答える