2017-01-19 2 views
0

Мне нужно найти объекты, которые проходят определенный тест, и среди всех объектов, прошедших первый тест, тот, который имеет самое низкое значение в другом тесте. Скажем, мне нужно найти шведскую женщину с самым низким счетом в Тетрисе, от выборки людей (при условии, что все играют в Тетрис (конечно, они есть)).Найти минимальное значение в цикле for: Как инициализировать переменную сравнения?

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

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

Я мог бы также сделать две петли и просто собрать всех шведских женщин в первом раунде, а затем оценки на втором, но есть ли более короткий и более простой способ?

Макет в C#:

bool AreYouSwedishFemale(Human patient) 
{ 
    if(patient.isFemale && patient.isSwedish) {return true;} 
    else {return false;} 
} 

int PlayTetris(Human patient) 
{ 
    return someInt; 
} 

void myMainLoop() 
{ 
    Human[] testSubjects = {humanA, humanB, humanC}; 
    Human dreamGirl; 
    int lowestScoreSoFar; //What should this be? 

    //Loop through testSubjects 
    foreach(Human testSubject in testSubjects) 
    { 
     //Check if it's a Swedish Female 
     if(AreYouSwedishFemale(testSubject)) 
     { 
      //If so, compare her score to the lowest score so far 
      if(PlayTetris(testSubject) < lowestScoreSoFar) //Error, uninitialized variable 
      { 
       //If the lowest, save the object to a variable 
       dreamGirl = testSubject; 
       //And save the score, to compare the remaining scores to it 
       lowestScoreSoFar = PlayTetris(testSubject); 
      } 
     } 
    } 

    //In the end we have the result 
    dreamGirl.marry(); 
} 

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

ответ

1

Перед проверкой PlayTetris() вы можете выполнить инициализированную проверку на «самый низкий результат». Предполагая, что самый низкий балл равен 0, вы можете инициализировать наименьший балл до -1. Затем измените цикл как таковой

//Loop through testSubjects 
foreach(Human testSubject in testSubjects) 
{ 
    //Check if it's a Swedish Female 
    if(AreYouSwedishFemale(testSubject)) 
    { 

     if(lowestScoreSoFar < 0 || PlayTetris(testSubject) < lowestScoreSoFar) 
     { 
      //If the lowest, save the object to a variable 
      dreamGirl = testSubject; 
      //And save the score, to compare the remaining scores to it 
      lowestScoreSoFar = PlayTetris(testSubject); 
     } 
    } 
} 

В принципе, если ваш «самый низкий балл до сих пор» не был установлен, то первая шведскую вы найдете посадит.

Если по какой-либо причине оценка является произвольной, вместо того, чтобы делать -1, вы также можете просто иметь «lowWasSet» bool, который срабатывает, когда найдена первая девушка.

Даже лучше, вы можете просто сделать (DreamGirl == NULL) вместо (lowestScoreSoFar < 0) потому, что девочка вашей мечты пустая, пока не найдешь первую шведскую самку. C# замыкает свои проверки OR, поэтому первое условие для прохождения сразу же переходит в блок. Итак, dreamGirl == null будет проходить как истинный, и PlayTetris() < lowScoreSoFar не выдает неинициализированную ошибку.

+0

Это сработало, спасибо! – DiMarzio

Смежные вопросы