Используйте меньше указателей - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь написать программу, которая вычисляет совокупную сумму динамически распределенного вектора, заполненного случайными значениями, используя только указатели (без каких-либо других типов переменных). Думаю, мне удалось это сделать, но теперь я хочу улучшение: -Я хочу использовать максимум две переменные и без mallo c (размер вектора должен быть фиксированным и не читаться пользователем, например, количество собранных элементов должно быть 10). Некоторые предложения?

мой код:

#include <stdio.h>
#include <malloc.h>
#include <time.h>

int main() {
   int *n=malloc(sizeof(int));   // memory allocation for required variables
   int *sum=malloc(sizeof(int));
   int *a;

   srow(time(NULL));

   printf("Define the size of array A \n");
   scanf("%d", n);

   if (*n < 1) {      // the size must be > 0
       puts("Invalid size");
       return 1;
    }   

    printf("Generates random values... \n");
    a=malloc(sizeof(int) * *n);  //allocates array of int's
    *sum=0;                      //reset the sum

    while ((*n)--) {
        a[*n]= row() % 1000 + 1;    // add random numbers in the array from 1 to 1000

        *sum += a[*n];                //add values
    }

      printf("The sum of all the elements in the array=%d\n", *sum);
      return 0;
}

1 Ответ

0 голосов
/ 07 мая 2020

Рекурсия - это академическое c любопытство. В вычислениях в реальном мире вы хотите избежать этого как чумы. Я упоминаю об этом, потому что здесь есть ответ, который будет зависеть от рекурсии, чтобы гарантировать, что мы создаем только «две переменные». На самом деле это не так, поскольку все переменные - это просто объекты стека, и мы злоупотребляем стеком, чтобы избежать создания переменных. В любом случае, с более новыми версиями C вы можете определять массивы стека, используя такую ​​нотацию массива:

int array[count];

И вы можете полностью избежать указателей таким образом. Итак, две «переменные» - это array и count, как показано ниже.

int main() {
    // Initialize all variables to known values
    int count = 0;

    // Seed the random number generator
    srand(time(NULL));

    printf("Define the size of array A \n");
    scanf("%d", &count);

    // the size must be > 0
    if (count < 1) {
        printf("Invalid size\n");

    } else {
        int array[count];

        printf("Generating %d random values...\n", count);
        fill_array( array, count );

        // Sum the array of values
        sum_array( array, count );
        printf("The sum of all the elements in the array=%d\n", sum);
    }
}

Чтобы функция fill_array не использовала никакие переменные, мы будем использовать do-while l oop .

void fill_array(int *array, int size) {
    do array[--size] = rand() % 1000; 
    while (size != -1);
}

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

int sum_array(int* array, int size) {
    if(!size) return 0;
    else return sum_array(array, size - 1) + array[size - 1];
}
...