Экранирующий цикл при добавлении в динамический массив - C - PullRequest
2 голосов
/ 31 января 2010

В настоящее время моя программа позволяет пользователю вводить 5 целых чисел, которые используются для создания среднего числа. Это значение равно пяти, поскольку после ввода пятого числа цикл прерывается.

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

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

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

Надеюсь, мой пример объясняет это лучше.

#include <stdio.h>
#include <string.h>

void main()
{
    int i = 0;
    int arrayNum[5];
    int temp = 1;
    int anotherTemp = 0;
    int answer = 0;


    printf("Enter as many numbers as you like, when finished enter a negative number\n");

    for(i = 0; i < 5; i++)
    {
        scanf("%d", &temp);

        arrayNum[i] = temp;

        anotherTemp = anotherTemp + arrayNum[i];
    }

    answer = anotherTemp / 5;

    printf("Average of %d,%d,%d,%d,%d = %d",arrayNum[0],arrayNum[1],arrayNum[2],arrayNum[3],arrayNum[4],answer);
}

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

Каков наилучший способ обойти это и позволить пользователю ввести столько цифр, сколько необходимо?

Редактировать: Хотя мне нужно было использовать массив, я решил, что в этом нет необходимости, поскольку решение намного проще, не ограничиваясь им.

Ответы [ 4 ]

3 голосов
/ 31 января 2010

Если вы пытаетесь вычислить среднее значение, вам не нужно сохранять числа. Спасите себя от забот о массиве. Просто накапливайте (добавляйте) каждое число к единому итогу, считайте каждое число, а затем делите, когда вы закончите. Вам нужны только две переменные.

С этим методом вы не рискуете переполнить массив, поэтому вы можете использовать цикл while ... while (temp! = -1)

3 голосов
/ 31 января 2010

С точки зрения простоты кода вы можете проверить функцию realloc(); Вы можете выделить исходный массив некоторого размера, и если пользователь вводит слишком много номеров, позвоните realloc(), чтобы получить себе больший массив и продолжить оттуда.

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

int input;
int sum = 0;
int count = 0;
int average;

while (1) {
    scanf("%d", &input);
    if (input < 0) {
        break;
    }
    sum += input;
    count++;
}

average = sum / count;
2 голосов
/ 31 января 2010

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

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

Что-то вроде это .

0 голосов
/ 31 января 2010

Используйте структуру данных динамического массива, такую ​​как Vector в Java (java.util.Vector).

Вы можете легко реализовать такой динамический массив:

  • выделить массив размером N
  • как только вам потребуется больше элементов, чем N, выделите новый больший массив (например, с размером N + 10), скопируйте содержимое старого массива в новый массив и установите рабочую ссылку на новый массив и ваш массив переменная размера N к новому размеру (например, N + 10). Освободите старый массив.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...