ピラミッド作成 表示回数1回

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

ピラミッド作成 表示回数1回

#1

投稿記事 by 無名 » 6年前

文字列表示関数(printfなど)の使用回数を1回のみでピラミッドを表示するプログラムを作る課題が出ているのですが、どうやって作れば良いでしょうか・・・?

まったくわからなくて困ってます
どなたか助けてください(・_・;)

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

Re: ピラミッド作成 表示回数1回

#2

投稿記事 by box » 6年前

実行後、偶数の整数を入力してみてください。

コード:

#include <stdio.h>

void pyramid(int n)
{
    int x, y;

    if (n % 2 == 0) {
        int m = n - 1;

        for (y = m; y >= 0; y--) {
            for (x = -m; x <= m; x++) {
                putchar((y <= x + m && y <= -x + m) ? '*' : (x == m) ? '\n' : ' ');
            }
        }
    }
}

int main(void)
{
    int n;

    scanf("%d", &n);
    pyramid(n);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

無名

Re: ピラミッド作成 表示回数1回

#3

投稿記事 by 無名 » 6年前

上記のプログラム、エラー(移植性のないポインタ変換)
がputcharの列にあって実行出来ないのですが…

アバター
usao
記事: 1887
登録日時: 11年前

Re: ピラミッド作成 表示回数1回

#4

投稿記事 by usao » 6年前

オフトピック
> 文字列表示関数(printfなど)の使用回数を1回のみ
とは,
・ソースコードを眺めた感じ,関数呼び出し記述が1箇所しかない
なのか,それとも
・実行時に1回しか関数を呼ばない
なのか.

無名

Re: ピラミッド作成 表示回数1回

#5

投稿記事 by 無名 » 6年前

関数呼び出し記述が1箇所しかない
の方です。
言葉足らずですみません。

かずま

Re: ピラミッド作成 表示回数1回

#6

投稿記事 by かずま » 6年前

box さんが書きました:実行後、偶数の整数を入力してみてください。
なぜ、偶数しかダメなんですか?
段数と考えたら、奇数でもよいと思うんですが。

コード:

#include <stdio.h>

void triangle(int n)
{
    for (int y = n; y > 0; y--)
        for (int x = 1 - n; x <= n; x++)
            putchar(x >= y - n && x <= n - y ? '*' : " \n"[x==n]);
}

int main(void)
{
    for (int n = 1; n <= 5; n++)
        printf("[%d]\n", n), triangle(n);
    return 0;
}
実行結果

コード:

[1]
*
[2]
 * 
***
[3]
  *  
 *** 
*****
[4]
   *   
  ***  
 ***** 
*******
[5]
    *    
   ***   
  *****  
 ******* 
*********
でも、これは三角形を表示するプログラムですよね。

問題は、ピラミッドを表示するプログラムとなっています。

コード:

#include <stdio.h>   // printf
#include <string.h>  // memset
#include <math.h>    // sin, cos

#define T1 25
#define T2 75
#define PI 3.141592653589793238
#define Cos(t) cos(PI/180 * (t))
#define Sin(t) sin(PI/180 * (t))

char a[24][80];

double w;

void init(void) { memset(a, ' ', sizeof a); w = 0; }

void display(void)
{
    for (int i = 24; --i >= 0; )
        printf("%.79s\n", a[i]);
}

void plot(double x, double y)
{
    unsigned i = y / w * 24, j = x / w * 60;
    if (i < 24 && j < 80) a[i][j] = '*';
}

void line(double x1, double y1, double x2, double y2)
{
    for (int i = 0; i <= 64; i++)
        plot((x1*i + x2*(64-i))/64, (y1*i + y2*(64-i))/64);
}

void piramid(double base, double height)
{
    double x[5], y[5];

    init();
    x[1] = 0, y[1] = base * Sin(T1);
    x[2] = base * Cos(T1), y[2] = 0;
    x[3] = x[2] + base * Cos(T2), y[3] = base * Sin(T2);
    x[4] = base * Cos(T2), y[4] = y[1] + base * Sin(T2);
    x[0] = x[3] / 2, y[0] = y[4] / 2 + height;
    w = y[0] > y[4] ? y[0] : y[4];
    line(x[0], y[0], x[1], y[1]);
    line(x[0], y[0], x[2], y[2]);
    line(x[0], y[0], x[3], y[3]);
    line(x[1], y[1], x[2], y[2]);
    line(x[2], y[2], x[3], y[3]);
    if (y[0] < y[4]) {
        line(x[0], y[0], x[4], y[4]);
        line(x[3], y[3], x[4], y[4]);
        line(x[4], y[4], x[1], y[1]);
    }
    display();
}

int main(void)
{
    piramid(10, 3);  // 底辺 10、高さ 3 のピラミッド
    piramid(10, 7);  // 底辺 10、高さ 7 のピラミッド
    return 0;
}
実行結果

コード:

          *******
         **  *********
         *     ***    ******
        **       ***       ******
       **          ***           *****
       *             ***              ******
      *                ************        ******
     **               *****        ****************
     *             ****   *                      *
    **           ***       *                    **
   **         ***          **                  **
   *        ***             **                 *
  *      ***                 **               **
 **    ***                    *              **
 *  ***                        *             *
****                           **           **
**                              **         **
 ******                          **        *
       ******                     **      **
            ******                 *     **
                 ******             *    *
                       ******       **  **
                            ******   ****
                                  ******
                       ******
                      ** ** ****
                    **    *     ****
                   **      *       ****
                 **        *          ****
                **          *             ****
              ***           *                ****
             **              *                  ***
           **                **                  *
          **                  *                 *
        **                    **               **
       **                      **              *
     ***                        *             **
    **                          **           **
  **                             *           *
 **                              **         *
**                                *        **
 ******                            *       *
       ******                      *      **
            ******                  *    **
                 ******             **   *
                       ******        *  *
                            ******   ****
                                  ******
冗談です。

無名

Re: ピラミッド作成 表示回数1回

#7

投稿記事 by 無名 » 6年前

三角形表示と表記した方のプログラムですが、printfとputcharの2箇所に表示関数が使われてるのでこれだと課題の条件に合わないです…

でも、立体ピラミッドは凄すぎますねw

かずま

Re: ピラミッド作成 表示回数1回

#8

投稿記事 by かずま » 6年前

無名 さんが書きました:三角形表示と表記した方のプログラムですが、printfとputcharの2箇所に表示関数が使われてるのでこれだと課題の条件に合わないです…
そのプログラムは、単なるヒントです。
課題の条件に合うようにするのは、あなたです。
参考になりませんか?

かずま

Re: ピラミッド作成 表示回数1回

#9

投稿記事 by かずま » 6年前

別のやり方を考えてみましょう。

putchar を 2個所以上書いてもいいのなら簡単ですよね。

コード:

void triangle(int n)
{
    int i, j;
    for (i = 1; --n >= 0; i += 2) {
        for (j = 0; j < n; j++) putchar(' ');
        for (j = 0; j < i; j++) putchar('*');
        putchar('\n');
    }
}
char buf[10000]; というバッファを用意し、
puthar(c) の代わりに buf[k++] = c; とし、
最後に buf[k] = '\0'; としたら、
printf(buf); ひとつで目的達成になりませんか?

参考になったら、できたプログラムを貼り付けて
解決にしてください。
疑問点があれば、どんどん質問しましょう。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ピラミッド作成 表示回数1回

#10

投稿記事 by みけCAT » 6年前

「文字列表示関数」とはなんですか?
putchar関数をラップしたmyputchar関数を使えば、
putchar関数の使用はmyputchar関数の中の1箇所だけにできます。

コード:

int myputchar(int c) {
    return putchar(c);
}
そもそも、putcharは1文字だけを表示(標準出力に出力)する関数なので、文字表示関数には該当せず、制限はかからないのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ピラミッド作成 表示回数1回

#11

投稿記事 by みけCAT » 6年前

無名 さんが書きました:文字列表示関数(printfなど)の使用回数を1回のみでピラミッドを表示するプログラム
というか、標準出力に出力するだけで表示したとみなせるのであれば、素直に書けばいいでしょう。

コード:

#include <stdio.h>

int main(void) {
    printf("ピラミッド\n");
    return 0;
}
コレジャナイというのであれば、ここでの「ピラミッド」の定義を教えてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: ピラミッド作成 表示回数1回

#12

投稿記事 by box » 6年前

無名 さんが書きました:上記のプログラム、エラー(移植性のないポインタ変換)
がputcharの列にあって実行出来ないのですが…
シングルクォートを使っていますか?ダブルクォートではダメですよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

無名

Re: ピラミッド作成 表示回数1回

#13

投稿記事 by 無名 » 6年前

box さんが書きました:
無名 さんが書きました:上記のプログラム、エラー(移植性のないポインタ変換)
がputcharの列にあって実行出来ないのですが…
シングルクォートを使っていますか?ダブルクォートではダメですよ。

あー…間違えてダブルクォート使ってるかもしれないです…
月曜日にまた学校いったら確認してみます

ご指摘ありがとうございます!

無名

Re: ピラミッド作成 表示回数1回

#14

投稿記事 by 無名 » 6年前

コード:

#include<stdio.h>

void pyramid(int n)
{
	int x,y;
	int m = n - 1;
		
		for(y = m; y >= 0; y--){
			for(x = -m; x <= m; x++){
				putchar( (y <= x + m && y <= -x + m)?'*': (x == m)?'\n': ' ');
		}
	}
}

int main(void)
{
	int n;
	
	scanf("%d",&n);
	pyramid(n);
	
	return 0;
}
一番最初のプログラムからif文外したら奇数段でもできました!
ありがとうございました!!

かずま

Re: ピラミッド作成 表示回数1回

#15

投稿記事 by かずま » 6年前

こんな風にも書けます。

コード:

#include <stdio.h>
 
void triangle(int n)
{
    for (int m = n; --m >= 0; n++)     // m は ' ' の個数
        for (int i = 0; i <= n; i++)   // n は ' ' と '*' の個数
            putchar("\n* "[(i < m) + (i < n)]);
}
 
int main(void)
{
    int n = 0;
    while (scanf("%d", &n) == 1)
        triangle(n);
    return 0;
}
Borland C++ Compiler は、古い C にしか対応していないので、
int m, i; を for の前に移すか、bcc32 -P で
C++ としてコンパイルを行う必要があるでしょう。

putchar は次のようにも書けます。

コード:

            putchar(i < m ? ' ' : i < n ? '*' : '\n');

かずま

Re: ピラミッド作成 表示回数1回

#16

投稿記事 by かずま » 6年前

無名 さんが書きました: 一番最初のプログラムからif文外したら奇数段でもできました!
そのプログラムですが、次のような main で実行すると、変になります。

コード:

int main(void)
{
    pyramid(3);
    pyramid(4);
    return 0;
}
実行結果

コード:

  * 
 ***
*****   *  
  *** 
 *****
*******

返信

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