2016-10-18 2 views
0

Я пытаюсь записать случайные числа в интервале с помощью команды IF и использовать разные цвета при каждом условии.C# IF/Console.Write требуется решение

int x = -50, y = -38; 
int min = 999, max = -999, sum = 0; 

Random rnd = new Random(); 
int[,] t = new int[20, 20]; 
for (int i = 0; i < 20; i++) 
{ 
    for (int j = 0; j < 20; j++) 
    { 
     t[i, j] = rnd.Next(x, y); 

     if (min > t[i, j]) 
      min = t[i, j]; 

     if (max < t[i, j]) 
      max = t[i, j]; 

     sum += t[i, j]; 

     if (t[i, j] == min) 
      if (t[i, j] == (min + 1.0 * (max - min)/5.0)) 
     { 
      Console.ForegroundColor = ConsoleColor.DarkBlue; 
     } 

     if (t[i, j] == (min + 1.0 * (max - min)/5.0)) 
      if (t[i, j] == (min + 2.0 * (max - min)/5.0)) 
      { 
       Console.ForegroundColor = ConsoleColor.Cyan; 
      } 

     if (t[i, j] == (min + 2.0 * (max-min)/5.0)) 
      if (t[i, j] == (min + 3.0*(max-min)/5.0)) 
      { 
       Console.ForegroundColor = ConsoleColor.Magenta; 
      } 

     if (t[i, j] == (min+ 3.0 *(max-min)/5.0)) 
      if (t[i, j] == (min + 4.0 * (max - min)/5.0)) 
      { 
       Console.ForegroundColor = ConsoleColor.Red; 
      } 

     if (t[i, j] == (min + 4.0 * (max - min)/5.0)) 
      if (t[i, j] == max) 
      { 
       Console.ForegroundColor = ConsoleColor.DarkRed; 
      } 
     Console.Write(" " + t[i, j]); 

     //Console.Write("{2} ", i, j, t[i, j]); 
    } 
    x++; 
    y++; 
} 
Console.WriteLine("Min: " + min); 
Console.WriteLine("Max: " + max); 
Console.WriteLine("Sum: " + sum/t.Length); 
Console.ReadKey(); 

Запуск программы выписывает только темные красные цифры.

+2

Пожалуйста, введите код в свой вопрос. Отступьте его на одну вкладку на левом поле, чтобы она корректно отформатировалась. –

+2

Вы действительно не описали то, что вы ожидаете *, но если условие темно-красного удовлетворено, оно всегда будет использовать этот (поскольку вы не использовали 'else if'). Может быть, ваша проблема. – BradleyDotNET

+5

Ваши условия 'if' странны. Как одно и то же значение 't [i, j]' быть равно двум различным значениям? –

ответ

1

Mong Zhu's answer показывает, что происходит в первом цикле. t[i, j] == min == max так

if (t[i, j] == (min + 4.0 * (max - min)/5.0)) 
    if (t[i, j] == max) 

всегда будет оценена истина, потому что функция упрощается

if (t[i, j] == (min + 4.0 * (0)/5.0)) 
    if (t[i, j] == max) 

который далее simplfies к

if (t[i, j] == (min + 0)) 
    if (t[i, j] == max) 

И потому, что на первом цикле t[i, j] == min == max его дальше simplfies к

if (t[i, j] == t[i, j]) 
    if (t[i, j] == t[i, j]) 

Это всегда будет правда.

На позже петли (max - min) не будет 0. Из-за того, что тесты, как

if (t[i, j] == min) 
     if (t[i, j] == (min + 1.0 * (max - min)/5.0)) 

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

min == (min + 1.0 * (max - min)/5.0) 

Если max - min не 0.

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

(UPDATE: я удалил t[i, j] >= min и t[i, j] <= max, потому что значение не может быть ложным.Все номера всегда будет равен или больше минимального значения или равно или меньше значения макс)

for (int j = 0; j < 20; j++) 
{ 
    t[i, j] = rnd.Next(x, y); 

    if (min > t[i, j]) 
     min = t[i, j]; 

    if (max < t[i, j]) 
     max = t[i, j]; 

    sum += t[i, j]; 

    if (t[i, j] < (min + 1.0 * (max - min)/5.0)) 
    { 
     Console.ForegroundColor = ConsoleColor.DarkBlue; 
    } 
    else if (t[i, j] < (min + 2.0 * (max - min)/5.0)) 
    { 
     Console.ForegroundColor = ConsoleColor.Cyan; 
    } 
    else if (t[i, j] < (min + 3.0*(max-min)/5.0)) 
    { 
     Console.ForegroundColor = ConsoleColor.Magenta; 
    } 
    else if (t[i, j] < (min + 4.0 * (max - min)/5.0)) 
    { 
     Console.ForegroundColor = ConsoleColor.Red; 
    } 
    else 
    { 
     Console.ForegroundColor = ConsoleColor.DarkRed; 
    } 
    Console.Write(" " + t[i, j]); 

    //Console.Write("{2} ", i, j, t[i, j]); 
} 

Это вызывает одно изменение в поведении. Ваш первый пункт теперь будет DarkBlue вместо DarkRed. Если вы хотите сохранить темно-красное поведение, просто измените первый, если на

if (min == max) 
    { 
     Console.ForegroundColor = ConsoleColor.DarkRed; 
    } 
    else if (t[i, j] < (min + 1.0 * (max - min)/5.0)) 
    { 
     Console.ForegroundColor = ConsoleColor.DarkBlue; 
    } 
1

Я думаю, что ваша главная проблема заключается в следующем:

При генерации случайного числа между -38 и -50:

t[i, j] = rnd.Next(x, y); 

Эти условия становятся всегда true

if (min > t[i, j]) 
    min = t[i, j]; 

if (max < t[i, j]) 
    max = t[i, j]; 

и оба значения (min и max) получите такое же значение! Исходя из этого все ваши дальше, если условия становятся true, потому что вы в основном сравнить стоимость на t[i, j] с min, независимо от числа добавить

if (t[i, j] == (min + 2.0 * (max-min)/5.0)) 

так max и min имеют такое же значение, вы добавите всегда 0 поэтому каждое условие та же. и последний выполняется.

+0

Обратите внимание, что это происходит в первом цикле. Каждой другой петле после этого я думаю, что проблема, которую имеет OP, - это когда-то 'max-min' не равен нулю.' If (t [i, j] == ...) 'когда-либо оценивает значение true, и он просто использует color он начал цикл с (который был установлен в DarkRed в первом цикле). Я думаю, что он надежно использовал '> =' и '<' для проверок. –

+0

@ScottChamberlain, вы правы. Хорошая точка и хороший ответ! –

+0

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

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