- 締切済み
C言語について
#include_<stdio.h> void_gyouRtn(int_hen,int_ln,int_maxl); int_main(void){ __int___hen;__//_辺の長さ(文字数) __int___ln;___//_出力行番号(1,2,..,maxl) __int___maxl;_//_出力行数 __//_最初の入力 __printf("数字2~9を入力してください:"); __scanf("%d",_&hen); __//_規則外の入力への対応 __while(hen_<_2_||_hen_>_9){ ____printf("※入力エラー!!_2~9を入力してください:"); ____scanf("%d",_&hen); __} __//_計算と出力 __maxl_=_3*hen-2;_____________//_行数=3*辺の桁数-2 __for(ln=1;ln<=maxl;ln++)_{___//_行1から逐一実行 ____gyouRtn(hen,ln,maxl);_____//_行の一括処理出力 __} __//_終了 __return_0; } //_行ごとの出力半巾(桁)を与えます //_中心位置±半巾の位置に●を置く予定 int_maxkRtn(int_hen,int_ln,int_maxl){ __int___maxk;_//_半巾の文字数 __//_垂直辺を無視した巾 __if(ln<=maxl/2)_{__//_上半分のとき ____maxk_=_ln-1;____//_lnと共に増加、最初は0 __}_else_{__________//_下半分のとき ____maxk_=_maxl-ln;_//_lnと共に減少、最後は0 __} __//_垂直辺で切る __if(maxk>hen-1)_maxk_=_hen-1; __//_水平辺の半分を加える __maxk_+=_hen/2;____//_hen_が偶数ならmaxk*2==hen ____________________//_奇数なら_maxk*2_==_hen-1 __return_maxk; } //_行の準備と出力を制御、実行します void_gyouRtn(int_hen,int_ln,int_maxl){ __int_kt;___//_桁(文字)位置 __int_maxk;_//_行lnでの半巾、後に行の右端 __int_mink;_//_行での図形の左端位置 __int_cent;_//_縦の中心軸の位置 __maxk_=_maxkRtn(hen,ln,maxl);_//_この行での半巾 __if(hen==2*(hen/2))_{____//_辺が偶数桁 ____cent_=_maxl/2;________//_左半分の右端 ____mink_=_cent-maxk+1;___//_図形の左端 __}_else_{________________//_辺が奇数桁 ____cent_=_maxl/2+1;______//_左と右の間の1桁 ____mink_=_cent-maxk;_____//_図形の左端 __} __maxk_=_cent+maxk;_______//_図形の右端 __//_出力開始 __kt_=_1; __while(kt_<=_maxk){ ____if(1<ln_&&_ln<maxl)_{_//_上下辺以外 ______if(kt_!=_mink_&&_kt_!=_maxk){_//_図形位置以外 ________printf("□"); ______}else{________________________//_図形位置 ________printf("●"); ______} ____}_else_{______________//_上下辺 ______if(kt<mink)_{_________________//_図形位置以外 ________printf("□"); ______}_else_{______________________//_図形位置 ________printf("●"); ______} ____} ____kt++; __} __printf("\n"); } これは添付画像の八角形を表示するプログラムなのですが、これと同様のプログラムで添付画像の*形を表示するプログラムを教えてください。 (「同様」というのは、これ以上の"機能"を一切使わないという意味です。) mainの部分は上記のプログラムとほぼ同じなので大丈夫なのですが、下部の関数部分がわかりません。 関数部分で今考えているアルゴリズムは… (1)行ごとの出力桁数を与える(中心線±(n-1)/2) (2)1行目から中心行の前までは、左端・中心・右端に"●"を出力 (3)中心行には、n個だけ"●"を出力 (4)それ以降の行は、(2)と同じ …という感じです。 もちろん、(1)で出力桁数を与える時には、1行目~(n/2-1)行目までは左右1ずつ幅が減り、(n/2+1)行目~n行目までは左右1ずつ増えるようにします。 このアルゴリズムでプログラムを組みたいのですが、どうも難しくてできません。どうか教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- goosyu
- ベストアンサー率58% (36/62)
既に解決しているようなので参考までに・・・ ●を書く条件を次の様にわけて考えて 1.左上から右下 2.右上から左下 3.真ん中の列 4.真ん中の行 5.1~4の条件が一致しても,中心でかつ入力が偶数の場合は●を書かない #include <stdio.h> void gyouRtn2(int hen,int ln,int maxl); int main(void){ int hen; // 辺の長さ(文字数) int ln; // 出力行番号(1,2,..,maxl) int maxl; // 出力行数 // 最初の入力 printf("数字2~9を入力してください:"); scanf("%d", &hen); // 規則外の入力への対応 while(hen < 2 || hen > 9){ printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &hen); } // 計算と出力 maxl = (hen / 2 + 1) * 2 - 1;// 偶数も奇数同じサイズになるように計算 for(ln=1;ln<=maxl;ln++) { // 行1から逐一実行 gyouRtn2(hen,ln,maxl); // 行の一括処理出力 } // 終了 return 0; } // 行の準備と出力を制御、実行します void gyouRtn2(int hen,int ln,int maxl){ int kt; // 桁(文字)位置 int maxk; // 行lnでの半巾、後に行の右端 int cent; // 縦の中心軸の位置 cent = hen / 2 + 1; // 中心軸を求める if( cent == ln ){ // 中心軸 == 行の場合は最大値を設定 maxk = maxl; } else if ( maxl - ln + 1 > ln ) { // ●を表示される位置で大きい方を選ぶ maxk = maxl - ln + 1; }else{ maxk = ln; } // 出力開始 kt = 1; while( kt <= maxk ){ // ●の条件を全てOR(||)を使って列挙,●は左上から右下,右上から左下,kt=真ん中,ln=真ん中 if(( cent == ln) || (cent == kt) || (ln == kt) || ( maxl - ln + 1 == kt)) { if ( (cent == ln) && (cent == kt) && (0 == hen%2) ) { // 中心点の時にhenが偶数なら□ printf("□"); }else{ printf("●"); } }else{ printf("□"); } kt++; } printf("\n"); }
アルゴリズムをもっと深く考えて数式化してみてください。 まず、この図形を描くための入力と行数の関係です。奇数が入力された場合は「行数=入力」です。偶数が入力された場合は「行数=入力+1」です。ということは、まず最初の段階で入力が奇数か偶数かの判定と分岐が必要だということです。 次に、各行の中の●の位置です。まず、行数が5行の時を考えます。●の位置は、 1行め:1,3,5 → 1,(行数+1)/2,行数-(1-1) 2行め:2,3,4 → 2,(行数+1)/2,行数-(2-1) 3行め: 入力が奇数なら:1,2,3,4,5 → 全部● 入力が偶数なら:1,2,4,5 → (行数+1)/2以外全部● 4行め:2,3,4 → 4,(行数+1)/2,行数-(4-1) 5行め:1,3,5 → 5,(行数+1)/2,行数-(5-1) 同様に行数が7行の時も考えれば、一般的に全体の行数がN行の時、n行めの●の位置は以下のように求められることがわかるはずです。 n=(N+1)/2以外の時 n,(N+1)/2,N-(n-1) n=N/2+1の時 入力が奇数の時 for(i=1; i<=N; i++){ この条件全て } 入力が偶数の時 for(i=1; i<=N; i++){ if(i != (N+1)/2){ この条件全て }} ここまで整理できれば、あとはこれをC言語の文法で書くだけです。
お礼
すごく解りやすいです。ありがとうございましたッ!! …で、プログラムを作ってみたは良いのですが、何分、C言語初心者の為、上手くいきませんでした…。 修正箇所をお教えいただけると嬉しいです。 よろしくお願いいたします。 http://okwave.jp/qa5241790.html