Получив массив целых чисел, верните новый массив, чтобы каждый элемент с индексом i .... code не работал - PullRequest
0 голосов
/ 19 марта 2020

На вопрос: «Учитывая массив целых чисел, верните новый массив так, чтобы каждый элемент с индексом i нового массива был произведением всех чисел в исходном массиве, кроме одного в i», мой код в C: «Код просто не будет выполняться!» Как вы думаете, в чем здесь проблема?

int main()
{
    int no, i,j, product = 1;
    int* ar1 = (int*)malloc(sizeof(int) * no);
    int* ar2 = (int*)malloc(sizeof(int) * no);
    printf("Enter the number of elements in array: \t");
    scanf("%d", &no);

    printf("Enter the elements: \n");
    for(i=0; i<no; i++){
    scanf(" %d", &ar1[i]);
    }

    for(i=0; i<no; i++){
        for(j=0; j<no; j++){
            while(j!=i){
                product=ar1[i]*product;
            }
        }
        ar2[i]=product;
    }
    for(i=0; i<no; i++){
            printf("The output array is: \n");
        printf("%d", ar1[i]);
    }
return 0;

}

Ответы [ 3 ]

2 голосов
/ 19 марта 2020

Эти объявления

int no, i,j, product = 1;
int* ar1 = (int*)malloc(sizeof(int) * no);
int* ar2 = (int*)malloc(sizeof(int) * no);

вызывают неопределенное поведение, поскольку переменная no не инициализирована и имеет неопределенное значение.

Сначала вы должны спросить пользователя, сколько элементов в массиве он хочет и только после этого для динамического выделения массивов или использования массивов переменной длины.

Эти циклы

for(i=0; i<no; i++){
    for(j=0; j<no; j++){
        while(j!=i){
            product=ar1[i]*product;
        }
    }
    ar2[i]=product;
}

также недопустимы. Например, внутреннее время l oop может быть бесконечным. И переменная product должна быть инициализирована в каждой итерации внешнего l oop.

В этом l oop

for(i=0; i<no; i++){
        printf("The output array is: \n");
    printf("%d", ar1[i]);
}

этот вызов pf printf

    printf("The output array is: \n");

должен быть вне l oop, и в этом вызове printf

    printf("%d", ar1[i]);

вы должны использовать ar2 вместо ar1.

Также объявите переменную где Они используются. Иначе трудно понять их значения, когда вы не видите сразу, где они используются.

Вот демонстрационная программа.

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
    printf( "Enter the number of elements in array: " );

    size_t n = 0;

    scanf( "%zu", &n );

    int *a1 = malloc( n * sizeof( int ) );
    long long int *a2 = malloc( n * sizeof( long long int ) );

    printf( "Enter the elements: " );

    for ( size_t i = 0; i < n; i++ )
    {
        scanf( "%d", &a1[i] );
    }

    for ( size_t i = 0; i < n; i++ )
    {
        a2[i] = 1;
        for ( size_t j = 0; j < n; j++ )
        {
            if ( i != j ) a2[i] *= a1[j];
        }
    }

    printf( "The output array is: " );

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%lld ", a2[i] );
    }

    putchar( '\n' );

    free( a1 );
    free( a2 );

    return 0;
}

Вывод программы может выглядеть как

Enter the number of elements in array: 10
Enter the elements: 1 2 3 4 5 6 7 8 9 10
The output array is: 3628800 1814400 1209600 907200 725760 604800 518400 453600 403200 362880 

Обратите внимание на то, что поскольку произведение элементов массива может быть очень большим, тогда лучше выделить второй массив как элемент типа long long int, чтобы избежать переполнения.

1 голос
/ 19 марта 2020

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

    printf("Enter the number of elements in array: \t");
    scanf("%d", &no);
    int* ar1 = (int*)malloc(sizeof(int) * no);
    int* ar2 = (int*)malloc(sizeof(int) * no);

секунду, это l oop является инфинитивом l oop:

     for(i=0; i<no; i++){
        for(j=0; j<no; j++){
            while(j!=i){
                product=ar1[i]*product;
            }
        }
        ar2[i]=product;
    }

когда i=0 и j=0, вы введете эти l oop и j==i, чтобы не вводить какое-то время, но когда j станет 1, значит j!=i вы введете время, и оно никогда не закончится, потому что это 1 != 0 всегда верно.

1 голос
/ 19 марта 2020

Есть несколько ошибок. Я упомянул в коде в качестве комментариев для ясности. Также проверка, что malloc возвращаемое значение не равно нулю, не является плохой идеей.

int main()
{
    int no, i, j, product = 1;
    int* ar1;
    int* ar2;

    printf("Enter the number of elements in array: \t");
    scanf("%d", &no);

    // FIX 1: using malloc after reading in no
    ar1 = malloc(sizeof(int) * no);
    ar2 = malloc(sizeof(int) * no);

    printf("Enter the elements: \n");
    for(i = 0; i < no; i++){
        scanf(" %d", &ar1[i]);
    }
    for(i = 0; i < no; i++) {
        for(j = 0; j < no; j++) {
            if (j != i) { // FIX 2: while caused infinite loop, if needed here
                product = ar1[j] * product; // FIX 3: you need to use j as index
            }
        }
        ar2[i] = product;
        product = 1; // FIX 4: you have to set product to 1 for correctness
    }
    for(i = 0; i < no; i++) {
        printf("The output array is: %d\n", ar2[i]); // FIX 5: you used ar1 here, not ar2
    }

    // FIX 6: freeing the allocated memory
    free(ar1);
    free(ar2);

    return 0;
}
...