суммирование чисел с использованием арифметики с указателями - PullRequest
0 голосов
/ 03 мая 2018

Мне было дано задание написать код, который принимает числа в качестве входных данных от пользователя и предоставляет их сумму, в частности, с помощью арифметики с указателями, т. Е. Не допускается подстановка массива [i].

Ниже приведен код, который я написал, который был скомпилирован и даже запущен. Но почти всегда он дает сумму входных чисел как 0. Я пытался это исправить, но безрезультатно. Таким образом, я прошу о помощи, любая помощь очень ценится.

#include<stdio.h>
#define N 5

int sum_array( const int *p, int n)
{
 int  sum, a[N];
 sum = 0;

  for(p=&a[0]; p<&a[N]; p++)
  sum += *p;

 return sum;
 }


 int main()
{
  int a[N], *i,x;

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
   scanf("%d", i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(i,N);                       
  printf("the sum  is %d\n", x);

  return 0;
   }

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

в целом, при программировании код должен быть максимально простым, но все же завершенным.

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

Следующий предложенный код:

  1. чисто компилирует
  2. выполняет желаемую функциональность
  3. хранится очень просто
  4. правильно проверяет; и обрабатывает любые ошибки

А теперь предложенный код:

#include <stdio.h>    // scanf(), printf(), fprintf(), stderr
#include <stdlib.h>   // exit(), EXIT_FAILURE

#define N 5


int main( void )
{
    int num = 0;
    int sum = 0;

    printf("Enter %d Numbers: ", N);

    for(size_t i=0; i<N; i++)
    {
        if( scanf("%d", &num) != 1 )
        {
            fprintf( stderr, "failed to read number\n" );
            exit( EXIT_FAILURE );
        }

        // implied else, scanf successful
        sum += num;
    }

    printf( "the sum  is %d\n", sum );

    return 0;
}
0 голосов
/ 03 мая 2018
int sum_array( const int *p, int n)
{
    int  sum = 0, i = 0;

    for(i = 0; i < n ; i++)
       sum += *(p+i);

    return sum;
}

int main(void)
{
   int a[N], i = 0, x = 0;

   printf("Enter %d Numbers: ", N);

   for(i=0; i<N; i++)
   scanf("%d", a+i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);                       
   printf("the sum  is %d\n", x);


   return 0;
}
0 голосов
/ 03 мая 2018

In x= sum_array(i,N); i - итератор вашего цикла, поэтому после завершения цикла он указывает на первую позицию после массива.

Вместо этого вы должны передать исходный массив x= sum_array(a,N);

В функции sum вы просто отбрасываете переданный указатель и заменяете его на локальный a[].

int sum_array( const int *p, int n)
{
  int sum = 0;
  int *end = &p[n]; // first element after the array.

  for(; p<end; p++) // just use p because you don't need the reference to the start of the array
  {
    sum += *p;
  }
  return sum;
}

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

#include "stdio.h"

#define N 5

int sum_array( const int *p, int n)
{
  int sum = 0;
  const int *end = p+n; // first element after the array.

  for(; p<end; p++) 
  {
    sum += *p;
  }

  return sum;
}

 int main()
{
  int *a, *i, x;

  a = malloc(N * sizeof(*a));

  if (a == NULL)   
    exit(-1);

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
  {
    scanf("%d", i);
  }


   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}
0 голосов
/ 03 мая 2018

Осторожно, вы объявляете массив int a[N] в main и sum_array. Они находятся в разных областях, поэтому они представляют собой разные массивы (и тот из sum_array никогда не инициализируется, поэтому чтение его вызывает неопределенное поведение).

Правильный путь - передать массив вместе с использованной длиной:

Вот исправленная версия:

#include<stdio.h>
#define N 5

int sum_array( const int *a, int n)    // a points to a array of at least n elements
{
 int  sum = 0;                         // initialize at definition time

  for(const int *p=a; p<&a[n]; p++)    // have the pointer p take all values from a
  sum += *p;

 return sum;
 }


 int main()
{
  int a[N], *i,x;

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
   scanf("%d", i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}

Наконец, это в основном дело вкуса, но меня слишком часто пытали добавить инструкцию в цикл for без фигурных скобок, поэтому я настоятельно рекомендую использовать всегда фигурные скобки для циклов:

  for(i=a; i<a+N; i++) {
      scanf("%d", i);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...