#c# #boolean #logic #console-application
#c# #логическое #Логические #консольное приложение
Вопрос:
Вот код, который выводит 1 или 0 в зависимости от равенства двух массивов
static void Main(string[] args)
{
while (true)
{
Console.WriteLine(Here());
}
Вот где происходит волшебство.
static int Here()
{
Random rnd = new Random();
PlayerInput();
int[] intarray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
string[] sarray = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
int i = rnd.Next(10); // creates a number between 1 and 10
int x = rnd.Next(10);
string iarray = intarray[x].ToString();
if (iarray == sarray[i])
{
return 1;
}
else
{
return 0;
}
}
он выводит 0, когда два массива не равны, и 1 наоборот. теперь я хочу подсчитать, сколько раз он выводит 0 и 1.
Вопросы:
-
Как я мог это сделать?
-
Должен ли я передавать выходные данные в массив для упрощения манипулирования?
Комментарии:
1. Когда вы разорвете свой цикл while?
2. вы знакомы с выражениями lamda ..? вы можете сделать это легко, используя следующее
.GroupBy, .Where, and .Select
Я могу опубликовать пример с использованием не дубликатов и дубликатов в списке<T>, если вам нужно посмотреть рабочий пример для перехода3. Как предполагается завершить ваш
while
цикл? Никогда не используйтеwhile(true)
, если вы действительно не знаете, что делаете. Это будет повторяться бесконечно.4. Кроме того, почему вы конвертируете оба
ints
вStrings
, чтобы сравнить их? Просто сравните их какint
значения
Ответ №1:
Если я не неправильно понимаю ваш вопрос, похоже, что у вас могло бы быть просто две встречные переменные:
static void Main(string[] args)
{
int totalOnes = 0;
int totalZeroes = 0;
while (true) // need to replace this with something that will actually exit!!
{
int ret = Here();
if (ret == 1) totalOnes ; else totalZeroes ;
Console.WriteLine(ret);
}
Console.WriteLine("Total Ones: {0} Total Zeroes: {1}", totalOnes, totalZeroes);
}
РЕДАКТИРОВАТЬ: Спасибо L J за указание на то, что ваш while
цикл никогда не завершится, поскольку у вас есть while (true)
. Вам нужно решить эту проблему.
Комментарии:
1. О, ты был первым.. хорошо. Но имейте в виду, что здесь
if (ret == 1) totalOnes ; else totalZeroes ;
totalZeroes не обнуляет счетчик, это счетчик «не один», потому что здесь в будущем может вернуться 2 или 10.2. Может ли это быть, хотя? Как он дал, возвраты могут быть только
0
или1
3. @tym32167 — Я согласен с Хэнком. В вопросе четко указано, что он возвращает ноль или единицу. Ваш метод необычен; я бы просто использовал
switch
, если бы хотел учесть другие возможные случаи.4. @rory.ap ofcource оба кода будут работать, и я не хочу сказать, что ваш код плохой, просто, исходя из опыта, требования часто меняются, и имена переменных должны соответствовать значениям переменных. В вашем случае totalZeroes означает, сколько раз результат не равен 1, и я просто хотел это заметить.
5. Просто ввод: элемент управления никак не выйдет из
while
цикла
Ответ №2:
вот так
static void Main(string[] args)
{
var zeroCount = 0;
var oneCount = 0;
while (true)
{
var result = Here();
if (result == 1) oneCount ;
if (result == 0) zeroCount ;
Console.WriteLine($"Actual result {result}, zero count {zeroCount}, One count {oneCount}");
}
}
Комментарии:
1. @Tinwor результатом
int Here()
может быть что угодно, потому что он возвращаетint
. Думайте об этой функции как о черном ящике.2. @tym32167 Технически, OP мог отредактировать свой
Here()
метод, чтобы возвращать любойint
, да. Но нас попросили дать ответ для его текущего кода, а не о возможности того, каким его код может быть в будущем.Here()
действительно возвращаетint
, но возврат является конечным выборомints
в его текущем состоянии. Если OP никогда не нуждается в том, чтобы этот метод возвращал что-либо, кроме 0 или 1, тогда зачем учитывать что-либо еще?3. Я не хочу говорить, что этот код идеален, я просто упоминаю, что имена переменных должны соответствовать значениям переменных. В моем случае
zeroCount
означает, сколько результатов было нулевым. В случае ответа от rory.ap это означает, насколько результат не равен 14. Это было бы правильно, если бы вы взяли инструкцию if и рассмотрели ее саму по себе, без учета других факторов. Но, учитывая текущий
Here()
метод, егоtotalZeros
действительно означает, сколько результатов было0
. Это ситуационно правильно, но универсально расплывчато. Я понимаю вашу точку зрения, но вы должны учитывать ситуацию с переменными при формировании мнения о неоднозначности имен переменных.5. о, неважно, просто игнорируй меня, нужно меньше работать и больше отдыхать … 🙂
Ответ №3:
static int Here()
{
Random rnd = new Random();
PlayerInput();
int[] intarray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
string[] sarray = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
**var Count1 = 0;
var Count0 = 0;**
int i = rnd.Next(10); // creates a number between 1 and 10
int x = rnd.Next(10);
string iarray = intarray[x].ToString();
if (iarray == sarray[i])
{
**Count1 ;**
return 1;
}
else
{
**Count0 ;**
return 0;
}
}
Count0 будет содержать количество раз, когда было выведено 0.
Счетчик 1 будет содержать количество раз, когда был выведен 1.
Комментарии:
1.
Count1
иCount0
в настоящее время являются недоступными переменными за пределамиHere()
, поскольку метод является закрытым.