Файл: Разработать справочную систему по стандартным функциям выбранного языка программирования.pdf
Добавлен: 06.04.2023
Просмотров: 252
Скачиваний: 2
List<int> a = new List<int>();
List – один из классов для работы с динамическими массивами. Он позволяет обращаться к любому из элементов массива, добавлять новые элементы в конец массива, и удалять любые элементы по значению или по индексу.
По умолчанию, в массиве содержится 0 элементов. Поэтому прежде чем к нему обращаться, в него необходимо занести данные. Делается это командой Add:
a.Add(10);
a.Add(1);
Теперь массив содержит 2 элемента: 10 и 1. Для изменения значения воспользуемся индексом элемента.
a[0] = 99;
Теперь вместо 10 в первой ячейке массива будет хранится число 99. Для удаления элементов из массива существуют 3 функции:
a.Remove(99);
Данная функция удалит все элементы массива, которые равны 99. Остальные будут сдвинуты, закрывая образовавшиеся пропуски.
a.RemoveAt(0);
Данная функция удалит единственный элемент с первой позиции. Остальные будут сдвинуты на 1 индекс, закрывая образовавшийся пропуск.
a.RemoveAll(i => (i > 10));
Удаление по предикату. Удаляет из массива все элементы, которые удовлетворяют условию (больше 10).
Существуют функции для организации хранения данных. Наиболее удобная – функция Sort. Она выполнят сортировку элементов массива по возрастанию. В качестве алгоритма сортировки автоматически выбирается тот, который позволит за минимальное время выполнить постеленную задачу.
a.Sort();
Аналогично языку SQL в C# существуют агрегатные функции, выполняющие поиск требуемого значения в массиве.
// Количество элементов
// Не функция, а параметр
int c = a.Count;
// Минимальный элемент
int min = a.Min();
// Максимальный элемент
int max = a.Max();
// Сумма элементов
int sum = a.Sum();
Преобразование массивов
Допускается переход от статических к динамическим массивам и наоборот. У каждого массива есть методы ToArray() – преобразовать к статическому массиву и ToList() – преобразовать к динамическому массиву.
Например:
List<int> a = new List<int>();
int[] b;
b = a.ToArray();
a = b.ToList();
Цикл для обхода элементов массива
Для обхода всех элементов массива применяется цикл foreach:
foreach (var i in a)
{
i++;
}
Например, увеличить все элементы массива a, на 1. На каждой новой итерации в переменную i записывается не индекс, а значение переменной!
Строковый тип данных. Представление в памяти ЭВМ
Строка в C# является особым видом массива элементов char. Каждый отдельный такой элемент является одним символом в строке, и имеет двоякое представление. С одной стороны – это символ, с другой, это числовое значение, соответствующее положению данного символа в таблице Unicode. Поэтому с переменной типа char можно вести себя как угодно:
char c = (char)99;
int a = 10;
a = a + c;
string s = "ab";
s = s + c;
После выполнения данного фрагмента кода в переменную a будет занесено значение выражения 10+99 = 109, а в переменную s, результат конкатенации строк “ab” и “c” = “abc”.
Переменная типа string ведёт себя как динамический массив. К ней можно добавить элементы, например:
string d = "Доброе ";
d = d + "утро!";
Следует отметить, что строка в C# представляется как последовательность символов Unicode, а значит в ней допускаются и управляющие конструкции. При помощи них можно добавлять различные непечатающиеся символы. Например, Enter.
d = d + "\n";
Все управляющие конструкции начинаются с символа «\», а потому его использование без экранирования не допускается. Ниже показаны примеры, как писать пути к файлам:
d = "С:\\Temp\\d.txt";
d = "С:/Temp/d.txt";
d = @"С:\Temp\d.txt";
Функции для работы со строками
Для упрощения работы со строками существует множество различных функций. Вот некоторые из них.
// d = Доброе утро!
Удалить все символы, начиная с 6-го:
d = d.Remove(6);
// d = Доброе
Заменить одну строку на другую:
d = d.Replace("утро", "время суток");
// d = Доброе время суток!
Разбить строку на массив строк, используя разделитель (пробел)
string[] m = d.Split(' ');
// m = {Доброе время, суток!}
Перевести все буквы в верхний регистр и в нижний регистр:
d = d.ToUpper();
// d = ДОБРОЕ УТРО!
d = d.ToLower();
// d = доброе утро!
Функция ToString()
У каждого экземпляра класса имеется функция ToString(). Она возвращает строковое представление текущего экземпляра класса. Считается хорошим тоном разработки переопределять её в своём коде на адекватное значение.
int i = 100;
string b = i.ToString();
В переменной b будет записано значение “100”, но уже в строковом виде.
Формат DateTime. Общие сведения
Формат служит для организации хранения определённого момента времени.
Экземпляр класса DateTime содержит следующие поля:
- Year – текущий год
- Month – текущий месяц
- Day – день в месяце
- DayOfWeek – номер дня в неделе
- DayOfYear – номер дня в году
- Hour – часы
- Minute – минуты
- Second – секунды
- Millisecond – миллисекунды
А также универсальный экземпляр – Now. Now возвращает экземпляр класса DateTime соответствующий текущему моменту времени.
Методы типа
Чтобы запомнить текущий момент времени необходимо проинициализировать переменную значением DateTime.Now
DateTime dt = DateTime.Now;
Если необходимо прибавить или отнять определённое количество дней, часов, минут и т.д. существуют методы AddDays, AddHours, AddMinutes и т.д. Например, следующий фрагмент кода вернет момент времени, произошедший 1,5 суток назад:
dt = dt.AddDays(-1.5);
// Знак – перед числом означает то, что мы вычитаем значение.
Функция ToString()
Одной из самых богатых реализаций функции ToString() является DateTime.ToString(). В зависимости от указанных параметров в скобках, будет выполнено преобразование строки в требуемый формат. Вот только некоторые из них:
DateTime dt = DateTime.Now;
string a = dt.ToString("d");
// заменяя d на соответствующую букву получим разных форматированный вывод
// d: 6/15/2008
// D: Sunday, June 15, 2008
// f: Sunday, June 15, 2008 9:15 PM
// F: Sunday, June 15, 2008 9:15:07 PM
// g: 6/15/2008 9:15 PM
// G: 6/15/2008 9:15:07 PM
// m: June 15
// o: 2008-06-15T21:15:07.0000000
// R: Sun, 15 Jun 2008 21:15:07 GMT
// s: 2008-06-15T21:15:07
// t: 9:15 PM
// T: 9:15:07 PM
// u: 2008-06-15 21:15:07Z
// U: Monday, June 16, 2008 4:15:07 AM
// y: June, 2008
//
// 'h:mm:ss.ff t': 9:15:07.00 P
// 'd MMM yyyy': 15 Jun 2008
// 'HH:mm:ss.f': 21:15:07.0
// 'dd MMM HH:mm:ss': 15 Jun 21:15:07
// '\Mon\t\h\: M': Month: 6
// 'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00
Классы в C#. Классы и экземпляры классов
C# является объектно-ориентированным языком программирования. Для удобства организации хранения и обработки данных применяется классовая модель хранения данных.
Класс – это описание характерных свойств объекта, его возможностей и действий.
Класс – это описание определённой группы однотипных объектов, для которых характерен один и тот же набор данных, и одно и то же поведение.
Экземпляр класса – это конкретный реальный объект, описываемый конкретным классом.
Например:
FileInfo – это класс, описывающий файл, его свойства. Он содержит методы и функции для его переименования, перемещения, удаления, клонирования и т.д. Класс описывает некоторую абстрактную сущность.
А вот уже файл «C:\boot.ini» - уже экземпляр класса. Он содержит все те же методы и функции класса, но уже все они применимы только к этому конкретному файлу.
Экземпляр класса объявляется также, как и переменная.
FileInfo f;
Здесь FileInfo – класс, а f – экземпляр этого класса. За объявлением следует и инициализация. Инициализируется экземпляр класса с использованием ключевого слова new.
f = new FileInfo("C:\boot.ini");
Объявление может быть совмещено с определением.
А вот теперь вопрос: равны ли экземпляры класса f1 и f2?
FileInfo f1, f2;
f1 = new FileInfo("C:/Temp/d.txt");
f2 = new FileInfo("C:/Temp/d.txt");
if (f1 == f2) {
// Равны ли эти объекты?
}
Хоть и речь идёт об одинаковых файлах, они представляют собой разные объявления, а следовательно и разные области памяти. Следовательно f1 != f2.
А теперь изменим код:
FileInfo f1, f2;
f1 = new FileInfo("C:/Temp/d.txt");
f2 = f1;
if (f1 == f2) {
// Выполнится ли этот код?
}
Здесь обе переменные представляют собой одну и ту же область памяти. Ссылка на первое объявление передалась f2 в этой строчке: f2 = f1. Данный код выполнится и f1 == f2.
Объявление классов
Во время разработки программного продукта могут потребоваться пользовательские классы. Например, для работы деканата необходимо разместить информацию о студентах факультета. Каждый студент имеет № студенческого билета, фамилию, имя, № группы, средний балл, № курса.
В этом случае структура класса Student будет выглядеть следующим образом:
public class Student {
public int Number;
public string FirstName;
public string LastName;
public string Group;
public int Course;
public float Graduate;
}
Перед описанием каждой переменной и класса стоит идентификатор public. Он указывает на то, что переменные будут доступны не только процедурам и функциям внутри класса.
Примечание: Если проводить параллель с SQL, то класс – это названия столбцов таблицы, экземпляр класса – это кортеж данных, а таблица – это динамический массив из элементов данного класса.
Для того, чтобы объявить нового студента, необходимо написать следующий код:
Student s = new Student();
s.Number = 99122;
s.Course = 1;
s.FirstName = "Пётр";
s.LastName = "Иванов";
s.Group = "ОЗБП-101";
s.Graduate = 4.5f;
Организация массивов для экземпляров классов аналогична переменным типа. Например, массив студентов:
List<Student> Base = new List<Student>();
Оптимизация работы с массивами, с использованием лямба-выражений
Невероятно эффективны лямбда-выражения для выполнения задач, согласно определённому условию.
Приведём пример для работы с экземплярами классов. Например, перед 1 сентября, необходимо увеличить всем студентам курс на 1, а студентов 4 курса из базы удалить.
// Удаляем всех студентов 4 курса
Base.RemoveAll(student => student.Course == 4);
// Увеличиваем остальным курс на 1
Base.ForEach(student => student.Course++);
Здесь представлены примеры работы функции RemoveAll, с проверкой условия, является ли студент выпускником или нет, и функции ForEach для выполнения определённого фрагмента кода для каждого элемента массива без необходимости расписывать весь цикл целиком.
При помощи параметризованной функции Sum возможно посчитать сумму по определённому параметру класса, например, найти средний балл по факультету:
float f = Base.Sum(student => student.Graduate);
f = f / Base.Count;
Здесь сначала находится сумма всех средних баллов студентов, а затем делится на количество студентов на факультете.
Процедуры и функции внутри класса
В C#, также, как и в C++ нет понятия процедуры или подпрограммы. Им на смену пришли функции, которые не возвращают значение.
Пример объявления функции следующий:
public string GetName() {
string name = FirstName + " " + LastName;
return name;
// Код здесь и ниже никогда не выполнится
}
Данная функция вернёт имя студента в формате «Имя Фамилия».
Здесь, идентификатор public означает, что функция доступна извне класса, string указывает на возвращаемый тип данных (возвращается строка), в круглых скобках указывается параметры (здесь в них нет необходимости). В фигурных скобах обязательно идёт описание функции. Возвращаемое значение формируется после ключевого слова return. По его достижению, возвращается значение и работа функции прерывается.
Работа с GUI. Создание проекта Windows Forms
Для создания нового проекта приложения небходимо воспользоваться сочетанием клавиш Ctrl+Shift+N, либо перейти в меню Файл – Создать – Проект…
Рисунок 5. Создание нового проекта
Далее будет предложено выбрать тип создаваемого проекта. Visual Studio поддерживает десятки различных языков программирования и тысячи различных шаблонов проектов. Для изучения основ программирования нам будет достаточно выбрать шаблон Windows Forms во вкладке Visual C#
Рисунок 6. Выбор типа проекта
Не забудьте указать требуемую версию .Net Framework в верхней части окна (более старые версии 3.5, 3.0, 2.0 имеют меньшие возможности, однако установлены на большем числе ЭВМ).