Печать треугольника паскаль в С

void Pascal(int n){
    int i,j;
    int a[100], b[100];
    a[0]= 1;

    for(i = 0; i <= n; i++){
        printf(" ");
        b[i]=1;
        for(j = 0; j <= i; j++){
            if (j <= 1) a[j-1]=0;
            b[j] = a[j-1] + a[j];
            printf("%d", b[j]);
        }
        for (j = 0; j <= i; j++){
            a[j] = b[j];
        }
        printf("%d \n");
    }
}    

Это функция, которую я пытался построить; подскажите пожалуйста что с ним не так?

4 ответа

В строке 11 вы используете -1 в качестве индекса. Проверьте это сначала. Проверьте код

void Pascal(int n){
    int i,j;
    int a[100]={0}, b[100]={0};
    a[1]= 1;
    for (i = 1; i <= n; i++){
        printf(" ");
        b[i]=1;
        for (j = 1; j <= i; j++){
            if (j <= 1) a[j-1]=0;
            b[j] = a[j-1] + a[j];
            printf("%d ", b[j]);
        }
        for (j = 1; j <= i; j++){
            a[j] = b[j];
        }
        printf("\n");
    }
}

Я начал индексирование с 1.

Я сделал похожую программу:

#include <stdio.h>


int nk (int n, int k)
{
    int erg = 0;

    erg = fak(n)/(fak(k)*fak(n-k));
    return (erg);
}

int fak (int n)
{
    if (n==0)
        return 1;
    if (n==1)
        return 1;
    else
        return n = n*fak(n-1);

}

int main ()
{
    int n = 0;
    int k = 0;
    int s = 0; 
    int i = 0; 
    int a = 0; 
    printf ("How many rows: ");
    scanf ("%d", &a);
    s = (a-1);
    printf ("\nPascal'sches Dreieck\n");


    for (n = 0; n <= (a-1); n++)
    {

        for (i=0; i<=s; i++)
            printf("  ");

        for (k=0; k<=n; k++ )
        {
            if (nk(n,k)<=10)
                printf (" %d  ", nk(n,k));
            else
                printf ("  %d", nk(n,k));
        }
        s--;
        printf ("\n");

    }
        getch();
    return 0;
}

подскажите пожалуйста что с ним не так?

С моей точки зрения, в общем, что не так с этим, что вы копируете содержимое массива b в массив a на каждой итерации:

for (j = 0; j <= i; j++) {
    a[j] = b[j];
}

Это именно та ненужная перестановка памяти, которую нам позволяют избегать указатели! Итак, давайте обратимся к этой проблеме, и пока мы занимаемся этим, исправим все другие маленькие ошибки в коде:

void pascal(int n) {
    int a[100], b[100]; // size appropriately or allocate dynamically

    int *a_ptr = a, *b_ptr = b;

    for (int i = 0; i < n; i++) {

        b_ptr[0] = b_ptr[i] = 1; // initialize both ends

        printf("%d ", b_ptr[0]); // print the left end

        for (int j = 1; j < i; j++) { // compute & print the middle
            b_ptr[j] = a_ptr[j] + a_ptr[j - 1];

            printf("%d ", b_ptr[j]);
        }

        if (i > 0) { // print the right end if it's not also the left end
            printf("%d", b_ptr[i]);
        }

        printf("\n");

        int *temporary = a_ptr; // swap a_ptr and b_ptr
        a_ptr = b_ptr;
        b_ptr = temporary;
    }
}

Попробуйте этот код!

Я также прилагаю скриншот вывода.

/ ************************************************* *****************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>
void Pascal(int n);
int main()
{
    int rows, coef = 1, space;

    printf("Enter number of rows: ");
    scanf("%d",&rows);

    Pascal(rows);

    return 0;

}
void Pascal(int rows)
{
    int coef = 1, space;
     for(int i=0; i<rows; i++)
    {
        for(space=1; space <= rows-i; space++)
            printf("  ");

        for(int j=0; j <= i; j++)
        {
            if (j==0 || i==0)
                coef = 1;
            else
                coef = coef*(i-j+1)/j;

            printf("%4d", coef);
        }
        printf("\n");
    }

}

Другие вопросы по тегам