Вложенный Для l oop вечно работает? - PullRequest
0 голосов
/ 22 марта 2020

У меня небольшая проблема с поиском вложенного для l oop здесь. Вот проблема:

Население Ирландии составляет 4,8 миллиона человек и растет со скоростью 7% в год. Напишите программу для определения и отображения населения через 10 лет. Ваша программа также должна отображать количество лет, которые, по прогнозам, численность населения превысит 5 млн.

И вот что я кодировал до сих пор:

    double pop = 4.8;
    int years = 0;
    for (int i = 0; i < 10; i++)
    {
        pop += (pop / 100) * 7;

        for (int j = 0; pop >5; j++)
        {
            years += j;
        }
    }

    Console.WriteLine("Pop in year 2030 is " + Math.Round(pop, 2) + " million and the population will be over 5 million for " + years + " years.");
}

Теперь, чтобы было ясно, мне нужна сумма лет, в течение которых население превышает 5 (миллионов) (ответ 10), и я должен использовать только циклы для решения этой проблемы. Я думаю, что ответ является вложенным для l oop, но пытался и пытался безуспешно.

Может кто-нибудь помочь мне, где я облажался?

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Посмотрите на свой внутренний l oop.

    for (int j = 0; pop >5; j++)
    {
        years += j;
    }

Ваше состояние pop > 5, вам нужно pop, чтобы уменьшить, если вы когда-нибудь захотите выйти из l oop. Но тело l oop никогда не изменяет pop, поэтому, если оно больше 5, вы будете l oop навсегда.

Определение проблемы предполагает, что вам не нужен внутренний l oop вообще. Просто отметьте pop, и если оно больше 5, увеличьте years.

    if (pop > 5)
    {
         ++years;
    }

Если вы действительно находитесь под таким безумным ограничением, что вы не можете использовать if, вы можете сделать что-то вроде головы, создайте for l oop, который запускается только один раз, если ваше другое условие верно.

    for (int j = 0; j < 1 && pop > 5; ++j)
    {
        ++years;
    }

но ни один здравомыслящий человек не делает этого.

0 голосов
/ 22 марта 2020

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

bool passed = true;
double pop = 4.8;
int year = 0;
for (int i=0; i<10; i++)
{
 pop *= 1.07;
if (pop > 5 && passed)
{
 year = i;
 passed = false;
}
}
0 голосов
/ 22 марта 2020

Во-первых, вам нужно очистить имена переменных на мой взгляд. Конечно, не стоит слишком сильно увлекаться go, но IMO population будет лучше, чем просто pop.

Furhter, вы можете использовать Dictionary, чтобы хранить годы вместе с предопределенным населением.

Кроме того, пишите комментарии, чтобы лучше видеть, что происходит:)

С этими предложениями я бы кодировал это следующим образом:

double population = 4.8;
int currentYear = 2020;
Dictionary<int, double> predictions = new Dictionary<int, double>();
// Adding current state
predictions.Add(currentYear, population);

// I changed bounds of a loop to handle years in more comfortable way :)
for (int i = 1; i <= 10; i++)
{
  population *= 1.07;
  predictions.Add(currentYear + i, population);
}

Теперь у вас есть данные в Dictionary, который выглядит следующим образом:

2020  4.8
2021  ...
2022  ...
...   ...

Теперь вы можете получить все годы, когда население легко превысило 5 миллионов с predictions.Where(kvp => kvp.Value > 5).

...