*でダイヤを作るプログラムをやってみました

kerotan0820
記事: 91
登録日時: 14年前

*でダイヤを作るプログラムをやってみました

投稿記事 by kerotan0820 » 14年前

中間テスト中に、ふと、質問掲示板で最近学生の方が*でダイヤを作る方法を教えてくださいとの質問をしていたのを思い出しました。

回答もしおわって、時間が合ったので解答用紙の裏に… ちょこまかと書いて考えたりしていたのですが、どうも頭がこんがらがる。

そりゃあ、睡眠もろくにとらず(オールで勉強)、働くわけもないか・・・ ということで今日、テスト最終日は睡眠はとって、テスト後にPCルームで作ってみました。

こうなりました。

CODE:


#include
int main(){
	int a,b,c,count=1,UE=0,SPACE,ASU=1,DANSU=0;

	printf("何段のダイヤにする?\n"
		"※ダイヤは奇数でないと作れませんので、奇数を入力してください\n"
		"偶数が入力された場合、1を加算して奇数にします\n"
		"段数:");
	scanf("%d",&DANSU);

	if(DANSU%2!=1)
		DANSU+=1;

	SPACE=DANSU/2;

	for(c=1;c<=DANSU;c++){

		for(a=1;a<=SPACE;a++){
			printf(" ");
		}
		for(b=1;b<=ASU;b++){
			printf("*");
		}
		if(UE==0){
			ASU+=2;
			SPACE--;
			puts("");
			count++;
		}else if(UE==1){
			ASU-=2;
			SPACE++;
			puts("");
		}
		if(count==DANSU/2+1){
			UE=1;
		}
	}

	scanf("%d");
}


頭がさえていたのか、私の脳みそとは思えない勢いで完成にたどり着きました。

一応動いたものの、もっとこうしたほうが良いといった点が有りましたらご指摘いただけると非常に助かります。

まあとりあえず! できてよかった~(・∀・)
最後に編集したユーザー kerotan0820 on 2011年5月27日(金) 16:23 [ 編集 1 回目 ]

sys
記事: 27
登録日時: 14年前

Re: *でダイヤを作るプログラムをやってみました

投稿記事 by sys » 14年前

面白そうなので、私も考えて見ました!
kerotan0820さんのcodeと規則にのっとりつつ、変数と行数を読みづらくない範囲でなるべく少なくしてみました。
(※scanfの使い方は気になりましたが、そのままで…)

CODE:

#include
int main(void){
  int current = 0, dansu = 0;
  
  printf("何段のダイヤにする?\n"
         "※ダイヤは奇数でないと作れませんので、奇数を入力してください\n"
         "偶数が入力された場合、1を加算して奇数にします\n"
         "段数:");
  scanf("%d",&dansu);
  
  if(dansu%2!=1)
    dansu += 1;
  current = dansu / 2 + 1;
  
  for(int i = 0; i < dansu; i++) {
    for(int j = 0; j < dansu - current; j++) {
      printf(" ");
    }
    for(int j = 0; j < current - (dansu - current); j++) {
      printf("*");
    }
    printf("\n");
    if (i < dansu / 2)
      current++;
    else
      current--;
  }
  scanf("%d");
}
最後に編集したユーザー sys on 2011年5月27日(金) 17:42 [ 編集 2 回目 ]

kerotan0820
記事: 91
登録日時: 14年前

Re: *でダイヤを作るプログラムをやってみました

投稿記事 by kerotan0820 » 14年前

>>sysさん
コメントありがとうございます!

これは非常に参考になるプログラムをありがとうございます。
同じ先入観でしか物事見れないので、大変有り難く思います。
参考にさせていただきます^^

アバター
ookami
記事: 214
登録日時: 14年前

RE: *でダイヤを作るプログラムをやってみました

投稿記事 by ookami » 14年前

こんばんわwwww
ちょっと変えすぎたかな...?
参考になれば。

CODE:

#include

int main(){
    int DANSU=0,c;
 
    printf("何段のダイヤにする?\n"
        "※ダイヤは奇数でないと作れませんので、奇数を入力してください\n"
        "偶数が入力された場合、1を加算して奇数にします\n"
        "段数:");
    scanf("%d",&DANSU);

    DANSU=DANSU -DANSU%2 +1;

    for(c=0;c<DANSU;c++){
        int space= (c<DANSU/2)? DANSU/2-c:-DANSU/2+c; // 上半分なら、スペースの数は DANSU/2-c 個、下半分なら -DANSU/2+c 個
        int dia  = DANSU-space*2;    // *の数は、スペースの数から引けばおk

        while(space--) printf(" "); // space回" "を出力
        while(dia--  ) printf("*"); //   dia回"*"を出力
        printf("\n");
    }
    getch(); // 単に止めるだけならこれ。
}

アバター
a5ua
記事: 199
登録日時: 14年前

RE: *でダイヤを作るプログラムをやってみました

投稿記事 by a5ua » 14年前

再帰呼び出しによる実装を思いついたので、書いてみました。
また、機能ごとに関数に分割することを意識しました。

CODE:

#include 

// cをn回表示する
void put_repeatedly(char c, int n)
{
	int i;
	for (i = 0; i = 1)を入力してn段のダイアモンドを表示する
// n段のダイアモンドは、(2n - 1)行で構成される
// 不正な入力の場合は、何も表示せずに終了する
int main(void)
{
	int n;
	if (scanf("%d", &n) != 1) {
		return 0;	// 入力エラー
	}
	if (n <= 0) {
		return 0;	// 数値エラー
	}
	diamond(n);
	return 0;
}
最後に編集したユーザー a5ua on 2011年5月28日(土) 08:21 [ 編集 2 回目 ]

kerotan0820
記事: 91
登録日時: 14年前

Re: *でダイヤを作るプログラムをやってみました

投稿記事 by kerotan0820 » 14年前

a5uaさんoookamiさん・・・ お二人方ともやばすぎます・・・( ゚Д゚)

短さを追求してつくっていただけにookamiさんのとかやばいです・・・
C言語の複雑なプログラムが苦手な私はa5uaさんのも唖然です・・・  勉強の参考にさせていただきます!

記事にして本当によかったと思いました。
これは勉強になります・・・((((;゚Д゚))))ガクガクブルブル