История развития языков программирования

История развития языков программирования

· I-е поколение – 40-50 годы 20 века, появление языка Assembler, предназначенного для работы напрямую с аппаратурой.

· II-е поколение – 50-е годы 20 века, в язык Assembler введено понятие переменной, то есть стало возможным создание программ без принадлежности к отдельным адресам памяти.

· III-е поколение – 60-е годы 20 века, появление универсальных языков программирования (Fortan, Kobol, Algol, Basic, Pascal и C), которые характеризуются относительной простотой и независимостью от конкретных компьютеров, так же стало возможным использование подпрограмм.

· IV-е поколение – характеризуется появлением в языках программирования технологически объектно-ориентирования и визуализации программ (C++, Oject Pascal).

· V-е поколение – 90-е годы 20 века, характеризуется созданием языков, в которых присуще независимость программ от программной и аппаратной платформы.

· VI-е поколение – характеризуется созданием программ и систем, ориентированных на непрограммистов, то есть специалистов работающих в конкретных областях, не связанных с программами.

Классификация языков и технологий программирования

Языки программирования бывают:

• Процедурные,

• Функциональные

• Логические

• Объектно-ориентированные

Технологии программирования:

Параллельное программирование – это возможность создания программ, которые выполняются параллельно на одном процессоре или в одной памяти, на нескольких процессорах.

Управление событиями – современные среды управляют различными событиями (программными и аппаратными).

Языки – это скрипты (эти языки включены в прикладные программы, применяются для автоматизации базы данных).

Способы записи алгоритма

- на естественном языке

- в виде схемы (блок-схемы)

- на алгоритмическом языке

- на языке программирования

Блок-схема - это графический способ представления алгоритма, каждое действие при этом изображается в виде последовательности связанных блоков.

Алгоритмический язык - это система обозначений и правил для единообразной и точной записи алгоритмов и их исполнения. Алгоритмический язык состоит из совокупности слов, назначение и смысл которых задан раз и навсегда. Такие слова принято называть служебными.

5. Правила записи программы на языке C#

Комментарии в программе выделяются после символа «/». Если комментарий занимает несколько слов и строк, он может быть заключен в «/* … */». Среда программирования располагает большим набором подпрограмм (стандартных) упрощающих программирование. Каждая из них состоит в каком-либо классе. Классом понимается тип данных, включающий совокупность данных (поля классов) и действий (подпрограммы, методы классов). Чтобы упорядочить большое количество классов, используется пространство имен, каждое из которых включает свой набор классов, которые в свою очередь включают свой набор полей и методов. Для подключения пространств имен программы используется оператор using ИмяПространствоИмен; В пространственном положении обязательно объявляется собственное пространство имен для данной программы. Отдельные блоки программы заключаются в «{ … }» например, в пространство имен. В пространстве имен автоматически создается класс программ. Любой оператор языка завершается «;». В C# различимы заглавные и строчные буквы. Компиляция программы выполняется командой «Начать отладку» - F5 в результате компиляции создается файл, имя которого совпадает с именем проекта, но с расширением .exe. Этот файл можно запустить из Windows .net платформы.

// Включение в программу стандартных пространств имен

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

/* Создавая программу автоматически будет создано

новое пространство имен */

namespace HelloWorld

{

// Основной класс программы

class Program

{

// Метод класса с которого начинается выполнение программы

static void Main(string[] args)

{

// Вывод надписи на экран

Console.WriteLine("Hello World");

// Ожидание нажатия пользователем клавиши

Console.ReadKey();

}

}

}

Идентификаторы

Идентификаторы – это имена, которым обозначаются элементы языка программирования.

Ключевые слова – это идентификаторы, имеющие специальное значение для компилятора C#.

Литералы

Литералом называется представленные значения данных (число, строка и т.д.).

Литералы бывают:

1) Арифметические литералы: 4, 3.4214, 1.25234E+052, 0xA.

2) Логические литералы: true – истина, false – ложь.

3) Символьные литералы: часто используются escape-последовательности \n – переход на новую строку, \\ - вывод левого слеша, \а – предупреждение (звонок), \b – возврат на одну позицию, \f – переход на новую страницу, \t – табуляция.

Строковые литералы.

Константы

Константы – это ячейки памяти, для хранения данных, значение которых во время работы программы не может быть изменено.

Объявление константы: const_тип данных идентификатор=литерал

const float Pi = 3.14;

const byte week = 7;

static void Main(string[] args)

{

// Эти константы определены на уровне метода

const string Str = "Тест";

const int week = 7;

// Эти переменные определены на уровне метода

int i=0;

Int32 I=8;

float a=5;

// Вывод значений констант и переменных на экран

Console.WriteLine(Str);

Console.WriteLine(week);

Console.WriteLine(i);

Console.WriteLine(I);

Console.WriteLine(a);

Console.ReadKey();

}

10. Операция – это некоторое действие, обозначаемое символом.

Операции бывают:

1) Унарные – выполняются над одним операндом.

2) Бинарные – выполняются над двумя операндами.

Операндами могут быть: литералы, переменные, константы или функции.

Выражение – это один или несколько операндов, соединенных знаком операции.

1) Математические операции – результат число: +, - (бинарная и унарная), *, /, %

2) Операция сравнения – результат true или false: == - проверка на равенство, != - проверка на неравенство, <, >, <=, >=

3) Логические операции – результат true или false: & - побитовое «И», | - побитовое «ИЛИ», ~ - побитовое «НЕ» (бинарные и унарные), && - логическое «И», || - логическое «ИЛИ», ! - логическое «НЕ», ^ - логическое исключающее «ИЛИ».

4) Операции сдвига: >> - сдвиг вправо, << - сдвиг влево.

5) Операции присваивания: =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

6) Операции инкремент и декремент: ++ - увеличение значения аргумента на 1, -- - уменьшение значения аргумента на 1 (префиксные и постфиксные)

Ввод и вывод данных

Методы — предназначенные для ввода и вывода находятся в классе Console, который в свою очередь находится в пространстве имён System.

· Метод Write() выводит символьную строку, задаваемою в качестве аргумента, метода.

· Метод WriteLine() аналогичен Write, с тем различием, что после вывода курсор перейдёт на следующую строку.

· Метод Read()считывает один символ и возвращает код со считанного символа (код символа представляется в int)

· Метод ReadLine()считывает строку введённую пользователем (тип данных string). Метод ReadLine может быть использован для считывания значений не только строкового типа, но и других типов. Для этого считанное значение необходимо преобразовать к соответствующему типу данных. Методы для преобразования типа данных находятся в классе Convert.

· ReadKey предназначен для приостановки выполнения программы до нажатия любой клавиши клавиатуры.

· ConsoleKeyInfo считывает клавишу.

static void Main(string[] args)

{

string name; // Переменная для хранения имени

byte age; // Переменная для хранения возраста

// Выводим приглашение ввести имя

Console.Write("Введите Ваше имя: ");

// Считываем имя как строку и заносим его в переменную name

name = Console.ReadLine();

// Выводим приглашение ввести возраст

Console.Write("Введите Ваш возраст: ");

// Преобразование считанной строки к типу byte

age = Convert.ToByte(Console.ReadLine());

// Объединение нескольких строк выполняется с помощью операции +

Console.WriteLine("\n\n" + name + ", Вам " + age + " лет.");

Console.ReadKey();

}

12. Условные конструкции. Условная операция ?:

Работа всех условных конструкций построена на проверке некоторых условий на истинность или ложность. В зависимости от результатов этой проверки выполняется тот или иной блок кода.

Операция ?: данная операция позволяет подставить в выражение результат вычисления одного из двух других выражений. В зависимости от ложности выражения или истинности, выражение выставляется в качестве условия. Данная операция может быть использована только в составе некоторых выражений.

Синтаксис операции:логическое_выражение ? выражение1: выражение2

Результатом логического выражения может быть истина (true) ложь (folse). Если выражение истинно выполниться выражение1, иначе – выражение2.

Пример:

static void Main(string[] args)

{

int n;

n = Convert.ToInt32(Console.ReadLine());

n = n == 0 ? 1 : n;

Console.WriteLine("1/n="+1/n);

Console.ReadKey();

}

Класс Math

Предоставляет константы и статические методы для тригонометрических, логарифмических и иных общих математических функций.

Пространство имен System

Синтаксис:

public static class Math

Пример:

double angle = 180.0;

double sinAngle = Math.Sin(angle);

double cosAngle = Math.Cos(angle);

double res;

// res = (cos(angle) + x2)/( angle + 1)

res = (Math.Cos(angle) + Math.Pow(x, 2))/(Math.Sqrt(angle) + 1);

Циклы. Оператор While

Если в программе один или несколько операторов необходимо выполнить несколько раз, то используют циклы. Каждый из циклов имеет свою специфику, которая определяет возможность или удобство его применения.

Оператор while позволяет выполнять оператор или группу операторов до тех пор пока логическое выражение истинно.

Синтаксис while: (логическое выражение) — заголовок цикла

оператор; - тело цикла

Тело цикла while не будет выполняться, если логическое выражение изначально ложно. Может произойти зацикливание, если в процессе работы цикла логическое выражение ни когда не станет ложно. Если в теле любого из циклов в том числе цикла while необходимо использовать не один оператор, а несколько операторов, то они должны быть заключены в «{ }».

static void Main(string[] args)

{

int i = 0;

while (i < 10)

{

Console.WriteLine("i: {0}", i);

i++;

}

Console.ReadKey();

}

Циклы. Оператор do while

Если в программе один или несколько операторов необходимо выполнить несколько раз, то используют циклы. Каждый из циклов имеет свою специфику, которая определяет возможность или удобство его применения.

Цикл do while так же позволяет выполнять оператор до тех пор, пока логическое выражение истинно, но проверка логического выражения выполняется после тела цикла. Таким образом, в цикле do while тело цикла выполняется хотя бы один раз.

Синтаксис цикла do while:

do

оператор;

while (логическое выражение)

Циклы do while и while применяются, когда в программе заранее не известны количество повторений. Если условие цикла всегда истинно, цикл выполняется бесконечно.

static void Main(string[] args)

{

int i = 11;

do

{

Console.WriteLine("i: {0}", i);

i++;

} while (i < 10) ;

Console.ReadKey();

}

Циклы. Оператор for

Если в программе один или несколько операторов необходимо выполнить несколько раз, то используют циклы. Каждый из циклов имеет свою специфику, которая определяет возможность или удобство его применения.

Циклк for используется в тех случаях, когда заранее известно количество повторений.

Синтаксис for:

for (инициализация; условие_окончание;выражение)

оператор;

Заголовок for состоит из 3 секций разделенных «;». Секция инициализации — позволяет задавать переменную или переменные цикла и присваивать им начальные значения. Если таких переменных несколько они разделяются запятой. Тело цикла выполняется, если условие окончание истинно. Значение переменных цикла, могут быть изменены после выполнения каждого шага циклы в 3 секции. В 3 секции заголовка цикла for так же можно изменять значение нескольких переменных, изменяемые переменные разделяются запятой.

Работа цикла for выполняется:

1)Переменной цикла присваивается начальное значение.

2)Если условие окончания цикла истинно, то выполняется тело цикла.

3)Изменяется значение переменной цикла, далее выполняется шаг 2.

Как только условие становится ложным, цикл завершат работу. В цикле for тело цикла может ни разу не выполнятся, если условие цикла ложно. В цикле for может произойти зацикливание, если условие окончания всегда остается истинным. В нормально ситуации тело цикла for выполняется конечное число раз. В первой сецкии цикла for допустимо не только присваивать переменным начальное значение, но и объявлять переменные. Переменная цикла, объявленная в 1 секции цикла for доступна в программе только в рамках этого цикла. Все 3 выражения заголовка оператора for являются необязательными. Цикл for у которого отсутствует значение во всех трёх секциях выполняется бесконечно. Тип данных переменных цикла for может быть любым перечисляемым типом.

Пример:

static void Main(string[] args)

{

int i;

for( i=0; i<10; i++)

Console. WriteLine("Текущее значение переменной i: {0}", i);

Console.ReadKey();}

Циклы. Оператор foreach

Если в программе один или несколько операторов необходимо выполнить несколько раз, то используют циклы. Каждый из циклов имеет свою специфику, которая определяет возможность или удобство его применения.

Проход по всем элементам массива и выполнение операций, составляющих тело цикла, для каждого элемента массива может быть выполнено в синтаксисе foreach.

Синтаксис foreach:

foreach (переменная цикла int массив)

оператор;

Пример:

static void Main(string[] args)

{

int[] arr = new int[3];

Random rnd = new Random();

for (int i=0; i < 3; i++ )

arr[i] = rnd.Next(5);

Console.WriteLine("\n\nМассив arr:");

foreach (int i in arr)

Console.Write("\t {0}", i);

Console.WriteLine("Массив arr:");

foreach (object item in arr)

Console.Write("\t {0}", item);

Console.ReadKey();

Безусловный переход

Имеющийся в С# оператор goto представляет собой оператор безусловного перехода. Когда в программе встречается оператор goto, ее выполнение переходит непосредственно к тому месту, на которое указывает этот оператор. Он уже давно "вышел из употребления" в программировании. Главный недостаток оператора goto с точки зрения программирования заключается в том, что он вносит в программу беспорядок и делает ее практически неудобочитаемой. Для выполнения оператора goto требуется метка — действительный в С# идентификатор с двоеточием. Метка должна находиться в том же методе, где и оператор goto, а также в пределах той же самой области действия.

Пример использования оператора goto:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

// Обычный цикл for выводящий числа от 1 до 5

Console.WriteLine("Обычный цикл for:");

for (int i = 1; i <= 5; i++)

Console.Write("\t{0}",i);

// Реализуем то же самое с помощью оператора goto

Console.WriteLine("\n\nА теперь используем goto:");

int j = 1;

link1:

Console.Write("\t{0}",j);

j++;

if (j <= 5) goto link1;

Console.ReadLine();

}

}

}

Массивы. Одномерные массивы

Массивом называют упорядоченную совокупность одного типа. Каждый элемент массива имеет свой порядковый номер (индекс).

Количество элементов определяет размерность массива. Индексы элементов задаются целочисленным типом данных. Массивы бывают статические и динамические.

Объявление одномерного массива:

тип[ ] имя= new тип [количество элементов];

Объявление массива с отложенной инициализацией:

int[ ] d= new int[5]

Если элементы массива не задали при объявление массива они либо вычисляются, либо вводятся пользователем. Синтаксис объявления динамических массив совпадает с объявлением статических массивов. Выражение задающее количество элементов в динамическом массиве содержит переменные. Значения этих переменных должны быть заданы до объявление массива.

Пример:

static void Main(string[] args)

{

//объявление массивов

int[] x = { 5, 5, 6, 6, 7 };

int[] A = new int[5], B = new int[5], C = new int[5];

int i, j;

const int N = 5;

Random rand = new Random();

for ( i = 0; i < N; i++)

A[i] = rand.Next(10);

for ( i = 0; i < N; i++)

{

Пример:

static void Main(string[] args)

{

int[,] matrix1 = { { 1, 2 }, { 3, 4 } };

int[,] matrix2 = new int[3, 3];

int i, j;

Console.Write("\nmatrix1: \n");

for (i = 0; i < 2; i++)

{

for (j = 0; j < 2; j++)

Console.Write("\t" + matrix1[i, j]);

Console.Write("\n");

}

// Инициализация генератора случайных чисел

Random rand = new Random();

Console.Write("\nmatrix2: \n");

for (i = 0; i < 3; i++)

{

for (j = 0; j < 3; j++)

{

matrix2[i, j] = rand.Next(10);

Console.Write("\t" + matrix2[i, j]);

}

Console.Write("\n");

}

Console.ReadKey();

}

Массивы. Массивы массивов

Массивом называют упорядоченную совокупность одного типа. Каждый элемент массива имеет свой порядковый номер (индекс). Количество элементов определяет размерность массива. Индексы элементов задаются целочисленным типом данных. Массивы бывают статические и динамические.

Массивы массивов можно рассматривать как одномерный массив, элементы которого являются массивы. Элементы, которых в свою очередь, снова могут быть массивами и так может продолжаться до некоторого уровня вложенности. Эти массивы могут применяться для представления деревьев, у которых узлы могут иметь произвольное число потомков. Если при объявление многомерных массивов для указания размерности используются запятые, то для массивов массивов применяться совокупности пар квадратных скобок.

Пример объявления массива массивов:

Объявление и инициализация

int[][] M= new int[3][]{new int[] {5,7,9,11}, new int[] {2,8} new int[] {6,12,4}};

Массив массивов имеет два уровня на верхнем уровне расположено 3 элемента, каждый из которых является массивом. Для каждого вложенного массива необходимо использовать команду new что бы создать внутренний массив. В данном примере элементы внутренних массивов получат конкретные значения при объявление массива. Допустимо так же объявлять массивы массивов без инициализации элементов

int[][]M1= new int[3][] {new int[4], new int[2], new int[3]};

Пример:

static void Main(string[] args)

{

//массив массивов -"Отцы и дети"

int Fcount = 3;

string[] Fathers = new string[Fcount];

Fathers[0] = "Николай";

Fathers[1] = "Сергей";

Fathers[2] = "Петр";

string[][] Children = new string[Fcount][];

Children[0] = new string[] { "Ольга", "Федор" };

Children[1] = new string[] { "Сергей", "Валентина", "Ирина", "Дмитрий" };

Children[2] = new string[] { "Мария", "Ирина", "Надежда" };

for (int i = 0; i < Fathers.Length; i++)

{

Console.WriteLine("Отец : {0}; Его дети:", Fathers[i]);

for (int j = 0; j < Children[i].Length; j++)

Console.Write(Children[i][j] + " ");

Console.WriteLine();

}

Console.ReadKey();

}

Массивы. Класс Array

Массивом называют упорядоченную совокупность одного типа. Каждый элемент массива имеет свой порядковый номер (индекс). Количество элементов определяет размерность массива. Индексы элементов задаются целочисленным типом данных. Массивы бывают статические и динамические.

На платформе .Net все массивы происходят от одного общего (базового) класса Array. Поэтому все созданные в программе массивы обеспечиваются специальным набором методов для создания, управления, поиска и сортировки элементов массива.

Свойства:

int Lenght — Возвращает целое число представляющее общее количество элементов во всех измерениях массива.

int Rank — Возвращает целое число обозначающие количество измерений массива (размерность).

Методы:

Array Createlnstance(тип, колличество_эп_int, количество_эп_int); - метод (один из вариантов), создает массив элементов заданного типа и определенной размерности.

int GetLenght(номер_размерности_int); - возвращает количество элементов заданной параметром размерности. Нумерация размерности массива начинается с нуля.

void SetValue(значение, позиция_х_int, позиция_у_int); - присваивает элементам массива значения.

GetValue(позиция_х_int,позиция_у_int); - извлекает значение из массива.

Clear — выполняет начальную инициализацию элементов.

GetLowerBound, GetUpperBound — возвращает верхнюю и нижнюю границу по указанному элементу.

Copy — копирует часть массива и весь массив в другой массив.

CopyTo — Копирует все элементы одномерного массива, в другой одномерный массив, начиная с заданного индекса.

IndexOf — выполняет поиск вхождения элемента в массив, если элемент в массиве отсутствует метод вернет 1, иначе будет возвращена позиция искомого элемента в массиве.

LastIndexOf — выполняет тоже, что и IndexOf, но поиск элементов выполняется с конца массива.

BinarySearch — выполняет поиск элементов, в массиве основываясь на двоичном представление значение.

Reverse — меняет порядок элементов массива на обратный

Sort — выполняет сортировку элементов

Clone — позволяет создать копию массива.

Методы перегружены и имеют ряд модификаций. Подробная информация по методам класса доступна в справочной системе через F1. Статические методы вызываются через имя класса, динамические через имя объекта этого класса.

Пример:

static void Main(string[] args)

{

// Создали и проинициализировали двумерный массив строк.

Array myArray = Array.CreateInstance(typeof(String), 2, 4);

myArray.SetValue("Каждый ", 0, 0);

myArray.SetValue("охотник ", 0, 1);

myArray.SetValue("желает ", 0, 2);

myArray.SetValue("знать,", 0, 3);

myArray.SetValue("Где ", 1, 0);

myArray.SetValue("сидит ", 1, 1);

myArray.SetValue("фазан.", 1, 2);

myArray.SetValue("", 1, 3);

// Показали содержимое массива.

Console.WriteLine("Массив myArray:");

for (int i = 0; i < myArray.GetLength(0); i++)

for (int j = 0; j <= myArray.GetLength(1); j++)

Console.WriteLine("\t[{0},{1}]:\t{2}", i, j, myArray.GetValue(i, j));

// Показали содержимое массива.

Console.WriteLine("Массив myArray:");

for (int i = myArray.GetLowerBound(0); i <= myArray.GetUpperBound(0); i++)

for (int j = myArray.GetLowerBound(1); j <= myArray.GetUpperBound(1); j++)

Console.WriteLine("\t[{0},{1}]:\t{2}", i, j, myArray.GetValue(i, j));

//объявление массивов с отложенной инициализацией

int[] u, v;

u = new int[3];

for (int i = 0; i < 3; i++) u[i] = i + 1;

v = new int[4];

v = u; //допустимое присваивание - массив v стал включать 3 элем.

Console.WriteLine("Массив u:");

for (int i = 0; i < 3; i++)

Console.WriteLine("\t[{0}]:\t{1}", i, u[i]);

Console.WriteLine("Массив v:");

for (int i = 0; i < 3; i++)

Console.WriteLine("\t[{0}]:\t{1}", i, v[i]);

Console.ReadKey();

}

Методы функции

Методы (подпрограммы) процедуры и функции позволяют решать задачу повторного использования программного кода. Разработанные или имеющиеся подпрограммы дают возможность существенно расширить возможности языка программирования. Важным шагом в автоматизации программирования является появление библиотек подпрограмм. Подпрограммы C# включены в классы и называются методами класса. На платформе .Net стандартной библиотекой является FCL.

Отличие функции: 1) функция должна возвращать хотя бы одно значение, 2) функция может быть вызвана в выражениях.

Если метод является функцией, то в блоке должен быть хотя бы один оператор return возвращающий значение функции в форме:

return (выражение);

static int fmax(int a, int b)

{

if (a > b)

return (a);

else

return (b);

}

static int fmin(int a, int b)

{

return (a < b ? a : b);

}

Методы процедуры

Методы (подпрограммы) процедуры и функции позволяют решать задачу повторного использования программного кода. Разработанные или имеющиеся подпрограммы дают возможность существенно расширить возможности языка программирования. Важным шагом в автоматизации программирования является появление библиотек подпрограмм. Подпрограммы C# включены в классы и называются методами класса. На платформе .Net стандартной библиотекой является FCL.

Отличие процедуры: 1) может не возвращать значения, 2) вызывается как отдельный оператор.

static void test()

{

Console.WriteLine("Test\n");

}

static int fmax(int a, int b)

{

if (a > b)

return (a);

else

return (b);

}

static void pow_matr(int st, params int[] m)

{

foreach (int i in m)

Console.Write("\t" + Math.Pow(Convert.ToDouble(i), Convert.ToDouble(st)));

}

Перегрузка методов

Существование в классе методов с одним и тем же именем называется перегрузкой. А сами эти методы называются перегруженными.

Перегрузка методов полезна тогда, когда требуется решать сходные по смыслу задачи с разными аргументами. Перегруженные методы, имея одинаковое имя, отличаются или числом аргументов или их типами. Уникальность объявления заголовка метода позволяет вызвать требуемый перегруженный метод.

class Program

{

static void A(out long p2, int p1)

{

p2 = (long)Math.Pow(p1, 3);

Console.WriteLine("Метод A-1");

}

static void A(out long p2, params int[] p)

{

p2 = 0; for (int i = 0; i < p.Length; i++)

p2 += (long)Math.Pow(p[i], 3);

Console.WriteLine("Метод A-2");

}

static void A(out double p2, double p1)

{

p2 = Math.Pow(p1, 3);

Console.WriteLine("Метод A-3");

}

static void A(out double p2, params double[] p)

{

p2 = 0; for (int i = 0; i < p.Length; i++)

p2 += Math.Pow(p[i], 3);

Console.WriteLine("Метод A-4");

}

static void Main(string[] args)

{

long u = 0; double v = 0;

A(out u, 7); A(out v, 7.5);

Console.WriteLine("u= {0}, v= {1}", u, v);

A(out v, 7);

Console.WriteLine("v= {0}", v);

A(out u, 7, 11, 13);

A(out v, 7.5, Math.Sin(11.5) + Math.Cos(13.5), 15.5);

Console.WriteLine("u= {0}, v= {1}", u, v);

Console.ReadKey(); } }

Функции с побочным эффектом

Функция называется функцией с побочным эффектом, если помимо результата вычисляемого функцией и возвращаемого ей в операторе return, она имеет выходные аргументы с ключевыми словами ref или out. Выражения, использующие функции с побочным эффектом, могут потерять свойства, присущие им в математике.

class Program

{

static int f(ref int a)

{

return (a++);

}

static void Main(string[] args)

{

int a = 0, b=0, c=0;

a =1;

b = a + f(ref a);

a =1;

c = f(ref a)+ a;

Console.WriteLine("a={0}, b={1}, c={2}",a,b,c);

Console.ReadKey();

}

}

Рекурсия

Метод называется рекурсивным, если при выполнении тела метода он вызывает сам себя. Рекурсивные методы наиболее удобны при работе со списками или деревьями. Рекурсия может быть прямой или косвенной (если в теле метода 1 вызывается метод 2, в теле которого вызывается метод 1). Если в теле рекурсивного метода рекурсивный вызов встречается только один раз и рекурсия является прямой, то рекурсию можно заменить циклом, что ускорит работу программы.

static long fact(int n)

{

if (n <= 1) return (1);

else return (n * fact(n - 1));

}

static void Main(string[] args)

{

Console.WriteLine("factorial(7)="+fact(7));

Console.ReadKey();

}

Отладка программы

Отладка программы – это исправление ошибок в программе. Команды, связанные с отладкой расположены в меню отладка:

1) Начать отладку(F5) компиляция и запуск программы на выполнение. Если текст программы был изменен, то при нажатии на этот пункт меню, будет выполнена повторная компиляция программы. На этом этапе выявляются синтаксические ошибки.

2) Запуск без отладки (ctrl + F5) запуск и компиляция программы без использования отладки.

3) Шаг с обходом (F10) выполнение очередного оператора программы, после которого программы приостанавливается. Следующая готовая к выполнению строка подсвечивается.

4) Шаг с заходом (F11) команда аналогична предыдущей. Но если очередным оператором является обращение к подпрограмме, управление передается внутрь подпрограммы.

5) Шаг с выходом (shift + F11) позволяет выполнить остаток кода подпрограммы до конца и выйти из неё.

6) Точка останова (F9) определение новой точки останова в месте расположения текстового курсора. Точка останова выделяется красным цветом. Повторный выбор данной команды для строки, в которой имеется точка останова, приводит к её удалению. Если программа запущена на выполнение (F5) и при и её выполнение следующим должен быть оператор, который находится в строке с точкой останова, то выполнение программы будет приостановлено, строка с точкой останова выделится подсветкой, а далее можно использовать все средства отладчика.

7) Продолжить (F5) запуск программы на выполнение с текущего места отладки.

8) Перезапустить (ctrl + shift + F5) остановка программы, её повторная компиляция в случаи необходимости и её запуск.

9) Остановить отладку(shift + F5) прекращение текущего сеанса отладки.

Меню окна позволяет отобразить диалоги в которых содержится информация об выполняемой программе. Так окно локальные отображает переменные и их значения, которые доступны в текущий момент выполнения программы. В этом окне можно так же можно изменять значения переменных. Просмотреть значение переменных можно так же, подведя курсор мыши к этим переменным. При запуске программы в среде программирования возможно задание наборов входных параметров, аналогично параметрам задаваемым с помощью командной строки. Для этого используется меню-проект-свойства-отладка-раздел аргументы командной строки.

Обмен данными между формами

Часто возникает необходимость передать значения между формами в одном приложении.

В главной форме запуск новой производим так:

Form2 frm = new Form2();

frm.Owner = this; //this – это текущая форма (Form1)

frm.Show();

После такого действия в новой форме можно обращаться к элементам родительской формы, так:

Form1 frm = (Form1) this.Owner;

frm.label1.Text = “Test”; // label1 находится на Form1.

Работа с файлами

Файл – это совокупность связных данных, хранящихся во внешней памяти компьютера и рассматривающийся как единое целое. Файлы предназначены для хранения и обработки большого объема данных в программе. Работа с файлами в программе выполняется с использованием файловой переменной. Файлы в языке программирования разделяются на группы:

Типизированные файлы

Текстовые файлы

Не типизированные файлы

При работе с файлами существует определенный порядок действий:

1)Объявление файловой переменной

2)Связывание этой переменной с конкретным файлом на диске

3)Открытие файла (для записи или чтения)

4)Выполнений действий с файлами (чтение или запись)

5)Закрытие файлов

Классы предназначены для работы с файлами. Находятся в пространстве имен Sistem.IO.

Классы Directory и File содержат статические методы для выполнения операций с папками и файлами (создание, удаление, проверка существования и т.д.)

Класс Path – создает статические методы для работы с путями и именами файлов.

Классы Binary Reader и Binary Writer включают методы, предназначенные для чтения и записи простых типов данных, как бинарных значений.

Классы Directory Info и File Info предназначены для получения информации о папках и каталогах

Класс Stream предназначен для записи или чтения последовательности байт (работа с потоком данных)

Классы Text Reader и Text Writer предназначены для чтения и записи последовательности символов.

string path = @"c:\a.txt";

if(File.Exists(path))

{

File.Delete(path);

}

using(FileStream filestream = File.Create(path, 1024))

{

Byte[] text =

new UTF8Encoding(true).GetBytes("Текст, который будет записан в файл");

filestream.Write(text, 0, text.Length);

}

CreateText(string path)

string path = @"c:\a.txt";

if(!File.Exists(path))

{

using(StreamWriter streamwriter = File.CreateText(path))

{

streamwriter.WriteLine("Строка 1");

streamwriter.WriteLine("Строка 2");

streamwriter.WriteLine("Строка 3");

}

}

OpenText(string path)

using(StreamReader streamreader = File.OpenText(path))

{

string sString = "";

while((sString = streamreader.ReadLine()) != null)

{

richTextBox1.AppendText(sString+"\r\n");

}

}

Доступ к данным СУБД

Методы доступа к БД:

1) Доступ с использованием прямого или косвенного вызова СУБД

2) Использование объектного интерфейса.

Прямой вызов программного интерфейса СУБД:

Большинство СУБД предоставляет в распоряжение программиста интерфейс API, с помощью которого программа может выполнять любые действия с БД.

Использование программного интерфейса ODBC.

Он выполнен в виде набора функций, отличается универсальностью доступа к различным СУБД. Но так как это набор функций, то ограничено его применение в веб-приложениях.

Интерфейс RDO.

Реализует возможности интерфейса ODBC, при его использовании не требуется напрямую вызывать программный интерфейс ODBC или СУБД. Преимущество: возможность доступа веб-приложений к БД.

Интерфейс OLE DB.

Является стандартом доступа к СУБД, и в отличие от ODBC и RDO, предоставляет возможность доступа приложений не только к реляционным БД, но и к БД имеющим другую архитектуру.

Интерфейс ADO.

Строится на основе объектов, реализованных в OLE DB. Данный подход доступа к СУБД является самым распространенным. Состоит из этапов:

1) Установка соединения

2) Подготовка команды и параметров

3) Выполнение команды

4) Обработка результатов выполнения команды

5) Закрытие соединения

6) Обработка ошибок

С развитием веб-приложений получают распространение многоуровневые системы. В этих системах клиент обращается к СУБД не напрямую, а через веб-сервер.

Для работы с БД в C# реализовано пространство System.Data. основной объект для работы с данными БД – объект Data Set. Данный объект может создавать наборы реляционных таблиц в СУБД и оперативной памяти. Для отображения содержа<

Наши рекомендации