重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

for (i = 1; (i < 16) && (c[n[i]] == 0); i++){
c[n[i]] = 1;
}
上記のような文法がありました。c[n[i]]で使われてる[[]]の意味がちょっと分かりません。
出来れば上記のような文の条件を説明していただけませんか?
宜しくお願いします。

A 回答 (6件)

No4 補足


> (c[n[i]] == 0)というところの条件の意味と
> 1を代入することで何が変わってくるかが分かりませんでした。

最初、まだ設定してないという印にc[]の内容を全て0に初期化しているかと思います。
c[x]=1とする事で添字xは使ったって印を変えてます。

c[y]に入っている値が0ならアクセスされてないのでそれに関する処理を行い、c[y]=1とする事でyは処理済みと更新する時などに使う方法(一度設定したら次回からはアクセスする必要がない)かと思います。
    • good
    • 0

> printfで全ての値を出力してみてみました。



全部出したらだめです。
横着をせずに、ループのたび毎にどう変わるか一つ一つ手で確認しましょう。
    • good
    • 0

> 上記のところでどのようにして重ならないのを表示するようにしているのかがイマイチ分かりません。



紙に(Excel とかでもいい)

n[0] から n[15] と、
c[0] から c[15] を書いてみて、

n[0] から n[15] にいろいろな値(全部違うとか、全部同じとか)を書いて、
その上で、ループを追いかけてみましょう。

この回答への補足

printfで全ての値を出力してみてみました。
for文内の回す条件で(i < 16) && (c[n[i]] == 0)というところの条件の意味と
1を代入することで何が変わってくるかが分かりませんでした。

補足日時:2011/08/04 12:29
    • good
    • 0

> できれば以下の文に修正した書き方を書いていただけませんか?



int t;
として、

for(i = 1; (i < 16) && (t = n[i], c[t] == 0))
{
t = n[i];
c[t];
}

この回答への補足

何度もすみません。
以下のようなプログラムが隣と隣の数を引き、引いた数が下の段に行き、全ての数が重ならない組み合わせ
(1~15の数値一回のみ)を表示しています。
for (i = 1; (i < 16) && (c[n[i]] == 0); i++){
c[n[i]] = 1;
}
上記のところでどのようにして重ならないのを表示するようにしているのかがイマイチ分かりません。教えていただけないでしょうか?
下記にプログラムを載せます。
#include <stdio.h>

int main(void)
{
int i,j,x,t;
intn[16];
intc[16];
intcheck = 0;

for (n[1] = 1; n[1] <= 15; n[1]++) {
for (n[2] = 1; n[2] <= 15; n[2]++) {
for (n[3] = 1; n[3] <= 15; n[3]++) {
for (n[4] = 1; n[4] <= 15; n[4]++) {
for (n[5] = 1; n[5] <= 15; n[5]++) {

n[6] = (n[1] - n[2]);
if(n[6] < 0){
n[6] = -n[6];
}
n[7] = (n[2] - n[3]);
if(n[7] < 0){
n[7] = -n[7];
}
n[8] = (n[3] - n[4]);
if(n[8] < 0){
n[8] = -n[8];
}
n[9] = (n[4] - n[5]);
if(n[9] < 0){
n[9] = -n[9];
}
n[10] = (n[6] - n[7]);
if(n[10] < 0){
n[10] = -n[10];
}
n[11] = (n[7] - n[8]);
if(n[11] < 0){
n[11] = -n[11];
}
n[12] = (n[8] - n[9]);
if(n[12] < 0){
n[12] = -n[12];
}
n[13] = (n[10] - n[11]);
if(n[13] < 0){
n[13] = -n[13];
}
n[14] = (n[11] - n[12]);
if(n[14] < 0){
n[14] = -n[14];
}
n[15] = (n[13] - n[14]);
if(n[15] < 0){
n[15] = -n[15];
}

for (i = 1; i < 16; i++){//配列c[]を0に初期化//
c[i] = 0;
}

for (i = 1; (i < 16) && (c[n[i]] == 0); i++){//iが15以下でc[a[i]]が0なら//
c[n[i]] = 1;//c[n[i]]に1を代入//
}

if (i < 16) continue;

printf("%2d %2d %2d %2d %2d\n", n[1], n[2], n[3], n[4], n[5]);
printf(" %2d %2d %2d %2d\n", n[6], n[7], n[8], n[9]);
printf(" %2d %2d %2d\n", n[10], n[11], n[12]);
printf(" %2d %2d\n", n[13], n[14]);
printf(" %2d\n", n[15]);
printf("\n");
}
}
}
}
}
return 0;
}

補足日時:2011/08/04 10:08
    • good
    • 0

そんな難しい話ではありません。



c[n[i]]というのは、次のように分解すればすぐに理解できるはずです。

t = n[i];
c[t]

この回答への補足

早急な回答ありがとうございます。
できれば以下の文に修正した書き方を書いていただけませんか?
宜しくお願いします。
for (i = 1; (i < 16) && (c[n[i]] == 0); i++){
c[n[i]] = 1;
    
}

補足日時:2011/08/04 09:31
    • good
    • 0

配列c[]の中の配列n[i]、って事ではないんでしょうか?(間違ってるかもしれませんが)

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!