質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

915閲覧

プログラムの挙動について

atail

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/05 02:36

前提・実現したいこと

学校の課題なのですが、このプログラムの挙動が理解できません。
プログラム内容を解説してほしいです。

該当のソースコード

C言語

#include <stdio.h>
#include <stdlib.h>

#define MAX_N (29)

int check_and_set(unsigned int mat[], int n, int row, int col)
{
int i, j, c = 0;

/* Horizontal */ for (j = col - 1; j >= 0; j--) { if (mat[j] & (1U << row)) { return c; } } /* Obliquely upward */ for (i = row - 1, j = col - 1; j >= 0 && i >= 0; j--, i--) { if (mat[j] & (1U << i)) { return c; } } /* Diagonally downward */ for (i = row + 1, j = col - 1; j >= 0 && i < n; j--, i++) { if (mat[j] & (1U << i)) { return c; } } /* Set */ mat[col] = 1 << row; if (col == n - 1) { /* Completed */ c++; } else { /* Set remain columns */ for (i = n - 1; i >= 0; i--){ c += check_and_set(mat, n, i, col + 1); } } mat[col] = 0U; return c;

}

int main(int argc, char *argv[])
{
unsigned int mat[MAX_N], n;
int i, count = 0;

/* check argument */ if (argc < 2) { fprintf(stderr, "USAGE: %s number\n", argv[0]); return -1; } /* obtain n */ n = atoi(argv[1]); if ((n < 2) || (n > MAX_N)) { fprintf(stderr, "You should specify a number " "between 2 and %d.\n", MAX_N); return -1; } /* initialize */ for (i = 0; i < n; i++) mat[i] = 0U; /* query */ for (i = n - 1; i >= 0; i--){ count += check_and_set(mat, n, i, 0); } printf("Total Answer for %d x %d = %d\n", n, n, count); return 0;

}

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/12/05 02:39

そのプログラムを走らせたときは、どういう挙動になるんでしょうか
dice142

2018/12/05 02:42

せめてどこがわからないか絞ってください。for文ってなんですかってレベルではないでしょう?
PineMatsu

2018/12/05 08:09

プログラムを動作させる環境があるのなら実行してみるのが一番。自前ではなくてもネット上で動作確認できるサイトがあります。
guest

回答3

0

それを先生に聞く為に学費を払っているのではないでしょうか。
授業を聞いていなかったために聞くのがはばかられるのであれば、まず最低限の学習をしてください。

投稿2018/12/05 02:59

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コメントが入っていますが、それらは確認しました?

英単語みたいですが、日本語にするだけでも、結構、流れが見えませんか?

投稿2018/12/05 12:17

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

usr~/test/c % ./a.out 3
Level1
Level2
Level3
Level1
Level2
Level1
Level2
Level3
Level1
Level4
Level4
Level1
Level2
Level3
Level1
Level1
Level2
Level4
Level1
Level2
Level3
Level1
Level2
Level3
Level1
Level2
Level4
Level1
Level4
Total Answer for 3 x 3 = 0
usr~/test/c % cat s2.c

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define MAX_N (29) 5 6int check_and_set(unsigned int mat[], int n, int row, int col) 7{ 8 int i, j, c = 0; 9 10 /* Horizontal */ 11 for (j = col - 1; j >= 0; j--) { 12 if (mat[j] & (1U << row)) { 13 return c; 14 } 15 } 16 puts("Level1"); 17 18 /* Obliquely upward */ 19 for (i = row - 1, j = col - 1; j >= 0 && i >= 0; j--, i--) { 20 if (mat[j] & (1U << i)) { 21 return c; 22 } 23 } 24 puts("Level2"); 25 26 /* Diagonally downward */ 27 for (i = row + 1, j = col - 1; j >= 0 && i < n; j--, i++) { 28 if (mat[j] & (1U << i)) { 29 return c; 30 } 31 } 32 puts("Level3"); 33 34 /* Set */ 35 mat[col] = 1 << row; 36 37 if (col == n - 1) { 38 /* Completed */ 39 c++; 40 } else { 41 /* Set remain columns */ 42 for (i = n - 1; i >= 0; i--) { 43 c += check_and_set(mat, n, i, col + 1); 44 } 45 } 46 puts("Level4"); 47 48 mat[col] = 0U; 49 50 return c; 51} 52 53int main(int argc, char *argv[]) 54{ 55 unsigned int mat[MAX_N], n; 56 int i, count = 0; 57 58 /* check argument */ 59 if (argc < 2) { 60 fprintf(stderr, "USAGE: %s number\n", argv[0]); 61 return -1; 62 } 63 64 /* obtain n */ 65 n = atoi(argv[1]); 66 if ((n < 2) || (n > MAX_N)) { 67 fprintf(stderr, 68 "You should specify a number " 69 "between 2 and %d.\n", 70 MAX_N); 71 return -1; 72 } 73 74 /* initialize */ 75 for (i = 0; i < n; i++) 76 mat[i] = 0U; 77 78 /* query */ 79 for (i = n - 1; i >= 0; i--) { 80 count += check_and_set(mat, n, i, 0); 81 } 82 83 printf("Total Answer for %d x %d = %d\n", n, n, count); 84 85 return 0; 86} 87

投稿2018/12/05 06:17

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/12/05 07:28

この位の努力はしましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問