• ベストアンサー

関数がうまく作れません。

okame5131 C言語をやり始めたばかりなのですが、関数がよく理解できず困っています。 関数で*(アスタリスク)とスペースを使って*マークの図形を出力するというプログラムを作ろうと思っているのですが、うまくできません。 visual studio 2005でプラグラムを作り、デバック無しで実行すると http://www.dejavu.jp/~webmaster/upbbs/users/test/img/1215012104.jpgのようなアスタリスクの形を作るにはどうしたらいいでしょうか? 私はこの図形を上の部分、真ん中、したの部分に分けて考えて、 色々な関数を組み合わせて*の形作りたいのですが・・・。 自分で途中まで作ってみたのですが、訳が分からなくなってきました。 自分で作ったやつは(関数部分だけです) void hoshi(int n) { int i1,i2,cnt,j; //n=辺 i=行 j=数     n1=0 n2=n for(cnt=1;cnt<=n;cnt++) { for(j=1;j<=2;j++) { printf("* "); まで作ったのですが、混乱してきました。 どなたか*を作るためのプログラムを教えていただけませんか? また、作る際のアドバイスがあったらお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.3

ANo.1です。 こういったプログラムにおいては、 (1)点を出力する場所はどこか?と考えるのではなく、 (2)ある場所は*を出力すべきか?と逆の発想の方が良いですよ。 以下、ANo.1の後半にも書きましたがアルゴリズム(考え方)になります。 N=奇数限定との事ですので、N*Nの正方形を考えます。 便宜上、左上を(1,1)、右下を(N,N)という座標をとります。 これらの座標1つ1つ(X=1~N,Y=1~Nとしてループを2重に利用)において、*か□(空白)かを判定していけばいいわけです。 *となる点は、十字を作る部分か、X字を作る部分かのどちらかになります。 十字となる座標は、 X,Yのいずれかが中心(N=5なら2,N=7なら3)となる座標です。 ×字となる座標は、 X=Y(左上→右下のライン)か、X+Y=N+1(左下→右上のライン)となる座標です。 これをプログラムとして実現させればよいと思います。 自分Cのソースは読める程度などで関数は適当ですが、こんな感じ? // C=中央を求める。 C=(N+1)/2 // (X,Y)座標を1点ずつループさせる(X:左→右,Y:上→下) FOR(Y=1~N)  A="" //出力用の変数  FOR(X=1~N)   // *か□かの判定   IF (X=C OR Y=C OR X=Y OR X+Y=N+1)    A=A+"*"   ELSE    A=A+" "(空白)   END(IFの終わり)  NEXT(XのFORの終わり)  PRINT A NEXT(YのFORの終わり)

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.4

> 関数がよく理解できず困っています。 引数を2個とり、それらの和を返す関数は書けますか?

すると、全ての回答が全文表示されます。
noname#75489
noname#75489
回答No.2

void hoshi(const unsigned int uiSize) { unsigned int uiCenter = (uiSize - 1) / 2; unsigned int uiDrawSize = (uiCenter * 2) + 1; char* pAst = (char *)malloc(uiSize + 1); for (unsigned int i=0; i<uiSize; i++) { if (i == uiCenter) { memset(pAst, '*', uiSize); } else { int uiSpcSize = (i < uiCenter) ? (uiCenter - i) : (i - uiCenter); memset(pAst, ' ', uiSize); pAst[uiCenter - uiSpcSize] = '*'; pAst[uiCenter] = '*'; pAst[uiCenter + uiSpcSize] = '*'; } pAst[uiSize] = 0x00; printf("%s\n", pAst); } free(pAst); }

すると、全ての回答が全文表示されます。
  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.1

質問 入力する2~9は縦横の行・列数と考えてよろしいでしょうか。 また、それぞれの場合、具体的にどのような図形を描きたいのか教えて頂けないでしょうか。 2,4,6など偶数の場合、2,3など行・列が少ない場合、どのような形を作ればよいかいまいちわかりません。 なんとなく、アルゴリズムだけで考えれば、 (1,1)~(n,n)まで順に処理し、 中央の場合、もしくは斜め一列の場合に「*」を打てばいいのかなぁ? 中央の場合は、頑張れ、n=偶数か奇数かで場合分け。 斜め一列の場合は、x=y または、x+y=n+1 なら、斜め一列になるような、ならないような。

okame5131
質問者

お礼

回答ありがとうございます。 入力した数が辺と行数になります。 分けて考えるのは、 真ん中だけ残して上の部分だけで台形の形を作りたいです。 * * * * * * *** 真ん中の*だけを出力させたいです。 ******** 下の台形だけ作りたいです *** * * * * * * 入力できるのは奇数だけと考え、偶数は考えません。

すると、全ての回答が全文表示されます。

関連するQ&A