ページ 1 / 1
課題についての質問です。
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は課題の答えとなるプログラムを実行しても表示されません)
スペース: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つをクリアできました。
自分の無知さゆえ、かなりの時間がかかってしまいましたが、
最後まで付き合っていただき、本当にありがとうございます。
機会があればまたアドバイスいただければ幸いです。