Простейшие конструкции языка программирования. Циклы, ветвления, рекурсия.
-
Типы переменных в C#
Type | Represents | Range | Default Value |
bool | Boolean value | True or False | False |
byte | 8-bit unsigned integer | 0 to 255 | 0 |
char | 16-bit Unicode character | U +0000 to U +ffff | ‘\0’ |
decimal | 128-bit precise decimal values with 28-29 significant digits | (-7.9 x 1028 to 7.9 x 1028) / 100 to 28 | 0.0M |
double | 64-bit double-precision floating point type | (+/-)5.0 x 10-324 to (+/-)1.7 x 10308 | 0.0D |
float | 32-bit single-precision floating point type | -3.4 x 1038 to + 3.4 x 1038 | 0.0F |
int | 32-bit signed integer type | -2,147,483,648 to 2,147,483,647 | 0 |
long | 64-bit signed integer type | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | 0L |
sbyte | 8-bit signed integer type | -128 to 127 | 0 |
short | 16-bit signed integer type | -32,768 to 32,767 | 0 |
uint | 32-bit unsigned integer type | 0 to 4,294,967,295 | 0 |
ulong | 64-bit unsigned integer type | 0 to 18,446,744,073,709,551,615 | 0 |
ushort | 16-bit unsigned integer type | 0 to 65,535 | 0 |
- Простейшие операторы языка
*= += /= %=
== >= <= != !
& | << >>
-
Циклы
Циклом называется один или несколько операторов, повторяющихся заданное число раз или до тех пор, пока не будет выполнено определенное условие. Выбор типа цикла зависит от задачи программирования и личных предпочтений кодирования. Одним из основных отличий C# от других языков, таких как C++, является цикл foreach, разработанный для упрощения итерации по массиву или коллекции.
Циклы foreach, for, while, do while
В C# представлен новый способ создания циклов, который может быть неизвестен программистам на C++ и C: цикл foreach. Вместо просто создания переменной для индексирования массива или другой структуры данных, такой как коллекция, цикл foreach выполняет более тяжелую работу.
// Применение цикла для массива целых чисел. int[] array1 = {0, 1, 2, 3, 4, 5}; foreach (int n in array1) { System.Console.WriteLine(n.ToString()); } // Применение массива для строк string[] array2 = {"hello", "world"}; foreach (string s in array2) { System.Console.WriteLine(s); } // Применение всех видов циклов для массивов. int[] array1 = { 0, 1, 2, 3, 4, 5 }; foreach (int n in array1) { System.Console.WriteLine(n.ToString()); } // Применение массива для строк string[] array2 = { "hello", "world" }; foreach (string s in array2) { System.Console.WriteLine(s); } //------------------------------------------------------------------------ for (int i = 0; i < 6; i++) { System.Console.WriteLine(array1[i].ToString()); } for (int i = 0; i < 2; i++) { System.Console.WriteLine(array2[i]); } //------------------------------------------------------------------------ int x = 0; while (x < 6) { System.Console.WriteLine(array1[x].ToString()); x++; } int y = 0; while (y < 2) { System.Console.WriteLine(array2[y]); y++; } //------------------------------------------------------------------------ x = 0; do{ System.Console.WriteLine(array1[x].ToString()); x++; } while (x < 6); y = 0; do { System.Console.WriteLine(array2[y]); y++; } while (y < 2); //------------------------------------------------------------------------
-
Ветвления программы.
If else
Оператор if определяет, какой блок операторов будет выполняться при выполнения условия, заданного выражением Boolean. В следующем примере переменной result типа Boolean присваивается значение true, а затем она проверяется оператором if.В результате получается The condition is true.
bool condition = true; if (condition) { Console.WriteLine("The variable is set to true."); } else { Console.WriteLine("The variable is set to false."); }
Оператор if в С# может иметь две формы представления, как показано на примере.
//---------------------------------------------------------------------------------------- // if-else statement if (condition){ then-statement; } else { else-statement; } // Next statement in the program. //---------------------------------------------------------------------------------------- // if statement without an else if (condition){ then-statement;} // Next statement in the program.
В инструкцию if-else, если condition имеет значение true, выполняется then-statement. Если condition имеет значение false, выполняется else-statement. Поскольку condition не может одновременно имеет значение true и false, значения then-statement и else-statement, операторов if-else, никогда не могут выполняться оба. После запуска then-statement или else-statement, элемент управления передаются в следующую инструкцию после оператора if.
В операторе if, не включающем оператор else, если condition имеет значение true, выполняется then-statement. Если condition имеет значение false, то управление передаются в следующую инструкцию после блока if.
then-statement и else-statement могут состоять из одного оператора или нескольких операторов, заключенных в фигурные скобки ({}). Для одного оператора в теле конструкции скобки необязательны, но рекомендуются.
Инструкция или инструкции в then-statement и else-statement могут быть любого типа, включая другой оператор if, вложенный в исходную инструкцию if. Во вложенных выписках if, каждое предложение else принадлежит к последнему if, не имеет соответствующий объект else.В следующем примере Result1 возникает, если m > 10 и n > 20 возвращается значение true.Если m > 10 имеет значение true, а значение n > 20 — Result2.
int m = 12; int n = 18; if (m > 10) if (n > 20) { Console.WriteLine("Result1"); } else { Console.WriteLine("Result2"); } // Try with m = 12 and then with m = 8. if (m > 10) { if (n > 20) Console.WriteLine("Result1"); } else { Console.WriteLine("Result2"); }
Result2, если условие (m > 10) возвращает значение false.
В следующем примере, ввести символ с помощью клавиатуры и программе вложенных оператора if для определения символа ввода буквы.Если символ ввода буквы, проверки, программы символа ввода в нижнем регистре или прописными буквами.Сообщение отображается для каждого случая.
Console.Write("Enter a character: "); char c = (char)Console.Read(); if (Char.IsLetter(c)) { if (Char.IsLower(c)) { Console.WriteLine("The character is lowercase."); } else { Console.WriteLine("The character is uppercase."); } }else { Console.WriteLine("The character isn't an alphabetic character."); }
Также можно поместить выражение if в блок else, как это показано в части кода, приведённой ниже. В примере приведено помещение выражения if в два блока else и один блок then. Коментарии определяют какие условия выполняются в каждом из блоков.
// Change the values of these variables to test the results.bool Condition1 = true; bool Condition2 = true; bool Condition3 = true; bool Condition4 = true; if (Condition1){ // Condition1 is true.} else if (Condition2){ // Condition1 is false and Condition2 is true.} else if (Condition3){ if (Condition4) { // Condition1 and Condition2 are false. Condition3 and Condition4 are true. } else { // Condition1, Condition2, and Condition4 are false. Condition3 is true. } }else{ // Condition1, Condition2, and Condition3 are false.}
Так как выписка в другом блоке или тогдашнем блоке может быть любой допустимой выпиской можно использовать любое допустимое логическое выражение для условия.Можно использовать логические операторы, такие как &&, &, |||и !, чтобы сделать составные условия.В следующем коде приведены примеры.
// NOT bool result = true; if (!result){ Console.WriteLine("The condition is true (result is false).");} else{ Console.WriteLine("The condition is false (result is true).");} // Short-circuit AND int m = 9; int n = 7; int p = 5; if (m >= n && m >= p) { Console.WriteLine("Nothing is larger than m.");} // AND and NOTif (m >= n && !(p > m)){ Console.WriteLine("Nothing is larger than m.");} // Short-circuit OR if (m > n || m > p){ Console.WriteLine("m isn't the smallest.");} // NOT and OR m = 4; if (!(m >= n || m >= p)){ Console.WriteLine("Now m is the smallest.");}
switch
Оператор switch — это оператор управления, выбирающий из списка возможных вариантов раздел переключения, для выполнения содержащегося в нём кода.
Оператор switch включает один или несколько разделов переключения. Каждый раздел переключения содержит одну или несколько меток case, за которыми следует один или несколько операторов. В следующем примере показан простой оператор switch с тремя разделами переключения. Каждый раздел switch содержит одну метку case, например case 1, и два оператора.
int caseSwitch = 1; switch (caseSwitch){ case 1: Console.WriteLine("Case 1"); break; case 2: Console.WriteLine("Case 2"); break; default: Console.WriteLine("Default case"); break;}
-
Операторы перехода.
continue
Оператор continue передает элемент управления следующей итерации вложенного пока(while), сделайте(do), для(for) или foreach, в котором она встречается.
В этом примере инициализируется счетчик для счета от 1 до 10. С помощью оператора continue в сочетании с выражением (i < 9), инструкции между оператором continue и концом тела цикла for пропускаются.
for (int i = 1; i <= 10; i++) { if (i < 9) { continue; } Console.WriteLine(i); }
break
Оператор break завершает ближайший внешний цикл или оператор switch, в котором он появляется.Управление передается оператору, следующему за завершенным оператором (если таковой имеется).
В этом примере условный оператор содержит счетчик, который должен считать от 1 до 100; однако оператор break завершает цикл после четырех.
for (int i = 1; i <= 100; i++) { if (i == 5) break; Console.WriteLine(i); }
-
Функции
Функция — основная модульная единица в C#. Функция обычно предназначена для выполнения определенной задачи и её имя часто отражает эту задачу. Функция содержит объявления и выписки. В этом разделе описывается объявление, определение и вызов функций на языке С.
Функции должны иметь определение и должны быть объявлены, хотя определение может служить и объявлением, если объявление делается перед вызовом функции. Определение функции включает тело функции — код, который выполняется при вызове функции.
Объявление функции указывает имя, возвращаемый тип и атрибуты функции, определенной в любом другом месте программы. Объявление функции должно предшествовать вызову функции. Именно поэтому файлы заголовков, содержащие объявления для функций среды выполнения, включены в коде, прежде вызова функции среды выполнения. Если объявление содержит сведения о типах и количество параметров, то объявление является прототипом.
Компилятор использует прототип для сравнения типов аргументов в последующих вызовах функции с параметрами функции и чтобы преобразовать типы аргументов к типам параметров при необходимости.
В вызове функции управление выполнением передается из вызывающей функции в вызываемую функцию. Аргументы, если таковые имеются, передаются по значению в вызываемую функцию. Выполнение оператора return в вызываемой функции возвращает управление и, возможно, значение в вызывающую функцию.
Вернемся к старой задаче — выводе данных о людях. У нас есть разные люди с данными в виде отдельных фамилии, имени, отчества, которые надо вывести на экран — вида Пушкин Александр Сергеевич и Пушкин А.С. Чтобы задача была правдоподобней можно имитировать ввод данных пользователем или загрузку из внешнего источника, но все это будет пустой тратой времени — реальные приложения все равно работают с графическим и/или веб-интерфейсом. Просто держим в уме что в реальности людей не два, а две тысячи и заранее их имена не известны.
Получаем уродливый код
string name = "Александр"; string otchestvo = "Сергеевич"; string surname = "Пушкин"; string name2 = "Наталья"; string otchestvo2 = "Николаевна"; string surname2 = "Гончарова"; System.Console.WriteLine(surname + " " + name + " " + otchestvo); System.Console.WriteLine(surname2 + " " + name2 + " " + otchestvo2);
Два раза повторяется один и тот же кусок кода — склеивание трех строк в одну.
Два раза повторяется другой кусок кода — склеивание фамилии, первых букв имени и отчества, точек.
Логичнее всего вынести повторяющиеся куски кода в отдельное место, дать им имя и во всех остальных местах программы вызывать их по этому имени. Иными словами сделать функции — куски кода с собственными именем, которые принимают на вход какие-то данные, что-то с ними делают и возвращают обратно какие-то данные (хотя возможен вариант когда они ничего не принимают и не возвращают, просто что-то делают).
Пример функции
public static string CreateFio(string surname, string name, string otchestvo) { string fio = surname + " " + name + " " + otchestvo; return fio; }
Слова public static отложим на пару минут в сторону, string означает, что функция вернет назад строку, CreateFio(string surname, string name, string otchestvo) — название функции и описание того, что она принимает на вход три строки.
Если бы функция ничего не принимала и ничего не возвращала, ее описание выглядело бы так
public static void CreateFio() { // фио мы здесь явно создать не сможем, вечная морока с этим тестовыми примерами }
Код фцнкции обрамляется фигурными скобками, значение возвращается с помощью ключевого слова return
public static string CreateFio(string surname, string name, string otchestvo) { string fio = surname + " " + name + " " + otchestvo; return fio; }
public static string CreateFioInitials(string surname, string name, string otchestvo) { string fio = surname + " " + name.Substring(0, 1) + ". " + otchestvo.Substring(0, 1) + "."; //Временно оставим в стороне код "Substring(0, 1)" - он просто вырезает первый символ из строки. return fio; }
-
Рекурсия
Рекурсия, стек
В коде функции могут вызывать другие функции для выполнения подзадач.
Частный случай подвызова — когда функция вызывает сама себя. Это называется рекурсией.
Рекурсия используется для ситуаций, когда выполнение одной сложной задачи можно представить как некое действие в совокупности с решением той же задачи в более простом варианте.
Пример рекурсивного вызова функции
int sumTo(int n) { if (n == 1) return 1; return n + sumTo(n - 1); }
8. Работа с массивами.
// Одномерный массив int[] array1 = new int[5]; // Объявление создание и одновременная запись значений в массив. int[] array2 = new int[] { 1, 3, 5, 7, 9 }; // Альтернативный вариант int[] array3 = { 1, 2, 3, 4, 5, 6 }; // Двумерный массив int[,] multiDimensionalArray1 = new int[2, 3]; // Объявление и запись двумерного массива. int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } }; // Массив массивов int[][] jaggedArray = new int[6][]; // Задаем значения массива массивов. jaggedArray[0] = new int[4] { 1, 2, 3, 4 }; Общие сведения о массивах Массив имеет следующие свойства. Массив может быть одномерным, многомерным или массивом массивов. Количество измерений и длина каждого из измерений задаются, когда создается экземпляр массива. Эти значения невозможно изменить во время существования экземпляра. Значения по умолчанию числовых элементов массива задано равным нулю, а элементы ссылок имеют значение NULL. Разреженный массив является массивом массивов и поэтому его элементы являются ссылочными типами и инициализируются значением null. Индексация массивов начинается с нуля: массив с n элементами индексируется от 0 до n-1. Элементы массива могут быть любых типов, включая тип массива. Типы массива являются ссылочными типами, производными от абстрактного базового типа Array.Поскольку этот тип реализует IEnumerable и IEnumerable<T>, в C# во всех массивах можно использовать итерацию foreach. Для генерации случайных чисел используем класс Random
Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51
Задания
- Создать массив из 10 чисел и вывести его в консоль с помощью цикла.
- Создать массив из 10 произвольных чисел, найти максимальное и вывести в консоль.
- Задать 4и произвольных числа и с помощью if найти максимальное количество повторений одного и того же числа.
- Создать два массива и перемножить друг на друга i-ые значения если оба меньше пяти.
- Вычислить сумму чисел до данного с помощью цикла и с помощью рекурсии.
- Вычислить факториал с помощью цикла и с помощью рекурсии.
- Числа Фибоначчи *. Создать функцию которая выводит в консоль десять чисел Фибоначчи с помощью цикла и с помощью рекурсии.
- Создать двумерный массив 10×10 и заполнить его произвольными числами.
- Осуществить сортировку массива.
- Написать функцию добавления элементов в массив. Увеличивать размерность массива если в нем не хватает места.
*Последовательность чисел Фибоначчи имеет формулу Fn = Fn-1 + Fn-2. То есть, следующее число получается как сумма двух предыдущих.
Выполнить задания на сайте…
http://natureofcode.com/book/chapter-8-fractals/