C言語でツリー状に'*'を表示する方法

このQ&Aのポイント
  • C言語でツリー状に'*'を表示する方法について教えてください。
  • 現在、左詰めでツリー状に'*'を表示していますが、問題の指示に従い、中央に表示する方法を知りたいです。
  • 教科書を見ても左詰めや右詰めの方法しか書かれていないため、中央に表示する方法がわかりません。お願いします。
回答を見る
  • ベストアンサー

‘*’をツリー状に表示しろという問題なんですが・・・。

‘*’をツリー状に表示しろという問題なんですが・・・。 #include<stdio.h> int main(void){ int x,i; for(x=1;x<=5;x+=2){ for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } for(x=5;x<=10;x+=2){ for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } for(x=7;x<=13;x+=2){ for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } for(x=9;x<=17;x+=2){ for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } return 0; } ツリーの数的にはこれでいいんですが、問題には「ツリー状」って書いてあるんですが これでは左詰めになってしまいます。 しかし教科書をみても右詰めや左詰めしか書いてなく、 どうやって中央でそろえるのかわかりません。 お願いします。

  • drite
  • お礼率48% (19/39)

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

最も簡単に、前に空白を入れてみた。 #include<stdio.h> int main(void){ int x,i; for(x=1;x<=5;x+=2){ /*以下3行追加*/ for(i=17;i>=x;i-=2){ putchar(' '); } for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } for(x=5;x<=10;x+=2){ /*以下3行追加*/ for(i=17;i>=x;i-=2){ putchar(' '); } for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } for(x=7;x<=13;x+=2){ /*以下3行追加*/ for(i=17;i>=x;i-=2){ putchar(' '); } for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } for(x=9;x<=17;x+=2){ /*以下3行追加*/ for(i=17;i>=x;i-=2){ putchar(' '); } for(i=1;i<=x;i+=1){ putchar('*'); } putchar('\n'); } return 0; }

drite
質問者

お礼

ありがとうございます! 自分のと比べてどこが違うか見てみます^^ ありがとうございました!

その他の回答 (1)

回答No.2

*の最大表示個数(17)から各行の出力個数を引いて2で割った数分スペースを 表示させればできそうです。 *が1の場合、(17-1)/2=8(8個分スペースを*の前に表示) *が3の場合、(17-3)/2=7 *が5の場合、(17-5)/2=6 繰り返しを少しだけ除去してみました。 #include<stdio.h> void make_tree(unsigned int start,unsigned int end,unsigned int step); void disp_tree(unsigned int length); void tree_format_center(unsigned int length); void print_space(unsigned int length); #define TREE_MAX 17 /* [*]の最大表示個数 */ int main(void){   make_tree(1, 5,2);   make_tree(5,10,2);   make_tree(7,13,2);   make_tree(9,17,2);   return 0; } void make_tree(unsigned int start,unsigned int end,unsigned int step){   while(start <= end){     disp_tree(start);     start += step;   } } void disp_tree(unsigned int length){   tree_format_center(length);   while(length--){putchar('*');}   putchar('\n'); } void tree_format_center(unsigned int length){   if(TREE_MAX <= length){return;}   print_space((TREE_MAX - length)/2); } void print_space(unsigned int length){   while(length--){putchar(' ');} }

関連するQ&A

  • 直角三角形を表示するプログラム

    下記のプログラムを実行するとコマンドプロントになにも表示されず、強制終了しなければならなくなってしまいます。 whileのところがおかしいのはわかったのですが、この書き方の何がいけないのかが分かりません。 初歩的な質問で申し訳ありませんが、回答していただけると有難いです。 #include <stdio.h> int main(void){ int count, i; printf("何段ですか?"); scanf("%d", &count); for(i = 1; i <= count; i++){ while(i-- > 0){ putchar('*'); } putchar('\n'); } return 0; }

  • for文

    以下のプログラムのforの条件文がなぜこれで動くのかよくわからないので 教えていただけないでしょうか? #include<stdio.h> int main(void) { int i; char str[] = "ABC"; char *ptr = "123"; for(i=0;str[i];i++) putchar(str[i]); putchar('\n'); for(i=0;ptr[i];i++) putchar(ptr[i]); putchar('\n'); printf("str = \"%s\"\n",str); printf("ptr = \"%s\"\n",ptr); return(0); }

  • C言語の問題です!!

    C言語の問題です。次の問題でプログラムを作ってみたのですがどうでしょうか?もし小さな間違いであったら訂正をお願いします。全然違う場合はそのように回答してください。初心者なものでよろしくお願いします。 ・1~100までの整数値を画面に表示せよ. ただし,数値を10個表示するごとに改行すること. #include<stdio.h> int main(void){ int i,j; for(i=1;i<=100;i++){    for(j=1;j<=9;j++) printf("%3d",i+j); i=i+9; putchar("\n"); } return(0); }

  • プログラミングに関する問題が解けません;;

    1 「ファイルの入出力」 以下のプログラムはdata.txtのデータを読み込み,画面に出力するものです. 下記のプログラムの######を埋めて完成させよ. #include <stdio.h> #include <stdlib.h> int main(void){     char dummy[128], filename[128];     FILE *fp;     char x;   sprintf(filename,"data.txt");     fp=fopen(filename, "r");     if(#####(1)####) {        printf("ファイル%s が見つかりません\n",filename);        return(-1);      } while(#########(2)############){ putchar(x); } fclose(fp); return(0); } 2 構造体を用いたプログラム 名前と点数用のメンバを持つ構造体dataを宣言しなさい。 また、名前と点数を表示する関数hyoujiを完成させよ。 #include <stdio.h> (1) void hyouji(###(2)###, int no); int main(void){ struct data member[3] = {{"伊藤", 71},{"小林", 81},{"山田", 67},}; hyouji(member, 3); } void hyouji(####(3)####, int no){ int i; for(i=0; i<no; i++){ printf("%s:%d\n", ###(4)###); mem++; } } 3 「2次元配列を使った行列の四則演算」 次のプログラムは、2次元配列の和を求め結果を表示するためのものである. 関数 mat_tasu()の中身を完成させよ. ただし関数 mat_tasu()は引数を持たない関数とします. #include<stdio.h> int ma[2][2]={{1,2}, {3,4}}; int mb[2][2]={{5,6}, {7,8}}; int mc[2][2]; void mat_tasu(void); int main(void) { int i,j; mat_tasu(); for (i=0; i<2; i++){ for (j=0; j<2; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); } /* 行列の和の計算 */ void mat_tasu(void) {      (1) } 各問題の(1)や(2)みたいになってるところに当てはまるプログラミングを教えてください! 一問だけでもいいので分かる方いましたら、回答お願いいたします!

  • 困っています

    これを三段で実行してみたのですが、うまく表示できません。下のようになります。どこが間違っているか教えてください。お願いします。          *         *        * #include <stdio.h> int main(void) { int i, j, ln; printf("何段を表示しますか?"); scanf("%d", &ln); for(i=1; i<=ln; i++){ for(j=1; j<=ln-i; j++) putchar(' '); for(j=1; j<=i * 2 - 1; j++); putchar('*'); putchar('\n'); } return(0); }

  • 2つのプログラムの違い

    どうしても分からなかったので投稿しました。よろしくお願いします。 #include<stdio.h> int main(void) { int c; while((c=getchar())!=EOF){ putchar(c); } return 0; } のプログラムをコマンドプロンプトで入力すると、 abc abc なんですが、 #include<stdio.h> int main(void) { int c,i; i=0; while ((c=getchar())!=EOF) { putchar(c); i++; printf("%d\n",i); } return 0; } の場合、 abc a1 a2 a3 4 になります。 自分は abc a1 a2 a3 になると思ったのですが、a3と4の隙間と4は何故出て来たのでしょうか?

  • LSIで画面に表示されない

    #include<stdio.h> int main(void) { int i,j; for(i=1; i<=5; i++) { for(j=1; j<=5-i; j++) { putchar(' '); } for(j=1; j<=2*i-1; j++) { putchar('* '); } putchar('\n'); } return 0; } このようなプログラムを打ってコンパイルしたんですが画面が真っ暗のままです。これはコンパイラがおかしいのでしょうか?他のはうまく表示されるんですが。ちなみに書籍名は「はじめてのCプログラミング」でコンパイラは本書付属のCD-ROM収録LSI-C(試食版)です。また繰り返しの構文(for文)ところでi=0か1にするかでずいぶんと値の振る舞いが変わるのですが…大学ではemacsを使っているのでLSIとの違いがあれば教えていただきたいです。

  • C言語の代入についての質問です

    C言語の代入についての質問です 下のプログラムを見て下さい #include<stdio.h> int x[2]; x[0] = x[1] = 1; int main(void) { for(int i = 0 ; i < 2 ; i++) printf("%d",x[i]); putchar('\n'); return 0 ; } このプログラムをコンパイラすると3行目の代入にエラーが出されます (当たり前ですがmainの中に3行目の代入文を入れると上手くいきます) まぁそれがなぜかというのが知りたいのですが、 それはC言語をつくった人が決めたことなのでしょうか? ちなみに異なる実行環境でやってみたらどれも駄目だったので これが上手くいくことはない?のだと思います そういうもんなのだったら、そういうものだと理解しますが もし理由を知っている方がいらっしゃったら教えて下さい

  • C言語、行列の積を求めるプログラムについて

    「次に示す行列x,yの積を求めるプログラムを作成せよ。   x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」 という問題です。自分ではとりあえず、 #include<stdio.h> int main(void) { int i,j; int x[2][3]={{1,2,3},{4,5,6}}; int y[3][2]={{1,5},{5,3},{8,1}}; int xy[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) xy[i][j]=x[i][j]*y[i][j]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%3d",xy[i][j]); putchar('\n'); } return 0; } というプログラムを作ってみましたが、ダメでした。 ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?

  • C言語で分からないことがあります。

    私は初心者で、ある参考書で下記の例が載っていたのですが、このプログラムで分からないことがあります。 #include<stdio.h> void nchar(int ch,int no) { while(no-->0) putchar(ch); } int main(void) { int i,ln; printf("何段ですか:");scanf("%d",&ln); for(i=1;i<=ln;i++){ nchar(' ',ln-i); nchar('*',i); putchar('\n'); } return 0; } まず、 ・nchar関数のnoは何を表しているのか? ・nchar関数のputchar(ch)は一体何を表しているのか? 参考書にはこのプログラムについてあまり説明が無くこの2点がよく分かりません。 よろしくお願いします。

専門家に質問してみよう