умножение элементов массива - преобразование для l oop в цикл while - PullRequest
0 голосов
/ 28 марта 2020

поэтому я понял, как написать это, используя для l oop

int mult_for(int* array, int len) {
    int mult = 1;
    for (int i = 0; i < len; i++) {
        mult *= array[i];
    }
    return mult;
}

, но я не уверен, как go сделать то же самое, используя while.

int mult_while(int* array, int len) {
    int mult = 1; 
    while (int i < len){
    mult *= array[i]
    }
    return 0;
}

В настоящее время у меня есть это, но я не уверен, как продолжить оттуда. Синтаксис c все еще новый, так что это тоже не поможет.

Ответы [ 4 ]

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

Я впервые вижу, что int определитель типа как условие над while l oop. В любом случае вам нужно увеличить счетчик, то есть i, один за другим, чтобы перебрать массив. Он останавливается, когда i == len, как в вашем примере for-loop.

int mult_while(int* array, int len) 
{
    int mult = 1; 
    int i = 0;
    while (i < len) {
        mult *= array[i];
        ++i;
    }
    return mult; // the result must be returned in lieu of zero
}
1 голос
/ 28 марта 2020

Для l oop используется синтаксис for(initialization; condition; increment/decrement) { body }, который является общим правилом для большинства языков.

Вышеупомянутые три этапа ( инициализация , условие и увеличение / уменьшение ) присутствуют во всех вариациях l oop, а для , в то время как l oop, они следуют этому порядку:

initialization

while(condition)
{ 
  body
  increment/decrement
}

Для вашего случая:

    int i = 1; //initialization
    while (i < len) //while(condition)
    {
      mult *= array[i]; //body
      i++; //increment
    }

Обратите внимание, что:

  • Инициализация здесь относится к инициализации переменной (переменных), которая будет использоваться внутри l oop. Может быть несколько переменных.
  • Увеличение / уменьшение может быть до / после тела l oop.
  • Вы также можете иметь некоторое время l oop без определения дополнительного l oop переменные. Например, в вашем случае, если вы используете предопределенную переменную len в своем коде, вы можете использовать ее как условие для l oop, пока значение не станет равным нулю с помощью while(len--) { body }, тем самым уменьшая потребность в дополнительной переменной и ее последующем операторе увеличения / уменьшения.
0 голосов
/ 28 марта 2020

Для начала функция должна быть объявлена ​​как

long long int mult_while( const int *array, size_t len );

, то есть тип возвращаемого значения должен быть long long int, чтобы избежать переполнения. И указатель должен быть объявлен с квалификатором const, потому что массив не изменяется внутри функции. Размер массива должен иметь тип size_t,

Вам не нужно объявлять еще одну локальную переменную, кроме параметров, как это было сделано в for l oop в вашей первой реализации функции.

Функция может быть реализована следующим образом, используя while l oop.

long long int mult_while( const int *array, size_t len )
{
    long long int mult = len == 0 ? 0 : 1;

    while ( len-- ) mult *= array[len];

    return mult;
}

Обратите внимание, что в общем случае пользователь может передать длину массива, равную 0. В в этом случае будет логически непротиворечивым возвращать 0.

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

#include <stdio.h>
#include <limits.h>

long long int mult_while( const int *array, size_t len )
{
    long long int mult = len == 0 ? 0 : 1;

    while ( len-- ) mult *= array[len];

    return mult;
}

int main(void) 
{
    int a[] = { INT_MAX, INT_MAX };
    const size_t N = sizeof( a ) / sizeof( *a );

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

    putchar( '\n' );

    printf( "The product of the array elements is equal to %lld\n", mult_while( a, N  ) );

    return 0;
}

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

2147483647 2147483647 
The product of the array elements is equal to 4611686014132420609

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

Это единственная реализация функции из представленных здесь в ответах, более или менее правильная.

0 голосов
/ 28 марта 2020

Вы можете легко сделать это, непрерывно уменьшая len, пока оно не достигнет 0:

int mult_while(int const* array, int len) {
    int mult = 1;
    while(len--) {
        mult *= *array++;
    }
    return mult;
}
...