ページ 11

課題についての質問です。

Posted: 2011年6月05日(日) 19:50
by keiji
法則性といったものが理解できず、困っています。
n = 3 を入力した場合
*
**
***
* *
** **
******
* * *
** ** **
*********

n = 4 の場合は、
*
**
***
****
* *
** **
*** ***
********
* * *
** ** **
*** *** ***
************
* * * *
** ** ** **
*** *** *** ***
****************

を表示するプログラムです。
分かる方がいましたらよろしくお願いします。

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 20:10
by bitter_fox
keiji さんが書きました:法則性といったものが理解できず、困っています。
色付けしてみました。恐らくこれで分かるはずです。

n=3
*
**
***
* *
** **
******
* * *
** ** **
*********

n=4
*
**
***
****
* *
** **
*** ***
********
* * *
** ** **
*** *** ***
************
* * * *
** ** ** **
*** *** *** ***
****************

[hr][追記]
スペースの数がシステムの都合上分からないので別途記しました。

コード:

n = 3
*
**
***
*__*   // スペース:2個
**_**  // スペース:1個
****** // スペース:0個
*__*__*
**_**_**
*********

コード:

n = 4
*
**
***
****
*___*    // スペース:3個
**__**   // スペース:2個
***_***  // スペース:1個
******** // スペース:0個
(略)

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 20:16
by a5ua
半角スペースが表示上消えているようですが、以下の表示でよろしいでしょうか?

コード:

*
**
***
****
*   *
**  **
*** ***
********
*   *   *
**  **  **
*** *** ***
************
*   *   *   *
**  **  **  **
*** *** *** ***
****************
codeタグを使えば、きれいに表示できます。

コード:

*
**
***
****
この三角形が一塊になっていることは、わかるでしょうか?

また、問題を少し簡単にして、(☆)
n = 2のとき、

コード:

* *
****
n = 3のとき、

コード:

*  *  *
** ** **
*********
と表示するプログラムは書けますか?

(編集履歴)
(☆)以降を変更しました。

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 20:34
by keiji
返信ありがとうございます。
スペースが足りてませんでした。
申し訳ないです。

三角形の塊まではできるのですが、
それ以下の表示の仕方がよく分からないです。

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 21:07
by keiji
スペースの入れ方などちょっと分からないので、
もう少し時間が掛かりそうです。

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 21:21
by bitter_fox
keiji さんが書きました:スペースの入れ方などちょっと分からないので、
もう少し時間が掛かりそうです。
スペースの入れ方が分からないというのは、スペースの個数が分からないのでしょうか?
それともプログラミング的にスペースを表示する方法が分からないのでしょうか?

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 21:32
by keiji
スペースを入れた後にまた*を入れるのか、
ある始点を決めてそこから、*を連続させているのか
という感じです。
根本から分かっていないため、この文の内容すら理解不可能かもしれません。
よろしくお願いします。

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 22:08
by bitter_fox
keiji さんが書きました:スペースを入れた後にまた*を入れるのか、
ある始点を決めてそこから、*を連続させているのか
という感じです。
根本から分かっていないため、この文の内容すら理解不可能かもしれません。
よろしくお願いします。

コード:

n = 4
*___
**__
***_
****
*___*___
**__**__
***_***_
********
(略)
と常に末尾にいくつかのスペースを挟んで表現する方法と、(スペースは実際の表現上見えないのでこの方法が通用します。)

コード:

n = 4
1段目
*
**
***
****
2段目
*___*
**__**
***_***
********
1個目2個目
(略)
p段目のp個目の時はスペースを挟まずにそれ以外の時だけいくつかのスペースを挟んで表現する方法の二つのアプローチがあります。

手抜きをするなら1つ目のアプローチ、課題の完成度の確実さを目指すなら2つ目のアプローチをお勧めします。(と言っても分岐一つしか違いはありませんが・・・w)

またスペースの個数は、mを行数として次のようになり
全て2段目
n = 1 (n = 1は課題の答えとなるプログラムを実行しても表示されません)

コード:

m
1:** // スペース0個
スペース:0

n = 2

コード:

m
1:* *  // スペース1個
2:**** // スペース0個
スペース:1, 0

n = 3

コード:

m
1:*  *   // スペース2個
2:** **  // スペース1個
3:****** // スペース0個
スペース:2, 1, 0

n = 4

コード:

m
1:*   *    // スペース3個
2:**  **   // スペース2個
3:*** ***  // スペース1個
4:******** // スペース0個
スペース:3, 2, 1, 0
これらから、スペースの個数とnとmの関係を調べれば求まります。

(考えの都合上1オリジンになっています。)

Re: 課題についての質問です。

Posted: 2011年6月05日(日) 22:40
by keiji
ありがとうございます。
考えてみます。

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 00:29
by keiji
どうも、ある個数のスペースのあけ方と
そこからまた*を置く方法がわかりません。。

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 00:49
by bitter_fox
keiji さんが書きました:どうも、ある個数のスペースのあけ方と
そこからまた*を置く方法がわかりません。。
ある個数の*を置けたのであれば同じ方法で実現できますよ。

再び*を置いていくにはループを使用してください。

ソースコードを張っていただくともう少し詳しく言えるのですか・・・

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 00:58
by keiji
すいません。
<code>
#include<stdio.h>
int main(void)
{
int n, i, j;
printf("n = ");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
for (j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
</code>
でずっと止まったままです。
2段目以降はまったくで、、、

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 08:50
by non
スペースを空けると考えるより、スペースを出力すると考えます。
下のプログラムはスペースの代わりにoを出力してます。
forの中を完成させてみてください。

コード:

#include<stdio.h>
int main(void)
{
	int n, i, j;
	printf("n = ");
	scanf("%d", &n);
	for (i = 1; i <= n; i++) { 
		for (j = 1; j <= i; j++) {
			printf("*"); 
		}
		for (             ) {
			printf("o"); 
		} 
		printf("\n");
	}
	return 0;
}
 
n = 4
*ooo
**oo
***o
****

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 19:28
by keiji

コード:

#include<stdio.h>
int main(void)
{
    int n, i, j;
    printf("n = ");
    scanf("%d", &n);
    for (i = 1; i <= n; i++) { 
        for (j = 1; j <= i; j++) {
            printf("*"); 
        }
        for (j = 1;j<=n - i; j++) {
            printf("o"); 
        } 
        printf("\n");
    }
    return 0;
}
でどうでしょうか?

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 20:05
by non
いいですよ。
次に、この図形をn回繰り返すように、してみてください。カウンタ変数を例えばkにしましょう。
n = 3
*oo
**o
***
*oo
**o
***
*oo
**o
***
これができたら、k回目の図形は改行するまでに、この1行の図形をk回繰り返せば良いので、ふたたびforで囲みます。
じゃ、がんばって。

Re: 課題についての質問です。

Posted: 2011年6月06日(月) 22:48
by keiji

コード:

#include<stdio.h>
int main(void)
{
    int n, i, j, k,l;
    printf("n = ");
    scanf("%d", &n);
 for(l = 1; l < n; l++){ 
 for(k = 1; k <= n; k++){ 
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= i; j++) {
            printf("*"); 
        }
        for (j = 1;j<=n - i; j++) {
            printf("o"); 
        } 
   printf("\n");
 
    }
  }
 }
    return 0;
}
ここまで来たのですが、分岐条件と
それのいれどころがイマイチ分からないです。

Re: 課題についての質問です。

Posted: 2011年6月07日(火) 09:01
by non
>これができたら、k回目の図形は改行するまでに、この1行の図形をk回繰り返せば良いので、ふたたびforで囲みます。
説明の仕方が悪かったみたいですね。
1行を表示する部分をk回繰り返すのです。もちろん改行は最後に1回。

コード:

#include<stdio.h>
int main(void)
{
	int n, i, j, k,l;
	printf("n = ");
	scanf("%d", &n);

	for(k = 1; k <= n; k++){ 
		for (i = 1; i <= n; i++) {
			//ここからの部分が一行を表示している
			for (j = 1; j <= i; j++) {
				printf("*"); 
			}
			for (j = 1;j<=n - i; j++) {
				printf("o"); 
			} 
			printf("\n");
			//この改行までが一行
		}
	}
	return 0;
}

Re: 課題についての質問です。

Posted: 2011年6月07日(火) 16:32
by keiji

コード:

#include<stdio.h>
int main(void)
{
    int n, i, j, k,l;
    printf("n = ");
    scanf("%d", &n);
 for(l = 1; l < n; l++){ 
 for(k = 1; k <= n; k++){ 
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= i; j++) {
            printf("*"); 
        }
        for (j = 1;j<=n - i; j++) {
            printf("o"); 
        } 
   printf("\n");
 
    }
 
  }
 }
    return 0;
}
だと、

コード:

*oo
**o
***
*oo
**o
***
*oo
**o
***
*oo
**o
***
*oo
**o
***
*oo
**o
***
で止まってしまいます。
直角三角形状までもっていく条件がうまくいきません。

Re: 課題についての質問です。

Posted: 2011年6月07日(火) 16:44
by non
なぜ、No,17にプログラムを添付したのに、また、No,16のプログラムと同じものを添付するの?

Re: 課題についての質問です。

Posted: 2011年6月07日(火) 20:40
by keiji
申し訳ございません。
NO.17のプログラムですと、

コード:

*oo
**o
***
*oo
**o
***
*oo
**o
***
になります。
ここから横に2個、3個と並べて

コード:

*
**
***
*  *   
** **  
****** 
*  *  *
** ** **
********* 
までもっていくための+αに困っています。
初心者のため無知なものですから、
失礼な質問でしたらすいません。

Re: 課題についての質問です。

Posted: 2011年6月08日(水) 10:43
by bitter_fox
keiji さんが書きました:

コード:

#include<stdio.h>
int main(void)
{
    int n, i, j, k,l;
    printf("n = ");
    scanf("%d", &n);
 for(l = 1; l < n; l++){ 
 for(k = 1; k <= n; k++){ 
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= i; j++) {
            printf("*"); 
        }
        for (j = 1;j<=n - i; j++) {
            printf("o"); 
        } 
   printf("\n");
 
    }
  }
 }
    return 0;
}
ここまで来たのですが、分岐条件と
それのいれどころがイマイチ分からないです。
実はかなり良い所まで行けています。
変数名といくつかのコメントを補っておきましたので、???を埋めてみてください。(printf("\n")も三つの内から適切なものを選んでください)
それぞれのforの意図と変数の持つ意味を考えると分かりやすいでしょう。

コード:

#include <stdio.h>

int main()
{
	int n, i, j, starCount, blockCount;


	printf("n = ");
	scanf("%d", &n);

	for (blockCount = 1; blockCount <= n; blockCount++) // 出力しようとしているブロック数
	{
		for (starCount = 1; starCount <= n; starCount++) // 出力しようとしている1セット(**ooなど)の*の数
		{
			for (i = 1; i <= ???; i++) // 一行について何セット出力するか(セット数 == 出力しようとしているブロック数)
			{
				for (j = 1; j <= ???; j++) // 1セット分の*を出力
				{
					printf("*");
				}
				for (j = 1; j <= n - ???; j++) // 1セット分のスペース(o)を出力
				{
					printf("o");
				}
				//printf("\n");
			}
			//printf("\n");
		}
		//printf("\n");
	}
}

[hr][修正]
nの入力処理を忘れてたので修正しました

Re: 課題についての質問です。

Posted: 2011年6月08日(水) 17:04
by keiji
できました!
これでどうでしょうか?

コード:

#include <stdio.h>
 
int main()
{
    int n, i, j, starCount, blockCount;
 
 
    printf("n = ");
    scanf("%d", &n);
 
    for (blockCount = 1; blockCount <= n; blockCount++) // 出力しようとしているブロック数
    {
        for (starCount = 1; starCount <= n; starCount++) // 出力しようとしている1セット(**ooなど)の*の数
        {
            for (i = 1; i <= blockCount; i++) // 一行について何セット出力するか(セット数 == 出力しようとしているブロック数)
            {
                for (j = 1; j <= starCount; j++) // 1セット分の*を出力
                {
                    printf("*");
                }
                for (j = 1; j <= n - starCount; j++) // 1セット分のスペース(o)を出力
                {
                    printf(" ");
                }
                //printf("\n");
            }
            printf("\n");
        }
        //printf("\n");
    }

 return 0;
}

コード:

n = 3
*
**
***
*  *
** **
******
*  *  *
** ** **
*********

Re: 課題についての質問です。

Posted: 2011年6月08日(水) 19:04
by bitter_fox
keiji さんが書きました:できました!
これでどうでしょうか?

コード:

n = 3
*
**
***
*  *
** **
******
*  *  *
** ** **
*********
いいですね。

ちょっと発展して、一行の末尾にスペースが含まれないようなものを作って見ても良いでしょう。

Re: 課題についての質問です。

Posted: 2011年6月08日(水) 19:36
by keiji
ありがとうございます。
末尾を消すのはなかなか難しそうです。
ご協力のおかげで、なんとか課題の1つをクリアできました。
自分の無知さゆえ、かなりの時間がかかってしまいましたが、
最後まで付き合っていただき、本当にありがとうございます。
機会があればまたアドバイスいただければ幸いです。