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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Q&A

解決済

4回答

2388閲覧

for文 アルファベット順で直角三角形表示

tikuno

総合スコア18

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

0グッド

1クリップ

投稿2020/06/05 14:14

キーボードから正の整数(n<=26)を入力すると下記のように一辺に文字がn個並んだ直角三角形が表示されるプログラムを作る問題で(例:n=5のとき)

abcde abcd abc ab a

と表示。この時どのようにプログラムを作成すればよろしいのでしょうか?

別の問題ですが同文字の角=90度が左下にあるときの直角三角形を作る問題は解けました。

#include<stdio.h> int main(void) { char a; int n,i,j; scanf("%c",&a); scanf("%d",&n); for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ printf("%c",a); } printf("\n"); } return 0; }

これを前提に考えると思うのですがわからなくてつまっています。

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

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

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

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

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

e-watt

2020/06/05 14:40

各行で、空白を0~n-1個出したら(改行せずに)文字をn~1個出してみてはどうでしょう。
guest

回答4

0

単に答えが欲しいのではなく、プログラミングの勉強をしたいのであれば以下のステップで進むのはどうでしょうか。

ステップ1:「同文字の角=90度が左下にあるときの直角三角形を作る」コードを応用してn=5のときに以下を出力するコード作成
a
ab
abc
abcd
abcde

ステップ2:ステップ1を応用してn=5のときに以下を出力するコード作成
abcde
abcd
abc
ab
a

ステップ3:ステップ2を応用して質問のコードを作成

投稿2020/06/05 15:45

javahack

総合スコア1088

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

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

0

ベストアンサー

まず,問題をこのように捉えてはどうか.

C

1// 2//nが入力されるところは省略 3// 4n = ...; 5 6// 7//「n * n マスの四角い範囲の各場所に何らかの文字を(条件に合わせて)表示する」 8//という問題である 9/ 10for( y=0; y<n; ++y ) 11{ 12 for( x=0; x<n; ++x ) 13 { 14 //位置(x,y)に表示すべき文字を決める. 15 char char_at_xy = ' '; //このままだとスペースなので... 16 //※ 17 //ここで,座標値(x,y)を用いた何らかの処理により, 18 //必要ならばchar_at_xyを何らかのアルファベットに変更する 19 // 20 21 //位置(x,y)に表示すべき文字を表示 22 printf( "%c", char_at_xy ); 23 } 24 //改行 25 printf( "\n" ); 26}

「三角形の角がどっちにある」とか,
「三角形箇所への表示内容が全て'a'なのか,abcd... と表示するのか」
等に関わらず,とりあえず一般化すれば上記のようになる.
違うのは 「※」のところの処理だけであろう.

この形で実現できたら,
「もっと{マシな,簡潔な,効率のよい,etc...}書き方に変形できないか?」
として変形させていけばよいであろう.

投稿2020/06/06 01:54

fana

総合スコア11632

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

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

tikuno

2020/06/06 13:27

回答ありがとうございます。自分でやったのですがアルファベット順にするには最後のforとprintfの中身をどうすればいいのでしょうか? #include<stdio.h> int main(void) { int n,i,j; scanf("%d",&n); if(n<=26){ for(i=0;i<n;i++){ for(j=0;j<i;j++){ printf(" "); } for(j=n-i;j>0;j--){ printf("%c",'a'+i); } printf("\n"); } } return 0; }
fana

2020/06/06 13:42

要するに,各行の出力として, 「i番目の行はまずi個のスペースを出力し,つづけてn-i個のアルファベットを出力する」 という形に書いたわけですね. しかし同一行内ではiの値は一定なのですから 'a'+i では,その行内に表示されるアルファベットが同じになっていまいますね. →ならば,表示アルファベットを決めるのに i を使うのではなく,何か別のものを使えばよいでしょう.
fana

2020/06/06 13:45

「n-i 回繰り返す」書き方をもっと素直に書いてもよいのではないでしょうか. for( j=0; j<n-1; j++ ) という形の方が,見慣れた形ではないかと思います. この形ならば,同一行内で表示するアルファベットを変えていく目的に jの値 を利用することを考えやすいのではないでしょうか.
tikuno

2020/06/06 13:56

こうしたら1行目はabcdeとできましたが2行目以降、ghij・・・になってしまいます。 #include<stdio.h> int main(void) { int n,i,j,k=0; scanf("%d",&n); if(n<=26){ for(i=0;i<n;i++){ for(j=0;j<i;j++){ printf(" "); } for(j=n-i;j>0;j--){ printf("%c",'a'+k); k++; } printf("\n"); } } return 0; }
fana

2020/06/06 14:00

kの値がk++でどんどん増えていくからですね. kの値を適切なタイミングで0に戻す必要があるのではありませんか? 各行で最初の表示アルファベットを'a'にするためには,各行で for(j=n-i;j>0;j--) の処理に入る前には kの値は0になっている必要があるでしょう.
tikuno

2020/06/06 14:03

fanaさんがおっしゃったことも踏まえて修正したらいけました。丁寧に教えてくださりありがとうございます。 #include<stdio.h> int main(void) { int n,i,j,k; scanf("%d",&n); if(n<=26){ for(i=0;i<n;i++){ for(j=0;j<i;j++){ printf(" "); } k=0; for(j=0;j<n-i;j++){ printf("%c",'a'+k); k++; } printf("\n"); } } return 0; }
fana

2020/06/06 14:07

この形なら, for(j=0;j<n-i;j++)内の各繰り返しにおいて,jの値とkの値は同一になっています(どちらも0から始まって,1ずつ増えていくので). ゆえに,変数kを用いずとも,'a'+j でもいけるでしょう.
guest

0

printf で "%s" を使うとき幅と精度を指定すると、左にスペースを出して
右詰めて表示できます。

C

1 printf("%5.4s\n", "abcde"); // " abcd" と表示 2 printf("%5.3s\n", "abcde"); // " abc" と表示

printf の幅と精度は、"*" を使うと、実行時に可変にできます。

C

1 printf("%*.*s\n", 5, 4, "abcde"); // " abcd" と表示 2 printf("%*.*s\n", 5, 3, "abcde"); // " abc" と表示

入力値 n を使うと、

C

1 for (int n, i = (scanf("%d", &n), n); i > 0; i--) 2 printf("%*.*s\n", n, i, "abcdeghijklmnopqrstuvwxyz");

投稿2020/06/06 01:05

kazuma-s

総合スコア8224

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

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

0

abcde : 0個の空白と"abcde"の先頭から5文字 abcd : 1個の空白と"abcde"の先頭から4文字 abc : 2個の空白と"abcde"の先頭から3文字 ab : 3個の空白と"abcde"の先頭から2文字 a : 4個の空白と"abcde"の先頭から1文字 つまり : i個の空白と"abcde"の先頭から5-i文字 <--- コレを for-loop で回す

投稿2020/06/05 22:45

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問