Лекция 1: Прикладная информатика Введение
Разделы информатики
Прикладная информатика
Использование языка C# для решения задач прикладной информатики
Литература
Принципы объектно-ориентированного программирования Массивы
Принципы объектно-ориентированного программирования
Классы и объекты - Обзор
Что такое класс?
Синтаксис класса
Состав класса
Определение простых классов
Что такое объект?
Создание новых экземпляров класса
Использование инкапсуляции
Объединение данных и методов
Контроль видимости доступа
Зачем нужна инкапсуляция?
Объектные данные
Использование статических данных
Использование статических методов
Hello, World
Создание вложенных классов
Доступ к вложенным классам
Массивы
Что такое массив?
Форма записи массива в C#
Ранг массива
Создание экземпляров массивов
Инициализация массивов
Использование при инициализации массива операции new
Инициализация многомерных массивов
Организация доступа к элементам массива
Проверка на отсутствие нарушения границ массива
Выход за границы массива
Сравнение массивов и коллекций
Создание массивов вычисляемого размера
Копирование переменных массива
Использование массивов
Свойства массивов
Класс Array - Методы обработки массивов
Передача и возвращение массивов в качестве параметров
Аргументы командной строки
Использование массивов с циклом foreach
Массивы массивов
Созданием массивов с инициализацией
Организация ввода-вывода
Понятие о потоках
Байтовый поток
Байтовый поток. Пример
Символьный поток
Символьный поток. Пример
Двоичный поток
Двоичный поток
2.69M
Category: informaticsinformatics

Прикладная информатика. (Лекция 1)

1. Лекция 1: Прикладная информатика Введение

1

2. Разделы информатики

Информатика – наука о способах получения, хранения, обработки, передачи,
защиты и использования информации.
Разделы информатики:
Теоретическая информатика - занимается теорией формальных языков и
автоматов, теориями вычислимости
и сложности, теорией графов,
криптологией, логикой и т.п.
Практическая информатика - обеспечивает фундаментальные понятия для
решения стандартных задач.
Техническая информатика
вычислительной техники.
Прикладная информатика - объединяет конкретные применения
информатики в различных областях жизни, науки или производства,
например,
бизнес-информатика,
геоинформатика,
компьютерная
лингвистика и др.
Естественная информатика - изучает процессы обработки информации в
естественной среде.
-
занимается
аппаратной
частью
2

3. Прикладная информатика

Определяет
отраслях:
применение
информатики
IT-бизнес;
IT-менеджмент;
IT в образовании;
IT в государственных программах;
IT в естественных науках;
Разработка
средств.
и
использование
в
следящих
инструментальных
3

4. Использование языка C# для решения задач прикладной информатики

4

5. Литература

http://msdn.microsoft.com/ru-ru/vstudio/default.aspx
Спецификация языка C#. Версия 4.0. – 567 с.
Герберт Шилдт С# 4.0: полное руководство. : Пер. с англ. — М. :
ООО "И.Д. Вильямс", 2011. — 1056 с.
Трей Неш C# 2010: ускоренный курс для профессионалов. –
М.:ООО "И.Д. Вильямс". 2010. – 592 с.
ЭндрюТроелсен Язык программирования С# 2010 и платформа
.NET 4.0, 5-е изд. : Пер. с англ. — М. : ООО "И.Д. Вильяме", 2011. –
1392 с.
Фаронов В.В. Программирование на языке C#. – СПб.: Питер,
2007. – 240с.
Карли Уотсон, Кристиан Нейгел, Якоб Хаммер и др. Visual C#
2008: базовый курс. Visual Studio® 2008
5

6. Принципы объектно-ориентированного программирования Массивы

Принципы объектноориентированного
программирования
Массивы
6

7. Принципы объектно-ориентированного программирования

Классы и объекты
Использование инкапсуляции
C# и объектно-ориентированное программирование
Разработка объектно-ориентированных систем
7

8. Классы и объекты - Обзор

Что такое класс?
Что такое объект?
Сравнение классов со структурами
8

9. Что такое класс?

С точки зрения философа…
Автомобиль?
Искусственное понятие, используемое людьми для
классификации
Классификация основывается на общности свойств или
общности в поведении
Согласованность в описании и именовании используемых
классов
Для создания словаря; в общении; когда думаем.
С точки зрения ООП-программиста…
Именованная синтаксическая конструкция, описывающая общие
свойства и общее поведение
Структура данных, содержащая как данные, так и функции
9

10. Синтаксис класса

Синтаксис описания класса:
[атрибуты][спецификаторы]class имя[:список_родителей]
{тело_класса}

1
Спецификатор
new
Описание
Задает новое описание класса взамен унаследованного от предка.
Используется для вложения классов (в иерархии объектов).
2
3
public
protected
4
5
internal
protected internal
6
private
7
static
8
sealed
9
abstract
Доступ к классу не ограничен
Доступ только из данного или производного класса. Используется
для вложенных классов.
Доступ только из данной программы (сборки).
Доступ только из данного и производного класса и из данной
программы (сборки).
Доступ только из элементов класса, внутри которых описан данный
класс. Используется для вложенных классов.
Статический класс. Позволяет обращатся к методам класса без
создания экземпляра класса
Бесплодный класс. Запрещает наследование данного класса.
Применяется в иерархии объектов.
Абстрактный класс. Применяется в иерархии объектов.
10

11. Состав класса

Класс можно описывать непосредственно внутри
пространства имен или внутри другого класса.
В теле класса могут быть объявлены:
константы;
поля;
конструкторы и деструкторы;
методы;
события;
делегаты;
классы (структуры, интерфейсы, перечисления).
11

12. Определение простых классов

Данные и методы вместе внутри класса
Методы public, данные private
class BankAccount
{
public void Withdraw(decimal amount)
{ ... }
public void Deposit(decimal amount)
{ ... }
private decimal balance;
private string name;
}
Public методы
описывают
доступное
поведение
Private поля
описывают
недоступное
состояние
12

13. Что такое объект?

Объект – это экземпляр класса
Характеристики объекта:
Индивидуальность: Объекты должны отличаться
друг от друга
Поведение: объекты могут выполнять задачи
Состояние: Объекты хранят информацию
13

14. Создание новых экземпляров класса

struct Time
{
public int hour;
public int minute;
}
class BankAccount
{
...
...
}
При объявление переменной класса объект не создается
Для создания объекта используйте оператор new
class Program
now hour
{
minute
static void Main( )
yours
{
... новый
... BankAccount
Time now;
объект
now.hour = 11;
BankAccount yours = new BankAccount( );
yours.Deposit(999999M);
}
14
}

15. Использование инкапсуляции

Объединение данных и методов
Контроль видимости доступа
Зачем нужна инкапсуляция?
Объектные данные
Использование статических данных
Использование статических методов
15

16. Объединение данных и методов

Объединяйте данные и методы в одной капсуле
Граница капсулы определяет внешнее и внутреннее
Синтаксис описания элемента данных:
[атрибуты] [спецификаторы] [const] тип имя [ = начальное_значение ]
Withdraw( )
Withdraw( )
balance
balance
Deposit( )
Deposit( )
BankAccount
BankAccount
16

17. Контроль видимости доступа

Методы определяются как public и доступны извне
Данные определяются как private и доступны только
изнутри
Withdraw( )
Withdraw( )
balance
balance
Deposit( )
Deposit( )
BankAccount
BankAccount
17

18. Зачем нужна инкапсуляция?

Можно контролировать
Объект используется
только через
public-методы
Можно изменять
На использование
объекта не влияют
возможные изменения
типов скрытых данных
Withdraw( )
Deposit( )
balance 12.56
Withdraw( )
Deposit( )
dollars 12
cents
56
18

19. Объектные данные

Объектные данные содержат индивидуальную
информацию об объекте
Например, каждый банковский счет содержит свой
баланс.Если два банковских счета имеют
одинаковый баланс, то это всего лишь совпадение
Withdraw( )
Withdraw( )
Deposit( )
Deposit( )
balance 12.56
balance
owner
owner
"Bert"
12.56
"Fred"
19

20. Использование статических данных

Статические данные содержат информацию обо всех
объектах класса
Например, предположим, что все счета имеет
одинаковую процентную ставку. Хранение этого
значения в каждом счете нецелесообразно. Почему?
Withdraw( )
Withdraw( )
Deposit( )
Deposit( )
balance 12.56
balance
99.12
interest 7%
interest 7%
20

21. Использование статических методов

Статические методы имеют доступ только к
статическим данным
Статический метод применяется на уровне класса, а
не объекта
Класс account
InterestRate( )
interest 7%
Классы содержат статические
данные и статические методы
Объект account
Withdraw( )
Deposit( )
balance
owner
99.12
"Fred"
Объекты содержат объектные
данные и объектные методы
21

22. Hello, World

using System;
class Hello
{
public static int Main( )
{
Console.WriteLine("Hello, World");
return 0;
}
}
22

23. Создание вложенных классов

Классы можно вкладывать в другие классы
class Program
{
static void Main( )
{
Bank.Account yours = new Bank.Account( );
}
}
class Bank
{
... class Account { ... }
Полное имя вложенного
класса включает в себя
}
имя внешнего класса
23

24. Доступ к вложенным классам

Вложенные классы также могут объявляться как
public или private
class Bank
{
public class Account { ... }
private class AccountNumberGenerator { ... }
}
class Program
{
static void Main( )
{
Bank.Account
accessible;
Bank.AccountNumberGenerator inaccessible;
}
}
24

25. Массивы

25

26.

Обзор массивов
Обзор массивов
Форма записи массива в C#
Ранг массива
Создание экземпляров массивов
Инициализация массивов
Организация доступа к элементам массива
Инициализация многомерных массивов
Проверка границ массива
Сравнение массивов и коллекций
Использование массивов
26

27. Что такое массив?

Массив –это последовательный набор элементов
Все элементы массива одного типа
Структуры могут хранить элементы разных типов
Доступ к конкретным элементам массива происходит
через использование индекса
Integer index 0
(zero)
Integer index 4
(four)
27

28. Форма записи массива в C#

При объявлении массива необходимо определить
следующее:
Тип элементов массива
Ранг массива
Имя массива
type[ ] name;
int [] arr;
Определяет имя массива
Определяет ранг массива
Определяет тип элементов массива
28

29. Ранг массива

Вместо слова ранг иногда говорят размерность
Количество индексов, определяющих каждый из
элементов
long[ ] row;
Ранг 1: Одномерныйl
Один индекс для определения
каждого элемента типа long
int[,] grid;
Ранг 2: Двумерный
Два индекса для определения
каждого элемента типа int
29

30. Создание экземпляров массивов

Объявление массива не приводит к созданию массива
Для создания массива необходимо использовать слово
new
Все элементы массива имеют значение по умолчанию,
равное нулю
row
long[ ] row = new long[4];
0 0 0 0
Variable
int[,] grid = new int[2,3];
grid
Instance
0 0 0
0 0 0
30

31. Инициализация массивов

Можно явным образом инициализировать массивы
Можно использовать удобную краткую запись
long[ ] row = new long[4] {0, 1, 2, 3};
long[ ] row = {0, 1, 2, 3};
Равносильно
0 1 2 3
row
31

32. Использование при инициализации массива операции new

Данная форма инициализации массива может
оказаться полезной в случае, когда уже
существующей ссылке на массив присваивается
ссылка на новый массив.
static void Main()
{
int[] myArray = { 0, 1, 2, 3, 4, 5};
int i;
for (i = 0; i < 6; i++)
Console.Write(" "+myArray[i]);
Console.WriteLine("\nНовый массив: ");
myArray = new int[] { 9, 1, 10, 8, 7, 3, 16, 5, 87, 4 };
for (i = 0; i < 10; i++)
Console.Write(" " + myArray[i]);
}
32

33. Инициализация многомерных массивов

Можно инициализировать и многомерные массивы
Необходимо определить все элементы
int[,] grid = {
{5, 4, 3},
{2, 1, 0}
};
int[,] grid = {
{5, 4, 3},
{2, 1
}
};
Неявно new int[2,3] массив
grid
5 4 3
2 1 0
33

34. Организация доступа к элементам массива

Определяйте индекс для каждой из размерностей
Индекс первого элемента равен нулю
long[ ] row;
...
row[3];
int[,] grid;
...
grid[1,2];
2
3
1
34

35. Проверка на отсутствие нарушения границ массива

При попытке доступа к элементу массива производится
проверка на отсутствие нарушения границ
При использовании несуществующего индекса
выбрасывается исключение IndexOutOfRangeException
Используйте свойство Length и метод GetLength
row
grid
grid.GetLength(0)==2
row.GetLength(0)==6
row.Length==6
grid.GetLength(1)==4
grid.Length==2*4
35

36. Выход за границы массива

Выход за границы массива в C# расценивается как
ошибка, в ответ на которую генерируется
исключение - IndexOutOfRangeException
static void Main()
{
int[] myArr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i;
try
{
for (i = 0; i <= 10; i++)
Console.WriteLine(myArr[i]);
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Exception: Выход за границу");
}
}
36

37. Сравнение массивов и коллекций

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

38. Создание массивов вычисляемого размера

Размер массива не обязан быть константой,
определяемой на этапе компиляции
Это может быть любое целочисленное выражение
Доступ к элементам будет таким же быстрым
Размер массива, определяемый целочисленной
константой на этапе компиляции:
long[ ] row = new long[4];
Размер массива, определяемый целочисленным
выражением на этапе выполнения:
string s = Console.ReadLine();
int size = int.Parse(s);
long[ ] row = new long[size];
38

39. Копирование переменных массива

При копировании переменной массива копируется
только переменная массива
Не создается копия экземпляра массива
Две переменные массива могут ссылаться на один и
тот же экземпляр массива
long[ ] row = new long[4];
0 0 0 0
long[ ] copy = row;
row
...
row[0]++;
copy
long value = copy[0];
Console.WriteLine(value);
Переменная
Экземпляр
39

40. Использование массивов

Свойства массива
Методы массива
Возвращение массивов из методов
Передача массивов в качестве параметров
Аргументы командной строки
Использование массивов с циклом foreach
40

41. Свойства массивов

long[ ] row = new long[4];
0 0 0 0
row.Rank
1
row.Length
4
row
int[,] grid = new int[2,3];
grid
0 0 0
0 0 0
grid.Rank
2
grid.Length
6
41

42. Класс Array - Методы обработки массивов

Часто используемые методы
Sort – сортирует элементы одномерного массива
Clear – устанавливает для указанного диапазона
элементов значения 0, false или null
Copy – создает копию массива
IndexOf – возвращает индекс впервые встречаемого
значения
42

43. Передача и возвращение массивов в качестве параметров

class Example2 {
static void Main( ) {
int[ ] arg = {10, 9, 8, 7};
Method(arg);
System.Console.WriteLine(arg[0]);
}
//передача массивов
static void Method(int[ ] parameter) {
parameter[0]++;
}
//возвращение массивов
static int[ ] CreateArray(int size) {
int[ ] created = new int[size];
return created;
}
}
43

44. Аргументы командной строки

В процессе выполнения аргументы командной
строки передаются в Main
Main может принимать в качестве параметра массив
из строк
Имя программы не является членом массива
class Example3 {
static void Main(string[ ] args) {
for (int i = 0; i < args.Length; i++) {
System.Console.WriteLine(args[i]);
}
}
}
44

45. Использование массивов с циклом foreach

Цикл foreach позволяет скрыть подробности
перебора элементов массива
Синтаксис:
foreach (<тип> <имя> in <группа>)
{<тело цикла>}
class Example {
static void Main(string[ ] args) {
foreach (string arg in args)
{
System.Console.WriteLine(arg);
}
}
}
45

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

Jagged arrays - изрезанные (ступенчатые)
одномерный массив, элементы которого являются
массивами, элементы которых, в свою очередь,
снова могут быть массивами, и так может
продолжаться до некоторого уровня вложенности.
Объявление ступенчатого массива:
тип [][] имя_массива;
46

47. Созданием массивов с инициализацией

Требуется вызывать конструктор для каждого
массива на самом нижнем уровне
int[][] jagger = new int[3][]
{
new int[] {5,7,9,11},
new int[] {2,8},
new int[] {6,12,4}
};
или
int[][] jagger1 = new int[3][]
{
new int[4],
new int[2],
new int[3]
};
47

48. Организация ввода-вывода

С#-программы выполняют операции ввода-вывода
посредством потоков, которые построены на
иерархии классов.
Поток (stream) - это абстракция, которая генерирует
и принимает данные.
Потоки:
байтовые,
символьные,
двоичные
48

49. Понятие о потоках

Класс Stream пространства имен System.IO представляет байтовый поток и является базовым
для всех остальных потоковых классов.
Из класса Stream выведены байтовые классы
потоков:
FileStream - байтовый поток, разработанный для
файлового ввода-вывода,
BufferedStream - заключает в оболочку байтовый
поток и добавляет буферизацию;
MemoryStream - байтовый поток, который использует
память для хранения данных.
49

50. Байтовый поток

Конструктор, который открывает поток для чтения
и/или записи:
FileStream(string filename, FileMode mode)
Версия конструктора позволяет ограничить доступ
только чтением или только записью:
FileStream(string filename, FileMode mode,
FileAccess how)
50

51. Байтовый поток. Пример

FileStream fileIn = new FileStream("text.txt",
FileMode.Open,
FileAccess.Read);
FileStream fileOut = new FileStream("newText.txt",
FileMode.Create,
FileAccess.Write);
int i;
while ((i = fileIn.ReadByte())!=-1)
{
fileOut.WriteByte((byte)i);
}
fileIn.Close();
fileOut.Close();
51

52. Символьный поток

StreamReader – содержит свойства и методы,
обеспечивающие считывание символов из
байтового потока
StreamReader fileIn = new StreamReader(new FileStream("text.txt"
FileMode.Open, FileAccess.Read));
StreamWriter – содержит свойства и методы,
обеспечивающие запись символов в байтовый
поток
StreamWriter fileOut=new StreamWriter(new FileStream("text.txt",
FileMode.Create, FileAccess.Write));
StreamWriter(string name, bool appendFlag);
52

53. Символьный поток. Пример

StreamReader fileIn = new StreamReader("text.txt",
Encoding.GetEncoding(1251));
StreamWriter fileOut=new StreamWriter("newText.txt", false);
string line;
while ((line=fileIn.ReadLine())!=null) //пока поток не пуст
{
fileOut.WriteLine(line);
}
fileIn.Close();
fileOut.Close();
53

54. Двоичный поток

Формирование двоичного файла:
static
void Main()
{
//открываем двоичный поток
BinaryWriter fOut=
new BinaryWriter(new FileStream("t.dat",
FileMode.Create));
//записываем данные в двоичный поток
for (int i=0; i<=100; i+=2)
{
fOut.Write(i);
}
fOut.Close(); //закрываем двоичный поток
}
54

55. Двоичный поток

Просмотр двоичного файла:
static void Main()
{
FileStream f=new FileStream("t.dat",FileMode.Open);
BinaryReader fIn=new BinaryReader(f);
long n=f.Length/4;
//определяем количество чисел в двоичном потоке
int a;
for (int i=0; i<n; i++)
{
a=fIn.ReadInt32();
Console.Write(a+" ");
}
fIn.Close();
f.Close();
}
55
English     Русский Rules