ピラミッド作成 表示回数1回
ピラミッド作成 表示回数1回
文字列表示関数(printfなど)の使用回数を1回のみでピラミッドを表示するプログラムを作る課題が出ているのですが、どうやって作れば良いでしょうか・・・?
まったくわからなくて困ってます
どなたか助けてください(・_・;)
まったくわからなくて困ってます
どなたか助けてください(・_・;)
Re: ピラミッド作成 表示回数1回
オフトピック
> 文字列表示関数(printfなど)の使用回数を1回のみ
とは,
・ソースコードを眺めた感じ,関数呼び出し記述が1箇所しかない
なのか,それとも
・実行時に1回しか関数を呼ばない
なのか.
とは,
・ソースコードを眺めた感じ,関数呼び出し記述が1箇所しかない
なのか,それとも
・実行時に1回しか関数を呼ばない
なのか.
Re: ピラミッド作成 表示回数1回
なぜ、偶数しかダメなんですか?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;
}
問題は、ピラミッドを表示するプログラムとなっています。
#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回
三角形表示と表記した方のプログラムですが、printfとputcharの2箇所に表示関数が使われてるのでこれだと課題の条件に合わないです…
でも、立体ピラミッドは凄すぎますねw
でも、立体ピラミッドは凄すぎますねw
Re: ピラミッド作成 表示回数1回
そのプログラムは、単なるヒントです。無名 さんが書きました:三角形表示と表記した方のプログラムですが、printfとputcharの2箇所に表示関数が使われてるのでこれだと課題の条件に合わないです…
課題の条件に合うようにするのは、あなたです。
参考になりませんか?
Re: ピラミッド作成 表示回数1回
別のやり方を考えてみましょう。
putchar を 2個所以上書いてもいいのなら簡単ですよね。
char buf[10000]; というバッファを用意し、
puthar(c) の代わりに buf[k++] = c; とし、
最後に buf[k] = '\0'; としたら、
printf(buf); ひとつで目的達成になりませんか?
参考になったら、できたプログラムを貼り付けて
解決にしてください。
疑問点があれば、どんどん質問しましょう。
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');
}
}
puthar(c) の代わりに buf[k++] = c; とし、
最後に buf[k] = '\0'; としたら、
printf(buf); ひとつで目的達成になりませんか?
参考になったら、できたプログラムを貼り付けて
解決にしてください。
疑問点があれば、どんどん質問しましょう。
Re: ピラミッド作成 表示回数1回
「文字列表示関数」とはなんですか?
putchar関数をラップしたmyputchar関数を使えば、
putchar関数の使用はmyputchar関数の中の1箇所だけにできます。 そもそも、putcharは1文字だけを表示(標準出力に出力)する関数なので、文字列表示関数には該当せず、制限はかからないのではないでしょうか?
putchar関数をラップしたmyputchar関数を使えば、
putchar関数の使用はmyputchar関数の中の1箇所だけにできます。 そもそも、putcharは1文字だけを表示(標準出力に出力)する関数なので、文字列表示関数には該当せず、制限はかからないのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ピラミッド作成 表示回数1回
というか、標準出力に出力するだけで表示したとみなせるのであれば、素直に書けばいいでしょう。 コレジャナイというのであれば、ここでの「ピラミッド」の定義を教えてください。無名 さんが書きました:文字列表示関数(printfなど)の使用回数を1回のみでピラミッドを表示するプログラム
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ピラミッド作成 表示回数1回
シングルクォートを使っていますか?ダブルクォートではダメですよ。無名 さんが書きました:上記のプログラム、エラー(移植性のないポインタ変換)
がputcharの列にあって実行出来ないのですが…
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: ピラミッド作成 表示回数1回
box さんが書きました:シングルクォートを使っていますか?ダブルクォートではダメですよ。無名 さんが書きました:上記のプログラム、エラー(移植性のないポインタ変換)
がputcharの列にあって実行出来ないのですが…
あー…間違えてダブルクォート使ってるかもしれないです…
月曜日にまた学校いったら確認してみます
ご指摘ありがとうございます!
Re: ピラミッド作成 表示回数1回
こんな風にも書けます。
Borland C++ Compiler は、古い C にしか対応していないので、
int m, i; を for の前に移すか、bcc32 -P で
C++ としてコンパイルを行う必要があるでしょう。
putchar は次のようにも書けます。
#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;
}
int m, i; を for の前に移すか、bcc32 -P で
C++ としてコンパイルを行う必要があるでしょう。
putchar は次のようにも書けます。