質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2258閲覧

サイズを示す数値を入力した際に文字で三角形を表示するプログラム

fegeryh

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/10/06 07:33

編集2021/10/06 07:42

例えば4と入力した場合、以下のように表示されるようにしたいです。
$
$$
$ $
$$$$

以下のようなコードだと空白がなく、空白をだすためにどう処理を行えばよいかがわかりません。

コード #include <stdio.h> int main(void){ // Your code here! int size; int i, j; scanf( "%d", &size ); for( i = 0 ; i < size ; i++ ) { for( j = 0 ; j <= i ; j++ ) printf( "$" ); printf( "\n" ); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaina

2021/10/06 08:06

空白はどのような規則性のもとに入れる必要があるか考えてみましたか? 4と入力した場合は3列目の2桁目が空白、5と入力した場合は追加で4列目の2桁目と3桁目が空白、 6と入力した場合は追加で5列目の2から4桁目が空白となりますよね? この規則性をプログラムでどのように実現できるか考えてみると自ずとどのように プログラムを書けばよいか分かると思います。
guest

回答4

0

ベストアンサー

座標 (j, i) が,三角形の辺上にあるのか否かを判定し,
辺上にある場合は $ を,そうでない場合には空白を表示すればよいのではないでしょうか.


三角形には3つの辺がありますから,それぞれを直線の方程式として

  • f1( x,y; n ) = 0
  • f2( x,y; n ) = 0
  • f3( x,y; n ) = 0

(ここで,n は入力値)

と表すならば,
各座標 (x,y) に関して,
f1~f3 のいずれかが0となるならばその座標は辺の上にあり,そうでなければ辺の上にありません.

…っていう話をとりあえず愚直に実装すればこんな感じかと.

C

1int f1( int x, int y, int n ){ return x; }; //縦の辺 2int f2( int x, int y, int n ){ return y - (n-1); } //底辺 3int f3( int x, int y, int n ){ return y - x; } //斜辺 4 5int main(void) 6{ 7 int x,y; 8 int n = 0; 9 scanf( "%d", &n ); 10 for( y=0; y<n; ++y ) 11 { 12 for( x=0; x<n; ++x ) 13 { 14 putchar( ( f1(x,y,n)==0 || f2(x,y,n)==0 || f3(x,y,n)==0 ) ? '$' : ' ' ); 15 } 16 putchar( '\n' ); 17 } 18 return 0; 19}

(「三角形の斜辺よりも右側にまで余計な空白が出力されるのが嫌だ」とかこだわりがある場合には,相応に対処すれよい)

投稿2021/10/06 07:58

編集2021/10/06 08:16
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

てきとーなバッファ上に出力イメージを作ってから→それを最後に出力する
…という話でもOKなのであれば,

  1. 質問文のコードと同様な処理で,指定サイズの三角形を $ で(バッファ上に)描く
  2. 同様の処理によって{ちょっと小さい三角形を,ちょっとずらした位置に,空白で}(バッファ上に)描く(穴の部分を空白で上書きする)
  3. バッファの内容を出力する

という方法でいけるのではないでしょうか.

C

1#define MAX_SIZE 10 2char Buffer[MAX_SIZE+1][MAX_SIZE] = { 0 }; 3 4//バッファに,サイズnの三角形を文字cで描画する. 5//ただし,描画位置は(dx,dy)だけずらす 6void DrawTriangle( int n, int dx, int dy, char c ) 7{ 8 int x,y; 9 for( y=0; y<n; ++y ) 10 { 11 for( x=0; x<=y; ++x ) 12 { Buffer[y+dy][x+dx] = c; } 13 } 14} 15 16int main(void) 17{ 18 int y; 19 int n = 0; 20 scanf( "%d", &n ); 21 22 if( n > MAX_SIZE ) //※このコード例だとバッファサイズを超えた指定は無理 23 { printf( "%dは無理\n",n ); return 0; } 24 25 DrawTriangle( n, 0,0, '$' ); //まず,ふつーに$で三角形を描いて 26 DrawTriangle( n-3, 1, 2, ' ' ); //次に,穴の部分を空白で描く 27 28 for( y=0; y<n; ++y ) 29 { printf( "%s\n", Buffer[y] ); } 30 31 return 0; 32}

投稿2021/10/06 09:24

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  1. 頂点の場合、空白は必要ない
  2. 中腹のばあい、最初と最後以外は空白
  3. 底辺は空白は必要ない

それぞれの条件で考えてみたらどうでしょうか

投稿2021/10/06 08:16

WoodenHamlet

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問文にあるコードに on_line_0() というメソッドで、(x,y) が三角形の辺上かを判定して描画するようにしました。
さらに on_line_0 の内容を短くしたものを on_line() として定義しました。
下の実行例は on_line() を使ったときのものです。

c.c

c

1#include <stdio.h> 2 3// (x, y) が3角形の辺上かを判定する。 4int on_line(int x, int y, int size) { 5 // on_line_0 の判定を数値の掛け算に置き換えた。 6 // (a == b) || (c == d) を ((a -b) * (c - d) == 0) に変換する方法を使っている。 7 return 0 == (size - 1 - y) * (x - y) * x; 8} 9 10int on_line_0(int x, int y, int size) { 11 if (y == size - 1) { 12 // 底辺 13 return 1; 14 } else if ((x == y) || (x == 0)) { 15 // 斜め線 または 垂直線 16 return 1; 17 } 18 return 0; 19} 20 21int main(void) 22{ 23 int x,y; 24 int size = 0; 25 scanf( "%d", &size); 26 27 for(y = 0; y < size; ++y) { 28 for(x = 0; x <= y; ++x) { 29 char ch = ' '; 30 if (on_line(x, y, size)) { 31 ch = '$'; 32 } 33 putchar(ch); 34 } 35 putchar( '\n' ); 36 } 37 return 0; 38}

実行例
イメージ説明

投稿2021/10/07 00:03

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問