ошибка в логике для отображения суммы массива - PullRequest
0 голосов
/ 29 октября 2019

В) Получите ввод в 1D-массив от пользователя, создайте новый массив для суммы его значений, например, если переданный массив: |1 ||2 ||3 |тогда он должен напечатать | 1 ||3 || 6 |, он будет плюс содержимое массива, т.е. 1 + 2 = 3, 1 + 2 + 3 = 6, он не должен изменять значение массива [0]. Я пытался создать программу, но у него есть недостатки

#include <stdio.h>
void subtotal (float[], int);
int main()
{
    int n,i;
    printf("Enter the size of array"); // taking size of array from user
    scanf("%d",&n);
    float a[n];
    for (i=0;i<n;i++) // loop for entering elements of array
    {
        printf("Enter the element of array");
        scanf("%f",&a[i]);
    }
    subtotal(a,n); // function call
}
void subtotal (float a[],int n)  // function definition
{
    int i,j;
    float c;
    float sum=0,minus=0;
    c = a[0];
    for (i=0;i<n;i++)  // nested loop to calculate sum of array element
    {
        sum = sum - minus;
        for (j=0;j<=i;j++) // this loop is used to store sum value
        { 

        sum = sum+a[i];
        minus = sum;
      }
    a[i] = sum; // new array element a[i] will be sum;  
     sum = 0; 
    if (i==0) // if i==0 that means we don't need to change the first value of array;
    {
        a[i] = c; // a[0] was stored in extra variable 'c' , hence a[i] = c;
    }
}
    for (i=0;i<n;i++) // this loop to print the updated array
    {
        printf("%.2f \t",a[i]);
    }
}

скажите мне, какие изменения я могу внести, чтобы исправить недостатки.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Обновлять все, кроме первого элемента массива с помощью скользящей суммы, гораздо проще, чем вы думаете. Следующая версия subtotal() захочет, чтобы вы захотели:

void subtotal(float a[], int n)  // function definition
{
    int i;
    float sum = a[0]; // Initialize our sum to the FIRSTelement
    for (i = 1; i < n; ++i) { // Now, for all OTHER elements ...
        sum += a[i]; // ... add the original value of a[i] to the running sum ...
        a[i] = sum;  // ... and THEN replace that element with the running sum.
    }

    for (i = 0; i < n; i++) // this loop to print the updated array
    {
        printf("%.2f \t", a[i]);
    }
}

(Я хотел бы добавить, что я согласен с предложением Влада о том, что выходная часть функции лучше помещена в тело main.)

Пожалуйста, не стесняйтесь спрашивать о любых дальнейших разъяснениях и / или объяснениях.

0 голосов
/ 29 октября 2019

Для начала функция должна сделать одну вещь: обновить массив в соответствии с требованием.

Это основная функция, в которую должен быть выведен обновленный массив.

Ваша реализация функции неяснаи слишком сложно.

Например, в комментарии к этому оператору if

if (i==0) // if i==0 that means we don't need to change the first value of array;
{
    a[i] = c; // a[0] was stored in extra variable 'c' , hence a[i] = c;
}

написано, что

// if i == 0, что означаетнам не нужно изменять первое значение массива;

, и в то же время значение a[0] обновляется.

То же самое делается в приведенном выше утвержденииэто оператор if

a[i] = sum; // new array element a[i] will be sum; 

Функцию можно определить намного проще следующим образом, как показано в демонстрационной программе ниже.

#include <stdio.h>

void subtotal( float a[], size_t n )
{
    for ( size_t i = 1; i < n; i++ )
    {
        a[i] += a[i-1];
    }
}    

int main(void) 
{
    float a[] = { 1.0f, 2.0f, 3.0f };
    const size_t N = sizeof( a ) / sizeof( *a );

    subtotal( a, N );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%.1f ", a[i] );
    }

    putchar( '\n' );

    return 0;
}

Вывод программы:

1.0 3.0 6.0 

Если вам нужно поместить частичные суммы в другой массив, тогда функцию можно определить следующим образом:

#include <stdio.h>

void subtotal( float a[], size_t n, float b[] )
{
    if ( n != 0 )
    {
        b[0] = a[0];

        for ( size_t i = 1; i < n; i++ )
        {
            b[i] = a[i] + b[i-1];
        }
    }       
}

int main(void) 
{
    float a[] = { 1.0f, 2.0f, 3.0f };
    float b[sizeof( a ) / sizeof( *a )];
    const size_t N = sizeof( a ) / sizeof( *a );

    subtotal( a, N, b );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%.1f ", b[i] );
    }

    putchar( '\n' );

    return 0;
}

Опять вывод программы:

1.0 3.0 6.0 
...