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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать документ)

Для уменьшения количества выполняемых действий следует воспользоваться рекуррентной формулой получения последующего члена ряда через предыдущий:

Cn+1 = CnxT,

где T — некоторый множитель. Подставив в эту формулу Cn и Cn+1, получим выражение для вычисления Т:

Рис. 4


В листинге 6.4 приведен текст программы с комментариями.

Листинг 6.4. Вычисление суммы бесконечного ряда

using System;

namespace ConsoleApplication1

{   class Class1

    {   static void Main()

        {

            double e = 1e-6;

            const int MaxIter = 500;     // ограничитель количества итераций

            Console.WriteLine( "Введите аргумент:" );

            string buf = Console.ReadLine();

            double x = Convert.ToDouble( buf );

 

            bool done = true;                 // признак достижения точности

            double ch = 1, y = ch;

            for ( int n = 0; Math.Abs(ch) > e; n++ )

            {

                ch *= x * x / ( 2 * n + 1 ) / ( 2 * n + 2 );

                y += ch;                    // добавление члена ряда к сумме

                if ( n > MaxIter ) { done = false; break; }

            }

            if ( done ) Console.WriteLine( "Сумма ряда - " + y );

            else        Console.WriteLine( "Ряд расходится" );

        }

    }

}

 

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

Оператор continue

Оператор перехода к следующей итерации текущего цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации.

Перепишем основной цикл листинга 6.4 с применением оператора continue:

for ( int n = 0; Math.Abs(ch) > e; n++ )

{

    ch *= x * x / ( 2 * n + 1 ) / ( 2 * n + 2 );

    y += ch;

    if ( n <= MaxIter ) continue;

    done = false; break;

}

 

Оператор return

Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Синтаксис оператора:

return [ выражение ];

 

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

Базовые конструкции структурного программирования

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

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

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

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

Следованием называется конструкция, реализующая последовательное выполнение двух или более операторов (простых или составных). Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия. Цикл реализует многократное выполнение оператора.

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

Целью использования базовых конструкций является получение программы простой структуры. Такую программу легко читать, отлаживать и при необходимости вносить в нее изменения. В большинстве языков высокого уровня существует несколько реализаций базовых конструкций; в С# им соответствует четыре вида циклов и два вида ветвлений.

 

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

В языке C# есть операторы, позволяющие обнаруживать и обрабатывать ошибки (исключительные ситуации), возникающие в процессе выполнения программы.

Исключительная ситуация, или исключение, — это возникновение аварийного события, которое может порождаться некорректным использованием аппаратуры или неправильной работой программы, например, делением на ноль или переполнением. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. С# дает программисту возможность восстановить работоспособность программы и продолжить ее выполнение.

Исключения С# не поддерживают обработку асинхронных событий, таких как ошибки оборудования или прерывания, например, нажатие клавиш Ctrl+C. Механизм исключений предназначен только для событий, которые могут произойти в результате работы самой программы и указываются явным образом. Исключения возникают тогда, когда некоторая часть программы не смогла сделать то, что от нее требовалось. При этом другая часть программы может попытаться сделать что-нибудь иное.

Исключения позволяют логически разделить вычислительный процесс на две части — обнаружение аварийной ситуации и ее обработка. Это важно не только для лучшей структуризации программы. Главное то, что функция, обнаружившая ошибку, может не знать, что предпринимать для ее исправления, а использующий эту функцию код может знать, что делать, но не уметь определить место возникновения. Это особенно актуально при использовании библиотечных функций и программ, состоящих из многих модулей.

Исключения генерирует либо среда выполнения, либо программист с помощью оператора throw. В таблице 7.1 приведены наиболее часто используемые стандартные исключения, генерируемые средой. Они определены в пространстве имен System. Все они являются потомками класса Exception, а точнее, потомками его потомка SystemException.

Таблица 7.1. Часто используемые стандартные исключения

Имя

Описание

DivideByZeroException

Попытка деления на ноль

FormatException

Попытка передать в метод аргумент неверного формата

IndexOutOfRangeException

Индекс массива выходит за границы диапазона

InvalidCastException

Ошибка преобразования типа

OutOfMemoryException

Недостаточно памяти для создания нового объекта

OverFlowException

Переполнение при выполнении арифметических операций

StackOverFlowException

Переполнение стека

 

Исключения обнаруживаются и обрабатываются в операторе try.

Оператор try

Оператор try содержит три части:

                    контролируемый блок — составной оператор, предваряемый ключевым словом try. В контролируемый блок включаются потенциально опасные операторы программы. Все функции, прямо или косвенно вызываемые из блока, также считаются ему принадлежащими;

                    один или несколько обработчиков исключений — блоков catch, в которых описывается, как обрабатываются ошибки различных типов;

                    блок завершенияfinally выполняется независимо от того, возникла ошибка в контролируемом блоке или нет.

Синтаксис оператора try:

try блок [ блоки catch ] [ блок finally ]

 

Отсутствовать могут либо блоки catch, либо блок finally, но не оба одновременно.

Рассмотрим, каким образом реализуется обработка исключительных ситуаций.

                    Обработка исключения начинается с появления ошибки. Функция или операция, в которой возникла ошибка, генерирует исключение.

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

                    Выполняется блок finally, если он присутствует.

                    Если обработчик не найден, вызывается стандартный обработчик исключения. Обычно он выводит на экран окно с информацией об исключении и завершает текущий процесс.

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

Существуют три формы записи обработчиков:

catch( тип имя ) {  /* тело обработчика */ }

catch( тип )     {  /* тело обработчика */ }

catch            {  /* тело обработчика */ }

 

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

Вторая форма не предполагает использования информации об исключении, играет роль только его тип.

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

try {

   ...  // Контролируемый блок

}

catch ( OverflowException e ) {

    ...    // Обработка исключений класса OverflowException (переполнение)

}

catch ( DivideByZeroException ) {

    ... // Обработка исключений класса DivideByZeroException (деление на 0)

}

catch {

    ...    // Обработка всех остальных исключений

}

 

Если исключение в контролируемом блоке не возникло, все обработчики пропускаются.

В любом случае, произошло исключение или нет, управление передается в блок завершения finally (если он существует), а затем — первому оператору, находящемуся непосредственно за оператором try.

Операторы try могут многократно вкладываться друг в друга. Исключение, которое возникло во внутреннем блоке try и не было перехвачено соответствующим блоком catch, передается на верхний уровень, где продолжается поиск подходящего обработчика. Этот процесс называется распространением исключения.

Оператор throw

До сих пор мы рассматривали исключения, которые генерирует среда выполнения C#, но это может сделать и сам программист. Для генерации исключения используется оператор throw с параметром, определяющим вид исключения. Параметр должен быть объектом, порожденным от стандартного класса System.Exception. Этот объект используется для передачи информации об исключении его обработчику.

Синтаксис оператора throw:

throw [ выражение ];

 

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

throw new DivideByZeroException();

 

Здесь после слова throw записано выражение, создающее объект стандартного класса «ошибка при делении на 0» с помощью операции new.

При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика с передачей ему управления. Обработчик считается найденным, если тип объекта, указанного после throw, либо тот же, что задан в параметре catch, либо является производным от него.

 

Лекция 6. Описание класса

 

Все приведенные ранее программы состояли из одного класса с одним-единственным методом Main. Настало время подробнее изучить состав, правила создания и использования классов.

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

Описание класса содержит ключевое слово class, за которым следует его имя, а далее в фигурных скобках — тело класса, то есть список его элементов. Кроме того, для класса можно задать его базовые классы (предки) и ряд необязательных атрибутов и спецификаторов, определяющих различные характеристики класса:

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