Подтвердить что ты не робот

Есть ли ошибка вычисления в моей программе?

По-видимому, в моей программе есть ошибка вычисления, но я просто не могу ее найти.

Единственная информация, которую я имею о том, почему возникает ошибка вычисления, - это следующая обратная связь, предоставленная MyProgrammingLab (сайт, который автоматически проверяет код, чтобы увидеть, является ли он неправильным или нет). Я не знаю, какие значения были введены для годовой смертности и годовой рождаемости, чтобы вызвать ее. Может быть, я прав, но MyProgrammingLab ошибается? Честно говоря, все мои собственные тесты кажутся прекрасными.

Ожидаемый результат:

Year 1: 200 176
Year 2: 176 154
Year 3: 154 135
Year 4: 135 118
Year 5: 118 103
Year 6: 103 90
Year 7: 90 79

Фактический выход:

Year 1: 200 199
Year 2: 199 198
Year 3: 198 197
Year 4: 197 196
Year 5: 196 195
Year 6: 195 194
Year 7: 194 193

Я построил программу в соответствии со следующим назначением:

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

  • Начальный размер популяции (минимум 2) (Prompt Enter starting size:)
  • Годовая рождаемость (Prompt Enter annual birth rate:)
  • Годовая смертность (Подсказка Enter annual death rate:)
  • Количество лет для отображения (минимум 1) (Подсказка Enter years to display:)

Затем программа должна отображать начальную популяцию и прогнозируемую популяцию в конце каждого года. Он должен использовать функцию, которая вычисляет и возвращает прогнозируемый новый размер населения через год. Формула

  N = P(1 + B)(1 - D) 

где N - новый размер популяции, P - предыдущий размер популяции, B - коэффициент рождаемости, D - коэффициент смертности. Годовой коэффициент рождаемости и смертность - это типичное число рождений и смертей в год на 1000 человек, выраженное в десятичной форме. Так, например, если, как правило, около 32 рождений и 26 смертей на 1000 человек в данной популяции, коэффициент рождаемости составит 0,32, а коэффициент смертности составит 0,26.

Мой код:

#include <iostream>
using namespace std;

int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {
    float annualBirthRate2 = annualBirthRate / 1000;
    float annualDeathRate2 = annualDeathRate / 1000;

    int newpopulation = population * (1 + annualBirthRate2) * (1 - annualDeathRate2);
    return newpopulation;
}

int main() {

    int populationStartingSize = 0;
    float annualBirthRate = 0;
    float annualDeathRate = 0;
    int numberOfYearsToDisplay = 0;

    do  {
        cout << "Enter starting population size: ";
        cin >> populationStartingSize;
        cout << "Enter annual birth rate: ";
        cin >> annualBirthRate;
        cout << "Enter annual death rate: ";
        cin >> annualDeathRate;
        cout << "Enter years to display: ";
        cin >> numberOfYearsToDisplay;
    } while (!(populationStartingSize >= 2) || !(numberOfYearsToDisplay >= 1));

    int population;

    for (int i = 1; i <= numberOfYearsToDisplay; i++) {
        cout << "Year " << i << ": " << populationStartingSize << " ";
        population = projectedNewSize(populationStartingSize, annualBirthRate, annualDeathRate);
        cout << population << endl;
        populationStartingSize = population;
    }

    system("pause");
    return 0;
}
4b9b3361

Ответ 1

Итак, ответ

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

Таким образом, удаление этих строк

float annualBirthRate2 = annualBirthRate / 1000;
float annualDeathRate2 = annualDeathRate / 1000;

и изменения

int newpopulation = population * (1 + annualBirthRate2) * (1 - annualDeathRate2);

к

int newpopulation = population * (1 + annualBirthRate) * (1 - annualDeathRate);

Итак, окончательный код будет выглядеть так:

#include <iostream>
using namespace std;

int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {

    int newpopulation = population * (1 + annualBirthRate) * (1 - annualDeathRate);
    return newpopulation;
}

int main() {

    int populationStartingSize = 0;
    float annualBirthRate = 0;
    float annualDeathRate = 0;
    int numberOfYearsToDisplay = 0;

    do  {
        cout << "Enter starting population size: ";
        cin >> populationStartingSize;
        cout << "Enter annual birth rate: ";
        cin >> annualBirthRate;
        cout << "Enter annual death rate: ";
        cin >> annualDeathRate;
        cout << "Enter years to display: ";
        cin >> numberOfYearsToDisplay;
    } while (!(populationStartingSize >= 2) || !(numberOfYearsToDisplay >= 1));

    int population;

    for (int i = 1; i <= numberOfYearsToDisplay; i++) {
        cout << "Year " << i << ": " << populationStartingSize << " ";
        population = projectedNewSize(populationStartingSize, annualBirthRate, annualDeathRate);
        cout << population << endl;
        populationStartingSize = population;
    }

    system("pause");
    return 0;
}

Вы, ребята, обсуждаете в разделе комментариев и оставляете вопрос без ответа.

Ответ 2

int projectedNewSize(float population, float annualBirthRate, float annualDeathRate) {

    int newpopulation = roundf(population * (1.0 + annualBirthRate) * (1.0 - annualDeathRate);
    return newpopulation;
}

В калькуляторе вам не нужно учитывать коэффициент 1000, если он уже выполнен во входных значениях. Но если вам нужна "самая точная" таблица, вы должны округлить ценности в правильном уме. Возврат вычисления - это поплавок. Если вы назначаете его int - это всегда будет усечено. Небольшое различие, которое будет перенесено из одного цикла в другое, заканчивается в некоторых разумных различиях с ожидаемыми значениями в конце. Наиболее правильным способом было бы изменить тип "newcalculation" на float и round только при отображении значения.

Ответ 3

N = P + BP - DP

Программа запросила уровень рождаемости и смертности, предположим, что пользователь ввел 5 для 5%. Здесь необходимо рассчитать базовую математику 5/100 = 0,05

Формула сейчас

N = P + (BP/100) - (DP/100)

замещать

    float annualBirthRate2 = annualBirthRate / 1000;
    float annualDeathRate2 = annualDeathRate / 1000;

    int newpopulation = population * (1 + annualBirthRate2) * (1 - annualDeathRate2);

С

    int newpopulation = population + (population * birthRate/100) - (population * deathRate/100)