C言語関係掲示板

過去ログ

No.299.パスカルの三角形を作るプログラム

[戻る] [ホームページ]

No.1800

救いの手を差し伸べてもらえませんか?
投稿者---C言語ド素人10段(2002/06/25 01:23:13)


パスカルの三角形を作るプログラムを書いてみましょう。
 最初は1です。
 両端はいつも1です。
それ以外は
  (上の数)+(左上の数)
を計算して書き込みます。
とりあえず7行ぐらいを計算してみましょう。


11
121
1331
14641
15101051
1615201561

必修講義のC言語の課題で上記のような問題が出題されました。
講義は5月まではついて行けたのですが(for文while文を扱った範囲)
今月に入り講義について行けず、
正直どう書けばいいのかさっぱり分かりません!
どなたか奇特な方いらっしゃいましたら
どうか宜しくお願い致します!

a[1][1]
a[2][2]a[2][2]
a[3][1]a[3][2]a[3][3]・・・

a[i][j]a[i][j+1]

など部分的にちょっと分かるかな?というぐらいで
このプログラムを完成する力はありません。
お助け願いますです。


No.1802

Re:救いの手を差し伸べてもらえませんか?
投稿者---差猫(2002/06/25 09:37:50)


これ、「二次元配列を使わなければならない」等のルールはあるんでしょうか?
なければ一次元配列だけでできそうです。


No.1803

Re:救いの手を差し伸べてもらえませんか?
投稿者---差猫(2002/06/25 11:14:03)


VBで作ってみましたが、
どうも二次元配列を使った方が簡単なようなので一次元配列の話は無視してください。


VBではこんな感じ

<pre>
Dim i As Integer
Dim line As Integer
Dim tmp1 As Long
Dim tmp2 As Long
Dim tri(0 To 9) As Long

tri(0) = 1
Me.Print tri(0)
For line = 1 To 9
Me.Print tri(0);
tmp1 = tri(0)
i = 1
While i <= line - 1
tmp2 = tmp1 + tri(i)
Me.Print tmp2;
tmp1 = tri(i)
tri(i) = tmp2
i = i + 1
Wend
tri(line) = 1
Me.Print tri(line)
Next line
</pre>

No.1805

ヒント
投稿者---差猫(2002/06/25 15:21:42)


ただ単純に二次元配列の値を表示することはできますか?
a[0][0]からa[6][6]までに適当な数値(全部同じ値でもいい)を入れてそれを表示する、といった感じです。
これができないと何も始まりません。
この場合は7行の配列なので7行に分けて出力します。

例えばa[0][0]からa[6][6]のそれぞれに15という数値を入れて以下のように出力します。
15 15 15 15 15 15 15
15 15 15 15 15 15 15
15 15 15 15 15 15 15
15 15 15 15 15 15 15
15 15 15 15 15 15 15
15 15 15 15 15 15 15
15 15 15 15 15 15 15


一気に全部作ろうとすると何から始めていいかわからなくなるので
私の場合はこのように工程ごとに分けて少しずつ作っていきます。



No.1807

Re:救いの手を差し伸べてもらえませんか?
投稿者---かずま(2002/06/25 18:25:40)


> パスカルの三角形を作るプログラムを書いてみましょう。

ちょっと遊んでみました。このやり方は非常に効率が悪いのでお勧めできません。
関数の再帰呼び出しを使っているので、講義の課題には不適切な解答です。
#include <stdio.h>

int comb(int n, int r)
{
    return (r == 0 || r == n) ? 1 : comb(n-1, r-1) + comb(n-1, r);
}

#define N  12

int main()
{
    int i, j, n;

    for (i = 0; i <= N; i++) {
        printf("%*s", (N-i)*3, "");
        for (j = 0; j <= i; j++)
            printf("%6d%s", comb(i, j), "\n"+(j!=i));
    }
    return 0;
}



No.1809

Re:救いの手を差し伸べてもらえませんか?
投稿者---Aki(2002/06/25 23:22:22)


#include <stdio.h>
void print_line(const int a[], int n, int nline)
{
    int i;

    printf("%*s", (nline - n) * 2, "");
    for (i = 0; i < n; i++)
        printf("%4d", a[i]);
    putchar('\n');
}

#define MAX     15

void print_pascal(int nline)
{
    int a[MAX] = {0};
    int i, j;

    a[0] = 1;
    for (i = 0; i < nline; i++) {
        for (j = i; j > 0; j--)
            a[j] += a[j-1];
        print_line(a, i + 1, nline);
    }
}

int main(void)
{
    int nline;

    while (printf("How many lines?"), scanf("%d", &nline) == 1)
        print_pascal(nline);
    return 0;
}


No.1812

差猫さん、かずまさん、Akiさん
投稿者---C言語ド素人10段(2002/06/25 23:58:12)


ご丁寧にどうもありがとうございましたm(__)m
自分の出来の悪さを痛感するとともに
あんなぶっきらぼうな質問に懇切丁寧な回答が
頂けてとても感謝しています。
7月23日に最終課題が出題されます。
恐らくまたお世話になると思いますので
お手すきでしたらまたよろしくお願い致します。