- 締切済み
C言語に詳しい方、お願いします!
二重for文の特長を活かし、次のような表示を行うプログラムを書きなさい。 ※四角形からダイヤ型をくり貫いたような表示。 ただし、キーボード入力で数字を出力し、その数字の数が、横配列の■の最大値となるようにすること(この例の場合、出力した数字は7)。 つまりは、出力した数字に応じて、■とダイヤの大きさが変化する。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- bravy
- ベストアンサー率0% (0/2)
要求に対してシステムがどのような振舞をするかを書いたのがNo2です。 これは要求を分析して、どのようにするとそれが満たされるかを考えたものです。 後は素直にCのコーディングにすれば良いのではないでしょうか? ちなみにy軸は普通の座標と逆と考えます。 下限値をy0として、上限値をy9とすると、(y0<y && y < y9)の時に白抜きになるという事を書けばよいのです。 #include <stdio.h> int main (int argc, char *argv[]) { int x, y; int n = (argc > 1) ? atoi (argv[1]) : 7; for (y = 0; y < n; y++) { for (x = 0; x < n; x++) { int y0, y9; if (x < (n / 2)) { y0 = -x + n / 2; y9 = x + n / 2; } else { y0 = x - n / 2; y9 = -x + 3 * n / 2; } printf ("%s", (y0 < y && y < y9) ? "□" : "■"); } printf ("\n"); } } ---- 省略値で7となるようになっています。 ■■■■■■■ ■■■□■■■ ■■□□□■■ ■□□□□□■ ■■□□□□■ ■■■□□■■ ■■■□■■■ このプログラムに20を引数で渡すのこんな風になります。 ■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■□■■■■■■■■■ ■■■■■■■■■□□□■■■■■■■■ ■■■■■■■■□□□□□■■■■■■■ ■■■■■■■□□□□□□□■■■■■■ ■■■■■■□□□□□□□□□■■■■■ ■■■■■□□□□□□□□□□□■■■■ ■■■■□□□□□□□□□□□□□■■■ ■■■□□□□□□□□□□□□□□□■■ ■■□□□□□□□□□□□□□□□□□■ ■□□□□□□□□□□□□□□□□□□□ ■■□□□□□□□□□□□□□□□□□■ ■■■□□□□□□□□□□□□□□□■■ ■■■■□□□□□□□□□□□□□■■■ ■■■■■□□□□□□□□□□□■■■■ ■■■■■■□□□□□□□□□■■■■■ ■■■■■■■□□□□□□□■■■■■■ ■■■■■■■■□□□□□■■■■■■■ ■■■■■■■■■□□□■■■■■■■■ ■■■■■■■■■■□■■■■■■■■■ キーボード入力で数字をという要求は満たしていません。
- yama5140
- ベストアンサー率54% (136/250)
(「回答」するか、躊躇しました。初めての経験です) >C言語に詳しい方、お願いします! 質問者様は、「この問題は、C言語に詳しくないと、解けない」とお考えですね。 どうして、そんな問題にチャレンジしたのですか?。 なぜ、「困り度」が最高なのですか?。 ☆まず自分で「考える・解決する」という気構えが・・・と思います。 >※四角形からダイヤ型をくり貫いたような表示。 をするには、「出力した数字」の最小は、いくつか?考えてみましたか。 偶数で実現できるかどうかも。 これを考えるのに必要なのは、紙と筆記具だけで、「C言語に詳しい」かどうかは無関係ですよ。 12345 ■■■■■ ■■ ■■ ■ ■ ■■ ■■ ■■■■■ この図が、最も小さい?と思われます。 まわりに1つ追加したものを想定してみると・・(×偶数)。 「ここまで判ったのですが、コード化できません」のような質問・・。 +++++++++++++++++++++++++++++++++++++++++++++ 確かに、難しいですね、・・「詳しくない」からかなぁ?。 で、No.2 さんのをコード化してみました。 ・どうして3が出てくるかは、考えてください。 ヒント:切片 y = x + b #include <stdio.h> #include <stdlib.h> char cZen[ 2 ][ 4 ] = { "■", "□" }; int main( void ) { int x, y, iGrid[ 32 ][ 32 ] = { { 0 } }, iKazu, iHan, iCode; scanf( "%d", &iKazu ); if( 0 == ( iKazu % 2 ) ) iKazu++; // 強制奇数化 if( iKazu < 5 ) return( -1 ); if( iKazu > 31 ) return( -1 ); printf( "%d\n", iKazu ); iHan = iKazu / 2; for( y = 1; y <= iHan; y++ ){ for( x = 1; x < iHan; x++ ){ if( ( iHan - x ) < y ) iGrid[ x ][ y ] = 1; } for( x = iHan; x < iKazu; x++ ){ if( ( x - iHan ) < y ) iGrid[ x ][ y ] = 1; } } for( y = iHan; y < iKazu; y++ ){ for( x = 1; x < iHan; x++ ){ if( ( x + iHan ) > y ) iGrid[ x ][ y ] = 1; } for( x = iHan; x < iKazu; x++ ){ if( ( 3 * iHan - x ) > y ) iGrid[ x ][ y ] = 1; } } for( y = 0; y < iKazu; y++ ){ for( x = 0; x < iKazu; x++ ){ iCode = iGrid[ x ][ y ]; printf( "%s", cZen[ iCode ] ); } printf( "\n" ); } return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
- bravy
- ベストアンサー率0% (0/2)
キーボードから入力された数字をnとする。 [0<=x && x<=n/2]の時 下限値 y=-x+n/2 上限値 y=x+n/2 [n/2<x && x<=n]の時 下限値 y=x-n/2 上限値 y=-x+3*n/2 こんな座標を考えてみてはどうでしょう。 座標の原点とか向きは少し考える必要があると思います。
- okg00
- ベストアンサー率39% (1322/3338)
#include <stdio.h> int main(void) { char* c[7]={ "■■■■■■■", "■■■ ■■■", "■■ ■■", "■ ■", "■■ ■■", "■■■ ■■■", "■■■■■■■" }; for(int i=0;i<7;i++){ printf("%s\n", c[i]); for(int j=0;j<7;j++); } return(0); }