Программирование

Автор работы: Пользователь скрыл имя, 28 Марта 2012 в 11:49, курс лекций

Описание

Лекции по дисциплине "Программирование"

Содержание

Лекция 1. Состав языка Типы данных Переменные и операции

Лекция 2. Линейные программы

Лекция 3. Простейшие операторы. Операторы ветвления

Лекция 4. Операторы цикла и передачи управления

Лекция 5. Обработка исключительных ситуаций

Лекция 6. Классы: основные понятия Описание класса

Лекция 7. Параметры методов

Лекция 8. Конструкторы и свойства

Лекция 9. . Массивы

Лекция 10. Символы и строки

Лекция 11 Дополнительные возможности методов. Индексаторы

Лекция 12. Операции класса. Деструкторы

Лекция 13. Наследование классов

Лекция 14. Интерфейсы

Лекция 15. Стандартные интерфейсы .NET

Лекция 16. Структуры и перечисления

Лекция 17. Делегаты

Лекция 18. События

Работа состоит из  1 файл

Лекции C#.doc

— 847.00 Кб (Скачать документ)

Пример описания свойств:

public class Button: Control 

{

    private string caption;     // закрытое поле, с которым связано свойство

    public string Caption {     // свойство

       get {                    // способ получения свойства

          return caption;

       }

       set {                      // способ установки свойства

          if (caption != value) {

             caption = value;

          }

       }

    }

    ...

}

 

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

В программе свойство выглядит как поле класса, например:

Button ok = new Button();

ok.Caption = "OK";              // вызывается метод установки свойства 

string s = ok.Caption;          // вызывается метод получения свойства 

 

При обращении к свойству автоматически вызываются указанные в нем методы чтения и установки.

Синтаксически чтение и запись свойства выглядят почти как методы. Метод get должен содержать оператор return. В методе set используется параметр со стандартным именем value, который содержит устанавливаемое значение.

Добавим в класс Monster, описанный в листинге 10.3, свойства, позволяющие работать с закрытыми полями этого класса. Код класса несколько разрастется, зато упростится его использование.

Листинг 10.3. Класс Monster со свойствами

using System;

namespace ConsoleApplication1

{

    class Monster

    {   public Monster()

        {

            this.health = 100;

            this.ammo   = 100;

            this.name   = "Noname";

        }

         public Monster( string name ) : this()

        {

            this.name = name;

        }

         public Monster( int health, int ammo, string name )

        {

            this.health = health;

            this.ammo   = ammo;

            this.name   = name;

        }

         public int Health          // свойство Health связано с полем health

        {

            get

            {

                return health;

            }

            set

            {

                if (value > 0) health = value;

                else           health = 0;

            }

        }

         public int Ammo                // свойство Ammo связано с полем ammo

        {

            get

            {

                return ammo;

            }

            set

            {

                if (value > 0) ammo = value;

                else           ammo = 0;

            }

        }

         public string Name             // свойство Name связано с полем name

        {

            get

            {

                return name;

            }

        }

         public void Passport()

        {

            Console.WriteLine("Monster {0} \t health = {1} ammo = {2}",

                              name, health, ammo);

        }

         string name;                                        // закрытые поля

        int health, ammo;

    }

       class Class1

    {   static void Main()

        {

            Monster Masha = new Monster( 200, 200, "Masha" );

            Masha.Passport();

            --Masha.Health;              // использование свойств

            Masha.Ammo += 100;           // использование свойств

            Masha.Passport();

        }

    }

}

 

Результат работы программы:

Monster Masha    health = 200 ammo = 200

Monster Masha    health = 199 ammo = 300

 

Лекция 9. Массивы

 

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

Массив в С# относится к ссылочным типам данных, то есть располагается в динамической области памяти, поэтому создание массива начинается с выделения памяти под его элементы. Элементами массива могут быть величины как значимых, так и ссылочных типов (в том числе массивы). Массив значимых типов хранит значения, массив ссылочных типов — ссылки на элементы. Всем элементам при создании массива присваиваются значения по умолчанию: нули для значимых типов и null для ссылочных.

На рис. 11.1 представлен массив, состоящий из пяти элементов любого значимого типа, например, int или double,

Вот, например, как выглядят операторы создания массива из 10 целых чисел и массива из 100 строк:

int[]    w = new int[10];

string[] z = new string[100];

 

В первом операторе описан массив w типа int[]. Операция new выделяет память под 10 целых элементов, и они заполняются нулями.

Во втором операторе описан массив z типа string[].Операция new выделяет память под 100 ссылок на строки, и эти ссылки заполняются значением null. Память под сами строки, составляющие массив, не выделяется — это будет необходимо сделать перед заполнением массива.

Количество элементов в массиве (размерность) не является частью его типа, оно задается при выделении памяти и не может быть изменено впоследствии. Размерность может задаваться не только константой, но и выражением. Результат вычисления этого выражения должен быть неотрицательным, а его тип должен иметь неявное преобразование к int, uint, long или ulong.

Элементы массива нумеруются с нуля, поэтому максимальный номер элемента всегда на единицу меньше размерности. Для обращения к элементу массива после имени массива указывается номер элемента в квадратных скобках, например:

w[4]        z[i]

 

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

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

int[] a = new int[10];

int[] b = a;             // b и a указывают на один и тот же массив

 

Все массивы в C# имеют общий базовый класс Array, определенный в пространстве имен System. В нем есть несколько полезных методов, упрощающих работу с массивами, например, методы получения размерности, сортировки и поиска. Мы рассмотрим эти методы немного позже в разделе «Класс System.Array».

В C# существуют три разновидности массивов: одномерные, прямоугольные и ступенчатые (невыровненные). О последних можно прочитать в учебнике (Т.А.Павловская. С#. Программирование на языке высокого уровня).

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

Одномерные массивы используются в программах чаще всего. Варианты описания массива:

тип[] имя;

тип[] имя = new тип [ размерность ];

тип[] имя = { список_инициализаторов };

тип[] имя = new тип [] { список_инициализаторов };

тип[] имя = new тип [ размерность ] { список_инициализаторов };

 

Примеры описаний (один пример на каждый вариант описания):

int[] a;                                    // 1    элементов нет

int[] b = new int[4];                       // 2    элементы равны 0

int[] c = { 61, 2, 5, -9 };                 // 3    new подразумевается

int[] d = new int[] { 61, 2, 5, -9 };       // 4    размерность вычисляется

int[] e = new int[4] { 61, 2, 5, -9 };      // 5    избыточное описание

 

Здесь описано пять массивов. Отличие первого оператора от остальных состоит в том, что в нем фактически описана только ссылка на массив, а память под элементы массива не выделена.

В каждом из остальных массивов по четыре элемента целого типа. Как видно из операторов 3–5, массив при описании можно инициализировать. Если при этом не задана размерность (оператор 3), количество элементов вычисляется по количеству инициализирующих значений. Для полей объектов и локальных переменных можно опускать операцию new, она будет выполнена по умолчанию (оператор 2). Если присутствует и размерность, и список инициализаторов, размерность должна быть константой (оператор 4).

В качестве примера рассмотрим программу, которая определяет сумму и количество отрицательных элементов, а также максимальный элемент массива, состоящего из 6 целочисленных элементов (листинг 11.1).

Листинг 11.1. Работа с одномерным массивом

using System;

namespace ConsoleApplication1

{    class Class1

    {

        static void Main()

        {

            const int n = 6;

            int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };

             Console.WriteLine( "Исходный массив:" );

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

                Console.Write( "\t" + a[i] );

            Console.WriteLine();

             long sum = 0;              // cумма отрицательных элементов

            int  num = 0;              // количество отрицательных элементов

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

                if ( a[i] < 0 )

                {

                    sum += a[i];

                    ++num;

                }

             Console.WriteLine( "Сумма  отрицательных = " + sum );

            Console.WriteLine( "Кол-во отрицательных = " + num );

 

            int max = a[0];             // максимальный элемент

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

                if ( a[i] > max ) max = a[i];

             Console.WriteLine( "Максимальный элемент = " + max );

        }

    }

}

 

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

Прямоугольные массивы

Прямоугольный массив имеет более одного измерения. Чаще всего в программах используются двумерные массивы. Варианты описания двумерного массива:

тип[,] имя;

тип[,] имя = new тип [ разм_1, разм_2 ];

тип[,] имя = { список_инициализаторов };

тип[,] имя = new тип [,] { список_инициализаторов };

тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов };

 

Примеры описаний (один пример на каждый вариант описания):

int[,] a;                                      // 1  элементов нет

int[,] b = new int[2, 3];                      // 2  элементы равны 0

int[,] c = {{1, 2, 3}, {4, 5, 6}};             // 3  new подразумевается

int[,] c = new int[,] {{1, 2, 3}, {4, 5, 6}};  // 4  размерность вычисляется

int[,] d = new int[2,3] {{1, 2, 3}, {4, 5, 6}};// 5  избыточное описание

 

К элементу двумерного массива обращаются, указывая номера строки и столбца, на пересечении которых он расположен, например:

a[1, 4]        b[i, j]        b[j, i]

 

В качестве примера рассмотрим программу, которая для целочисленной матрицы размером 3 x 4 определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке.

Для нахождения среднего арифметического элементов массива требуется найти их общую сумму, после чего разделить ее на количество элементов. Порядок перебора элементов массива (по строкам или по столбцам) роли не играет. Нахождение количества положительных элементов каждой строки требует просмотра матрицы по строкам. Схема алгоритма приведена на рис. 11.3, программа — в листинге 11.2.

Листинг 11.2. Работа с двумерным массивом

using System;

namespace ConsoleApplication1

{    class Class1

    {

        static void Main()

        {

            const int m = 3, n = 4;

            int[,] a = new int[m, n] {

                { 2,-2, 8, 9 },

                {-4,-5, 6,-2 },

                { 7, 0, 1, 1 }

             };

             Console.WriteLine( "Исходный массив:" );

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

            {

                for ( int j = 0; j < n; ++j )

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

                Console.WriteLine();

            }

             double sum = 0;

            int nPosEl;

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

            {

                nPosEl = 0;

                for ( int j = 0; j < n; ++j )

                {

                    sum += a[i, j];

                    if ( a[i, j] > 0 ) ++nPosEl;

                }

                Console.WriteLine( "В строке {0} {1} положит-х элементов",

                    i, nPosEl  );

            }

            Console.WriteLine( "Среднее арифметическое всех элементов: "

                + sum / m / n );

        }

    }

}

 

Класс System.Array

Все массивы в C# построены на основе базового класса Array, который содержит полезные для программиста свойства и методы, часть из которых перечислена в таблице 11.1.

Таблица 11.1. Некоторые элементы класса Array

Элемент

Вид

Описание

Length

Свойство

Количество элементов массива (по всем размерностям)

BinarySearch

Статический метод

Двоичный поиск в отсортированном массиве

Clear

Статический метод

Присваивание элементам массива значений по умолчанию

Copy

Статический метод

Копирование заданного диапазона элементов одного массива в другой массив

GetValue

Метод

Получение значения элемента массива

IndexOf

Статический метод

Поиск первого вхождения элемента в одномерный массив

Reverse

Статический метод

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

Sort

Статический метод

Упорядочивание элементов одномерного массива

Информация о работе Программирование