Простейшие конструкции языка программирования. Циклы, ветвления, рекурсия.
-
Типы переменных в 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/