出力文字の中央寄せ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ガムテープ

出力文字の中央寄せ

#1

投稿記事 by ガムテープ » 14年前

C言語で迷っています。
*をピラミッド状にするものなのですが、中央に記号を寄せたくても、どうしても左詰めになってしまいます。
よろしければアドバイスお願いします。

#include<stdio.h>
int main(void)
{
int i,j;

for (i=1; i<=10; i++){
for(j=1; j<=2*i-1; j++){
putchar('*');
}
putchar('\n');
}
return 0;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 出力文字の中央寄せ

#2

投稿記事 by h2so5 » 14年前

ガムテープ さんが書きました:中央に記号を寄せたくても、どうしても左詰めになってしまいます。
どうしても、と書かれていますが具体的にどのような方法を試されたのでしょうか?

普通に*の左側にスペースを適切な個数入れれば良いと思いますよ。

追記:コードはコードタグで囲って下さい
http://dixq.net/board/board.html#k10

ガムテープ

Re: 出力文字の中央寄せ

#3

投稿記事 by ガムテープ » 14年前

putchar(' *');やputchar(' * ');を試していました。

*の左とは、Ctrl+F5の後の黒い画面で ということでしょうか?
編集画面のどこに入れればいいのかわかりません。

ちなみにC言語は初心者です。表現が分かりにくくて申し訳ないです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 出力文字の中央寄せ

#4

投稿記事 by h2so5 » 14年前

例えば、ピラミッドの頂点の*を中央に表示するには、
putchar('*'); の前に、スペースを9個表示させます。

もう一つ下の段**は、スペースを8個表示させます。

これを一番下の段まで繰り返せばよいです。

ガムテープ

Re: 出力文字の中央寄せ

#5

投稿記事 by ガムテープ » 14年前

自分なりに努力したのですが、これ以外に検討がつきません・・・・・

ご指導お願いします。
お手数をかけてしまい申し訳ないです。

コード:

{
	int i,j;
	for (i=1; i<=10; i++){
		for(j=1; j<=2*i-1; j++){  
			printf("         \n"); putchar('*');
			printf("        \n"); putchar('*');
			printf("       \n"); putchar('*');
			printf("      \n"); putchar('*');
			printf("     \n"); putchar('*');
			printf("    \n"); putchar('*');
			printf("   \n"); putchar('*');
			printf("  \n"); putchar('*');
			printf(" \n"); putchar('*');
			printf("\n"); putchar('*');
		}
		putchar('\n');
	}
	return 0;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 出力文字の中央寄せ

#6

投稿記事 by h2so5 » 14年前

ヒント:

コード:

#include<stdio.h>
int main(void)
{
	int i,j;

	for (i=1; i<=10; i++){
	
	/* ここにスペースを 10 - i 個出力する処理を入れます */
	
	for(j=1; j<=2*i-1; j++){
	putchar('*');
	}
	putchar('\n');
	}
	return 0;
}

box
記事: 2002
登録日時: 14年前

Re: 出力文字の中央寄せ

#7

投稿記事 by box » 14年前

そのコードの5行目から14行目までは、空白の数が異なるだけで他は同じパターンですよね。
そこをfor文によるループにしてみたら?


あと、ネット上でよく見かける誤字ですが、

誤:検討がつかない
正:見当が付かない

です。ご注意あれ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ガムテープ

Re: 出力文字の中央寄せ

#8

投稿記事 by ガムテープ » 14年前

h2so5さんにご返事をいただいてからずっと考えたり試したりしているのですが、うまくいきません。
for~のあとに
n=10-i;
printf(" ",n);

だったり、
printf(" ",10-i);

その他似たような事を試しましたが左にスペースが一マスずつ表示されるだけでした。

答えとまではいかなくても、別のヒントをお願いします。

box
記事: 2002
登録日時: 14年前

Re: 出力文字の中央寄せ

#9

投稿記事 by box » 14年前

1行目:1個の*
2行目:3個の*
3行目:5個の*
4行目:7個の*
5行目:9個の*
6行目:11個の*
7行目:13個の*
8行目:15個の*
9行目:17個の*
10行目:19個の*

行数と*の個数との間の関係はおわかりのようですね。
さて、上記の*群の三角形がプラミッド型を構成するには、各行の*群の前に適切な数の空白が必要ですね。
10行目から考えていきましょうか。

10行目:0個の空白のあとに19個の*
9行目:1個の空白のあとに17個の*
8行目:2個の空白のあとに15個の*
7行目:3個の空白のあとに13個の*
6行目:4個の空白のあとに11個の*
5行目:5個の空白のあとに9個の*
4行目:6個の空白のあとに7個の*
3行目:7個の空白のあとに5個の*
2行目:8個の空白のあとに3個の*
1行目:9個の空白のあとに1個の*

さて、行数と空白の個数との間には、どういう関係があるでしょうか。
結局、h2so5さんの回答と同じことを言ってるだけなんですけどね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 出力文字の中央寄せ

#10

投稿記事 by Tatu » 14年前

printfについて
%dなどを使わない場合はprintf("文字列");で文字列が出力できます。
改行したい場合はprintf("\n");でできます。

h2so5さんのいっていることは
スペースを一つ書くという処理を
10-i 回繰り返すように書けばできます。

box
記事: 2002
登録日時: 14年前

Re: 出力文字の中央寄せ

#11

投稿記事 by box » 14年前

>さて、上記の*群の三角形がプラミッド型を構成するには、各行の*群の前に適切な数の空白が必要ですね。

各行に、適切な数の空白を出力する際、*を出力するのと同じようにfor文によるループを使えばいいんですよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ガムテープ

Re: 出力文字の中央寄せ

#12

投稿記事 by ガムテープ » 14年前

コード:

#include<stdio.h>
int main(void)
{
	int i,j,n,m;
	for (n=1; n<=9; n++){
		putchar(' ');
	}
	for (i=1; i<=10; i++){
		for(j=1; j<=2*i-1; j++)
			putchar('*');			
		putchar('\n');
	}
	return 0;
}
こうすることで1行目がでましたが、
2行目以降をしようとして
for(m=0; m<=9; m++)と打ちましたが、おかしい事になります。
      m<=n-1と打っても下の行にはスペースが現れず、
改行を入れると上の方にスペースだけが固まってしまいます。
どうしたらいいでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 出力文字の中央寄せ

#13

投稿記事 by h2so5 » 14年前

スペースを表示する処理が私がヒントを出した場所に入っていませんし、
スペースを表示する回数が変数 i の影響を全く受けていませんよ。

変数 i を使えば1行目と2行目で処理を分けないで書けます。
10行処理するのに、nmopqrstuv.... と全部書くつもりですか?

ヒントをもう一度良く読んでください。

あと、
ガムテープ さんが書きました:h2so5さんにご返事をいただいてからずっと考えたり試したりしているのですが、うまくいきません。
for~のあとに
n=10-i;
printf(" ",n);
これはすごく惜しいです。このような、forループ使わない方法もあります。
printfの引数をうまく変えればスペースを 10-n 個表示できるので、 printf について調べてみてください。

box
記事: 2002
登録日時: 14年前

Re: 出力文字の中央寄せ

#14

投稿記事 by box » 14年前

どうして、空白を出力する処理が、*を出力するためのループの「外」にあるのでしょうか?

ある行を出力する処理の「中」に、
 ・適切な数の空白を出力する
 ・適切な数の*を出力する
という2つの処理を含んでいるんじゃないんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ガムテープ

Re: 出力文字の中央寄せ

#15

投稿記事 by ガムテープ » 14年前

やっとできました!
for(j=0; j<=10-i; j++)という文になぜ気づかなかったか不思議なくらいです。


最初から最後まで丁寧なアドバイスありがとうございました。
これからは次々問題をやる前に、今までのところをしっかり復習しようと思います。

ほんとにありがとうございました。感謝の気持ちでいっぱいです。

閉鎖

“C言語何でも質問掲示板” へ戻る