Флаги в циклах в C#
Сейчас мы научимся работать с флагами.
Флаг - это специальная переменная, которая
может принимать только два значения:
true и false. С помощью флагов
можно решать задачи, проверяющие отсутствие
чего-либо: к примеру, можно проверить, что
в строке нет определенной буквы.
Давайте решим следующую задачу: дана строка
"abcde", нужно проверить, есть ли в ней
буква "'c'". Если есть - выведем
"Y", если нет - выведем "N".
Для начала давайте попробуем вывести
"Y". Для этого переберем все символы
строки и ифом будем спрашивать, равен ли
текущий символ букве "'c'". Если равен -
выведем "Y":
string str = "abcde";
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
Console.WriteLine("Y");// prints Y
}
}
Но наше решение не очень хорошо: ведь если
в строке будет не одна буква "'c'",
а несколько, то "Y" выведется
несколько раз. Давайте запишем эту букву
дважды и убедимся в этом:
string str = "abccde";
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
Console.WriteLine("Y"); // prints multiple times
}
}
Поправим проблему: завершим цикл с помощью
break, если буква уже найдена:
string str = "abccde";
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
Console.WriteLine("Y");// prints Y
break; // break loop
}
}
Давайте теперь попробуем сделать так, чтобы,
если в строке вообще нет буквы "'c'",
выводилось "N". Распространенным
заблуждением будет добавить else к нашему
ифу - в этом случае "N" будет выводиться
на все символы, не являющиеся буквой "'c'":
string str = "abcde";
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
Console.WriteLine("Y"); // prints on letter c
} else {
Console.WriteLine("N"); // prints on letters a, b, d and e
}
}
Итак, идея добавить else - плохая
идея, не рабочая. Для решения задач подобного
типа (такие задачи встречаются достаточно
часто) и используют так называемые флаги.
Как уже упоминалось выше, флаг - это такая
переменная, которая может принимать два
значения: true или false.
Итак, давайте сделаем переменную flag
с таким значением: если она равна true,
то в строке есть буква "'c'", а если
false, то такой буквы нет.
Изначально поставим переменную flag
в значение false - то есть будем считать,
что буквы "'c'" в строке нет:
string str = "abcde";
bool flag = false; // assume no letter c
Затем запустим цикл с ифом так, как мы делали
это раньше. Если цикл обнаружит, что в строке
есть буква "'c'" - то поставим переменную
flag в значение true и выйдем
из цикла с помощью break:
string str = "abcde";
bool flag = false; // assume no letter c
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
flag = true; // letter found
break; // break loop
}
}
Ответ на вопрос, есть ли в строке буква
"'c'" или нет, мы можем дать только после
цикла. И этот ответ у нас уже есть: после цикла
переменная flag могла остаться
false или могла сменить свое значение
на true, если цикл обнаружил в строке
букву "'c'":
string str = "abcde";
bool flag = false;
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
flag = true;
break;
}
}
// flag is true or false
Теперь после цикла мы можем сделать иф, который
посмотрит на переменную flag и выведет
на экран "Y" или "N":
string str = "abcde";
bool flag = false;
for (int i = 0; i < str.Length; i++) {
char ch = str[i];
if (ch == 'c') {
flag = true;
break;
}
}
if (flag == true) {
Console.WriteLine("Y");// prints Y
} else {
Console.WriteLine("N");
}
Дана строка:
string str = "program";
Проверьте, есть ли в ней буква "'r'".
Если есть - выведите "Y", а если нет -
выведите "N".
Дана строка:
string str = "hello";
Проверьте, есть ли в ней буква "'x'".
Если есть - выведите "Y", а если нет -
выведите "N".
Напишите код, который будет проверять число на то, простое оно или нет. Простое число делится только на единицу и на само себя, и не делится на другие числа.