Автор работы: Пользователь скрыл имя, 28 Марта 2012 в 11:49, курс лекций
Лекции по дисциплине "Программирование"
Лекция 1. Состав языка Типы данных Переменные и операции
Лекция 2. Линейные программы
Лекция 3. Простейшие операторы. Операторы ветвления
Лекция 4. Операторы цикла и передачи управления
Лекция 5. Обработка исключительных ситуаций
Лекция 6. Классы: основные понятия Описание класса
Лекция 7. Параметры методов
Лекция 8. Конструкторы и свойства
Лекция 9. . Массивы
Лекция 10. Символы и строки
Лекция 11 Дополнительные возможности методов. Индексаторы
Лекция 12. Операции класса. Деструкторы
Лекция 13. Наследование классов
Лекция 14. Интерфейсы
Лекция 15. Стандартные интерфейсы .NET
Лекция 16. Структуры и перечисления
Лекция 17. Делегаты
Лекция 18. События
вещественная_переменная := целое_выражение;
Результатом операции присваивания является значение, записанное в левый операнд. Тип результата совпадает с типом левого операнда.
В сложных операциях присваивания ( +=, *=, /= и т п.) при вычислении выражения, стоящего в правой части, используется значение из левой части. Например, при сложении с присваиванием ко второму операнду прибавляется первый, и результат записывается в первый операнд, то есть выражение a += b является более компактной записью выражения a = a + b.
Результатом операции сложного присваивания является значение, записанное в левый операнд.
Операции присваивания правоассоциативны, то есть выполняются справа налево, в отличие от большинства других операций (a = b = c означает a = (b = c)).
Лекция 2. Линейные программы
Линейной называется программа, все операторы которой выполняются последовательно в том порядке, в котором они записаны.
Любая программа при вводе исходных данных и выводе результатов взаимодействует с внешними устройствами. Совокупность стандартных устройств ввода и вывода, то есть клавиатуры и экрана, называется консолью. В языке C# нет операторов ввода и вывода. Вместо них для обмена с внешними устройствами применяются стандартные объекты. Для работы с консолью в C# применяется класс Console, определенный в пространстве имен System. Методы этого класса Write и WriteLine уже использовались в листинге 3.1. Поговорим о них подробнее, для чего внесем некоторые изменения в этот листинг. Результаты этих изменений представлены в листинге 3.2.
Листинг 3.2. Методы вывода
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
int i = 3;
double y = 4.12;
decimal d = 600m;
string s = "Вася";
Console.WriteLine( "i = " + i ); // 1
Console.WriteLine( "y = {0} \nd = {1}", y, d ); // 2
Console.WriteLine( "s = " + s ); // 3
}
}
}
Результат работы программы:
i = 3
y = 4,12
d = 600
s = Вася
До сих пор мы использовали метод WriteLine для вывода значений переменных и литералов различных встроенных типов. Это возможно благодаря тому, что в классе Console существует несколько вариантов методов с именами Write и WriteLine, предназначенных для вывода значений различных типов.
Методы с одинаковыми именами, но разными параметрами называются перегруженными. Компилятор определяет, какой из методов вызван, по типу передаваемых в него величин. Методы вывода в классе Console перегружены для всех встроенных типов данных, кроме того, предусмотрены варианты форматного вывода.
Листинг 3.9 содержит два наиболее употребительных варианта вызова методов вывода. Если метод WriteLine вызван с одним параметром, он может быть любого встроенного типа. Нам же требуется вывести в каждой строке не одну, а две величины, поэтому прежде чем передавать их для вывода, их требуется «склеить» в одну строку с помощью операции +.
Перед объединением строки с числом надо преобразовать число из его внутренней формы представления в последовательность символов, то есть в строку. Преобразование в строку определено во всех стандартных классах C# — для этого служит метод ToString(). В данном случае он выполняется неявно.
Оператор 2 иллюстрирует форматный вывод. В этом случае используется другой вариант метода WriteLine. Первым параметром методу передается строковый литерал, содержащий, помимо обычных символов, предназначенных для вывода на консоль, параметры в фигурных скобках, а также управляющие последовательности. Параметры нумеруются с нуля, перед выводом они заменяются значениями соответствующих переменных в списке вывода.
Из управляющих последовательностей чаще всего используются символы перевода строки (\n) и горизонтальной табуляции (\t).
Рассмотрим простейшие способы ввода с клавиатуры. В классе Console определены методы ввода строки и отдельного символа, но нет методов, которые позволяют непосредственно считывать с клавиатуры числа. Ввод числовых данных выполняется в два этапа:
Символы, представляющие собой число, вводятся с клавиатуры в строковую переменную.
Выполняется преобразование из строки в переменную соответствующего типа.
Преобразование можно выполнить либо с помощью специального класса Convert, определенного в пространстве имен System, либо с помощью метода Parse, имеющегося в каждом стандартном арифметическом классе. В листинге 3.3 используются оба способа.
Листинг 3.3. Методы ввода
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
Console.WriteLine( "Введите строку" );
string s = Console.ReadLine();
Console.WriteLine( "s = " + s );
Console.WriteLine( "Введите символ" );
char c = (char)Console.Read();
Console.ReadLine();
Console.WriteLine( "c = " + c );
string buf; // строка – буфер для ввода чисел
Console.WriteLine( "Введите целое число" );
buf = Console.ReadLine();
int i = Convert.ToInt32( buf ); // 4
Console.WriteLine( i );
Console.WriteLine( "Введите вещественное число" );
buf = Console.ReadLine();
double x = Convert.ToDouble( buf ); // 5
Console.WriteLine( x );
Console.WriteLine( "Введите вещественное число" );
buf = Console.ReadLine();
double y = double.Parse( buf ); // 6
Console.WriteLine( y );
Console.WriteLine( "Введите вещественное число" );
buf = Console.ReadLine();
decimal z = decimal.Parse( buf ); // 7
Console.WriteLine( z );
}
}
}
Ввод строки выполняется в операторе 1. Длина строки не ограничена, ввод выполняется до символа перевода строки.
Ввод символа выполняется с помощью метода Read, который считывает один символ из входного потока (оператор 2). Метод возвращает значение типа int, представляющее собой код символа, или –1, если символов во входном потоке нет (например, пользователь нажал клавишу Enter). Поскольку нам требуется не int, а char, а неявного преобразования от int к char не существует, приходится применить операцию явного преобразования типа.
Оператор 3 считывает остаток строки и никуда его не передает. Это необходимо потому, что ввод данных выполняется через буфер — специальную область оперативной памяти. Фактически данные сначала заносятся в буфер, а затем считываются оттуда процедурами ввода. Занесение в буфер выполняется по нажатию клавиши Enter вместе с ее кодом. Метод Read, в отличие от ReadLine, не очищает буфер, поэтому следующий после него ввод будет выполняться с того места, на котором закончился предыдущий.
В операторах 4 и 5 используются методы класса Convert, в операторах 6 и 7 — методы Parse классов Double и Decimal библиотеки .NET, которые используются здесь через имена типов С# double и decimal.
Часто бывает удобно заранее подготовить исходные данные в текстовом файле и считывать их в программе. Вывод из программы тоже бывает полезно выполнить не на экран, а в текстовый файл. Работа с файлами подробно рассматривается позже, а сейчас приведем лишь образцы для использования в программах. В листинге 3.4 приведена версия программы из листинга 3.2, выполняющая вывод не на экран, а в текстовый файл с именем output.txt. Файл создается в том же каталоге, что и исполняемый файл программы, по умолчанию — ...\ConsoleApplication1\bin\
Листинг 3.4. Вывод в текстовый файл
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
StreamWriter f = new StreamWriter( "output.txt" ); // 2
int i = 3;
double y = 4.12;
decimal d = 600m;
string s = "Вася";
f.WriteLine( "i = " + i );
f.WriteLine( "y = {0} \nd = {1}", y, d ); // 4
f.WriteLine( "s = " + s );
f.Close();
}
}
}
Для того чтобы использовать в программе файлы, необходимо:
Подключить пространство имен, в котором описываются стандартные классы для работы с файлами (оператор 1).
Объявить файловую переменную и связать ее с файлом на диске (оператор 2).
Выполнить операции ввода-вывода (операторы 3–5).
Закрыть файл (оператор 6).
Ввод данных из файла выполняется аналогично. В листинге 3.5 приведена программа, аналогичная листингу 3.3, но ввод выполняется из файла с именем input.txt, расположенного в каталоге D:\C#. Текстовый файл можно создать с помощью любого текстового редактора, удобно использовать Visual Studio.NET.
Листинг 3.5. Ввод из текстового файла
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
StreamReader f = new StreamReader( "d:\\C#\\input.txt" );
string s = f.ReadLine();
Console.WriteLine( "s = " + s );
char c = (char)f.Read();
f.ReadLine();
Console.WriteLine( "c = " + c );
string buf;
buf = f.ReadLine();
int i = Convert.ToInt32( buf );
Console.WriteLine( i );
buf = f.ReadLine();
double x = Convert.ToDouble( buf );
Console.WriteLine( x );
buf = f.ReadLine();
double y = double.Parse( buf );
Console.WriteLine( y );
buf = f.ReadLine();
decimal z = decimal.Parse( buf );
Console.WriteLine( z );
f.Close();
}
}
}
В выражениях часто используются математические функции, например, синус или возведение в степень. Они реализованы в классе Math, определенном в пространстве имен System. Описание методов и полей класса приведено в таблице 3.8.
Таблица 3.8. Основные поля и статические методы класса Math
Имя | Описание | Результат | Пояснения |
Abs | Модуль | Перегружен | |x| записывается как Abs(x) |
Acos | Арккосинус | double | Acos(doublex) |
Asin | Арксинус | double | Asin(doublex) |
Atan | Арктангенс | double | Atan(doublex) |
Atan2 | Арктангенс | double | Atan2(doublex, doubley) — угол, тангенс которого есть результат деления y на x |
BigMul | Произведение | long | BigMul(intx, inty) |
Ceiling | Округление до большего целого | double | Ceiling(doubleх) |
Cos | Косинус | double | Сos(doublex) |
Cosh | Гиперболический косинус | double | Cosh(doublex) |
DivRem | Деление и остаток | Перегружен | DivRem(x, y, rem) |
E | База натурального логарифма (число е) | double | 2,71828182845905 |
Exp | Экспонента | double | e записывается как Exp(x) |
Floor | Округление до меньшего целого | double | Floor(doubleх) |
IEEERemainder | Остаток от деления | double | IEEERemainder(doublex, doubley) |
Log | Натуральный логарифм | double | logex записывается как Log(x) |
Log10 | Десятичный логарифм | double | log10x записывается как Log10(x) |
Max | Максимум из двух чисел | Перегружен | Max(x, y) |
Min | Минимум из двух чисел | Перегружен | Min(x, y) |
PI | Значение числа PI | double | 3,14159265358979 |
Pow | Возведение в степень | double | x записывается как Pow(x, y) |
Round | Округление | Перегружен | Round(3.1) даст в результате 3 Round(3.8) даст в результате 4 |
Sign | Знак числа | int | Аргументы перегружены |
Sin | Синус | double | Sin(doublex) |
Sinh | Гиперболический синус | double | Sinh(doublex) |
Sqrt | Квадратный корень | double | xx записывается как Sqrt(x) |
Tan | Тангенс | double | Tan(doublex) |
Tanh | Гиперболический тангенс | double | Tanh(doublex) |
В листинге 3.6 приведен пример применения двух методов класса Math. Остальные методы используются аналогично.
Листинг 3.6. Применение методов класса Math
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
Console.Write( "Введите х: " );
string buf = Console.ReadLine();
double x = double.Parse( buf );
Console.WriteLine( "Значение sin: " + Math.Sin(x) );
Console.Write( "Введите y: " );
buf = Console.ReadLine();
double y = double.Parse( buf );
Console.WriteLine( "Максимум : " + Math.Max(x, y) );
}
}
Лекция 3. Простейшие операторы. Операторы ветвления
Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения. Частным случаем выражения является пустой оператор; (он используется, когда по синтаксису оператор требуется, а по смыслу — нет). Примеры:
i++; // выполняется операция инкремента
a *= b + c; // выполняется умножение с присваиванием
fun( i, k ); // выполняется вызов функции
while( true ); // цикл из пустого оператора (бесконечный)
Блок, или составной оператор, — это последовательность описаний и операторов, заключенная в фигурные скобки. Блок воспринимается компилятором как один оператор и может использоваться всюду, где синтаксис требует одного оператора, а алгоритм — нескольких. Блок может содержать один оператор или быть пустым.
Условный оператор if используется для разветвления процесса вычислений на два направления.
Формат оператора:
if ( логическое_выражение ) оператор_1; [ else оператор_2; ]
Сначала вычисляется логическое выражение. Если оно имеет значение true, выполняется первый оператор, иначе — второй. После этого управление передается на оператор, следующий за условным. Ветвь else может отсутствовать.
Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок. Блок может содержать любые операторы, в том числе описания и другие условные операторы, но не может состоять из одних описаний.
Примеры условных операторов:
if ( a < 0 ) b = 1;
if ( a < b && ( a > d || a == 0 ) ) b++; else { b *= a; a = 0; } // 2
if ( a < b ) if ( a < c ) m = a; else m = c;
else if ( b < c ) m = b; else m = c; // 3
if ( b > a ) max = b; else max = a;
Если требуется проверить несколько условий, их объединяют знаками логических условных операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и одно из условий в скобках. Оператор в примере 3 вычисляет наибольшее значение из трех переменных. Обратите внимание, что компилятор относит часть else к ближайшему ключевому слову if.