C# Урок 1 Основы c# курсы в Караганде Простейшие конструкции языка программирования. Циклы, ветвления, рекурсия

Автор: | 02.01.2016

Простейшие конструкции языка программирования. Циклы, ветвления, рекурсия.

  1. Типы переменных в 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

 

  1. Простейшие операторы языка

*=    +=   /=    %=

==   >=   <=   !=    !

&     |       <<   >>

 

  1. Циклы

Циклом называется один или несколько операторов, повторяющихся заданное число раз или до тех пор, пока не будет выполнено определенное условие. Выбор типа цикла зависит от задачи программирования и личных предпочтений кодирования. Одним из основных отличий 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);

//------------------------------------------------------------------------

 

 

  1. Ветвления программы.

 

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;}

 

  1. Операторы перехода.

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);        
}
  1. Функции

Функция — основная модульная единица в 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;
}

 

 

  1. Рекурсия

Рекурсия, стек

В коде функции могут вызывать другие функции для выполнения подзадач.

Частный случай подвызова — когда функция вызывает сама себя. Это называется рекурсией.

Рекурсия используется для ситуаций, когда выполнение одной сложной задачи можно представить как некое действие в совокупности с решением той же задачи в более простом варианте.

Пример рекурсивного вызова функции

 

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

Задания

  1. Создать массив из 10 чисел и вывести его в консоль с помощью цикла.
  2. Создать массив из 10 произвольных чисел, найти максимальное и вывести в консоль.
  3. Задать 4и произвольных числа и с помощью if найти максимальное количество повторений одного и того же числа.
  4. Создать два массива и перемножить друг на друга i-ые значения если оба меньше пяти.
  5. Вычислить сумму чисел до данного с помощью цикла и с помощью рекурсии.
  6. Вычислить факториал с помощью цикла и с помощью рекурсии.
  7. Числа Фибоначчи *. Создать функцию которая выводит в консоль десять чисел Фибоначчи с помощью цикла и с помощью рекурсии.
  8. Создать двумерный массив 10×10 и заполнить его произвольными числами.
  9. Осуществить сортировку массива.
  10. Написать функцию добавления элементов в массив. Увеличивать размерность массива если в нем не хватает места.

*Последовательность чисел Фибоначчи имеет формулу Fn = Fn-1 + Fn-2. То есть, следующее число получается как сумма двух предыдущих.

 

Выполнить задания на сайте…

http://natureofcode.com/book/chapter-8-fractals/

Раздел: C#