プログラム文の処理内容について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C言語入門者

プログラム文の処理内容について

#1

投稿記事 by C言語入門者 » 14年前

以下のプログラムについて質問です。
以下のプログラムは隣同士の数字の差を下の段に表示しています。
決まりで同じ数字は一度しか使えません。
上記のプログラムの結果を表示していますが、最後の出力結果の前にある以下の文の行ってる意味が分かりません。

コード:

			for (i = 1; i < 16; i++){								//配列c[]を0に初期化//
  				check[i] = 0;
			}
		
			for (i = 1; (i < 16) && (check[n[i]] == 0); i++){			//1から15以内でcheck[n[i]が0になるまで//
				check[n[i]] = 1;								//c[n[i]]に1を代入//
                 }


			if (i < 16) continue;

上記の処理を行うことで、なぜ同じ数字を使ってない結果を表示することが出来るのでしょうか?
教えていただけないでしょうか?

コード:

#include <stdio.h>
 
int main(void)
{
  int   i,j,x,t;
  int	n[16];
  int	check[16];
  
  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に初期化//
  				check[i] = 0;
			}
		
			for (i = 1; (i < 16) && (check[n[i]] == 0); i++){			//1から15以内でcheck[n[i]が0になるまで//
				check[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;
}

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: プログラム文の処理内容について

#2

投稿記事 by 沖 滉均 » 14年前

毎度の事ですが、フォーラムルールを読む気はありませんか?
それとも、ルールを読んでも意味がわかりませんか?

こちらでも同じ質問をしているようですし、マルチポストならば相互リンクをと再三言われているはずです。
http://oshiete.goo.ne.jp/qa/6920262.html
There is no royal road to learning.
codeタグで指定できる言語
画像

C言語入門者

Re: プログラム文の処理内容について

#3

投稿記事 by C言語入門者 » 14年前

すみません。
マルチポストの意味が分かりませんでした。
誠に申し訳ありませんでした。以後、気をつけます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: プログラム文の処理内容について

#4

投稿記事 by softya(ソフト屋) » 14年前

忠告として、なにか闇雲に質問して答えを貰ったらよく理解せずベストアンサーを付けているようですが本質的な理解をしないと何時迄経ってもレベルアップ出来ませんよ。
理解できたら始めてベストアンサーを付けて、分からなかったら補足質問すべきです。

あとprintfなどでnを表示してみたりすると理解できるかも知れません。

すくなくとも
for (i = 1; (i < 16) && (check[n] == 0); i++){ //1から15以内でcheck[nが0になるまで//
check[n] = 1; //c[n]に1を代入//
     }

は初心者が使うテクニックではありません。会社とかの課題なら確実に誰かに答えを聞いたのがバレます。
自分なりの処理に置き換えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る