Инвестиционная петля в С - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь создать сложный процентный цикл в C, который использует массив для хранения нескольких ставок доходности, как положительных (представляющих прибыль), так и отрицательных (представляющих убытки).

Итак, вы начинаете с основной суммы, и ей случайным образом назначается ставка из массива ставок.

Я использовал if/else внутри цикла for, чтобы определить, является ли показатель положительным или отрицательным, и что делать дальше. Моя проблема в том, что когда я запускаю, это выглядит так, как будто моя переменная количества внутри бита else (отрицательные ставки или убытки) не обновляется. Это проблема с указателем или я что-то упустил?

int main()
{
    int year;
    double amount, rate, principal = 100.0;
    double rates[10] = {0.025, 0.05, 0.075, 0.1, 0.125, 0.15, -0.25, -0.2, -0.15, -0.1};

    for(year = 1; year <= 100; year++)
    {
        rate = rates[rand() % 10];

        if(rate > 0.0)
        {
            amount = principal * pow(1.0 + rate, year);
        }
        else 
        {
            rate *= -1;
            amount = principal - (principal*rate);
        }

        printf("%4d%21.2f\n", year, amount);
    }
    return 0;
}

1 Ответ

1 голос
/ 04 июля 2019

Ваш код не имеет смысла.

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

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

amount *= (1.0 + rate);

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

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

        amount = amount - (amount * (-rate));

И давайте сделаем небольшую алгебру по этому вопросу:

        amount = amount + (amount * rate);

И еще немного приводит нас к

        amount = amount * (1.0 + (1.0 * rate));

, что совпадает с

        amount *= (1.0 + rate);

.Теперь, где я видел это раньше?

Итак, вы неправильно выполняли вычисления в обеих альтернативах, и вам никогда не требовались отдельные альтернативы.

Обратите внимание, чтовсе это предполагает, что вы инициализируете amount равным principal перед циклом. (В противном случае принципал вообще не будет входить в него.)

...