Файл: Практикум по информатике рекомендовано в качестве учебного пособия.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 729
Скачиваний: 14
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
85
// Записываем изображение в pictureBox1
pictureBox1.Image = bmp;
// Подготавливаем объект Graphics для рисования g =
Graphics
.FromImage(pictureBox1.Image);
}
}
// Действия при нажатии мышки в pictureBox1
private void pictureBox1_MouseDown(
object sender,
MouseEventArgs e)
{
// Записываем в предыдущую точку текущие координаты
PreviousPoint.X = e.X;
PreviousPoint.Y = e.Y;
}
// Действия при перемещении мышки private void pictureBox1_MouseMove(
object sender,
MouseEventArgs e)
{
// Проверяем нажата ли левая кнопка мыши if
(e.Button ==
MouseButtons
.Left)
{
// Запоминаем текущее положение курсора мыши point.X = e.X; point.Y = e.Y;
// Соеденяем линией предыдущую точку с текущей g.DrawLine(blackPen, PreviousPoint, point);
// Текущее положение курсора ‐ в PreviousPoint
PreviousPoint.X = point.X;
PreviousPoint.Y = point.Y;
// Принудительно вызываем перерисовку pictureBox1.Invalidate();
}
}
// Действия при нажатии кнопки сохранения файла private void button2_Click(
object sender,
EventArgs e)
{
// Описываем и порождаем объект savedialog
SaveFileDialog savedialog = new
SaveFileDialog
();
// Задаем свойства для savedialog savedialog.Title =
"Сохранить картинку как ..."
; savedialog.OverwritePrompt = true
; savedialog.CheckPathExists = true
; savedialog.Filter =
"Bitmap File(*.bmp)|*.bmp|"
+
"GIF File(*.gif)|*.gif|"
+
86
"JPEG File(*.jpg)|*.jpg|"
+
"PNG File(*.png)|*.png"
;
// Показываем диалог и проверяем задано ли имя файла if
(savedialog.ShowDialog() ==
DialogResult
.OK)
{ string fileName = savedialog.FileName;
// Убираем из имени расширение файла string strFilExtn = fileName.Remove(0, fileName.Length ‐ 3);
// Сохраняем файл в нужном формате switch
(strFilExtn)
{ case
"bmp"
: bmp.Save(fileName,
System.Drawing.Imaging.
ImageFormat
.Bmp); break
; case
"jpg"
: bmp.Save(fileName,
System.Drawing.Imaging.
ImageFormat
.Jpeg); break
; case
"gif"
: bmp.Save(fileName,
System.Drawing.Imaging.
ImageFormat
.Gif); break
; case
"tif"
: bmp.Save(fileName,
System.Drawing.Imaging.
ImageFormat
.Tiff); break
; case
"png"
: bmp.Save(fileName,
System.Drawing.Imaging.
ImageFormat
.Png); break
; default
: break
;
}
}
}
Далее добавим в проект кнопку для перевода изображения в града- ции серого цвета:
// Действия при нажатии кнопки перевода в градации серого private void button3_Click(
object sender,
EventArgs e)
{
// Циклы для перебора всех пикселей на изображении for
(
int i = 0; i < bmp.Width; i++) for
(
int j = 0; j < bmp.Height; j++)
87
{
// Извлекаем в R значение красного цвета int
R = bmp.GetPixel(i, j).R;
// Извлекаем в G значение зеленого цвета int
G = bmp.GetPixel(i, j).G;
// Извлекаем в B значение синего цвета int
B = bmp.GetPixel(i, j).B;
// Высчитываем среднее арифметическое int
Gray = (R + G + B) / 3;
// Переводим число в значение цвета.
// 255 – показывает степень прозрачности.
// Остальные значения одинаковы
Color p =
Color
.FromArgb(255, Gray, Gray,
Gray);
// Записываем цвет в текущую точку bmp.SetPixel(i, j, p);
}
// Вызываем функцию перерисовки окна
Refresh();
}
Данный код демонстрирует возможность обращения к отдельным пик- селям. Цвет каждого пикселя хранится в модели RGB и состоит из трех со- ставляющих: красного, зеленого и синего цвета, называемых каналами.
Значение каждого канала может варьироваться в диапазоне от 0 до 255.
1 ... 4 5 6 7 8 9 10 11 12
Индивидуальное задание
Добавьте в приведенный графический редактор свои функции в со- ответствии с вариантом.
1.
Расширьте приложение путем добавления возможности выбора пользователем цвета и величины кисти.
2.
Разработайте функцию, добавляющую на изображение 1000 то- чек с координатами, заданными случайным образом. Цвет также задает- ся случайным образом.
3.
Создайте функцию, переводящую изображение в черно-белый формат. Пороговое значение задавать с помощью элемента управления
TrackBar.
4.
Разработайте функцию, оставляющую на изображении только один из каналов (R, G, B). Канал выбирается пользователем.
5.
Создайте функцию, выводящую на изображение окружность.
Центр окружности совпадает с центром изображения. Все точки вне окружности переводятся в градации серого цвета. Все точки внут- ри окружности остаются неизменными. Радиус окружности задается пользователем.
88 6.
Создайте функцию, выводящую на изображение треугольник.
Для всех точек вне треугольника оставьте только канал B. Все точки внутри треугольника переводятся в градации серого цвета.
7.
Создайте функцию, выводящую на изображение ромб. Все точ- ки вне ромба переводятся в градации серого цвета. Для всех точек внут- ри ромба оставьте только канал G.
8.
Разработайте функцию, которая каждую четную строку изо- бражения переводит в градации серого цвета.
9.
Разработайте функцию, которая переводит каждый нечетный столбец пикселей (вертикальные линии) в градации серого цвета.
10.
Создайте функцию, разбивающую изображение на четыре рав- ные части. В каждой оставьте значение только одного канала R, G и B, а в четвертой выведите градации серого цвета.
11.
Разработайте функцию, заменяющую все точки синего цвета на точки красного цвета.
12.
Создайте функцию, инвертирующую изображение в градациях серого цвета в негатив.
13.
Создайте функцию, изменяющую яркость изображения, путем прибавления или уменьшения заданной пользователем величины к каж- дому каналу.
14.
Создайте функцию, переводящую изображение в черно-белый формат в соответствии с пороговым значением, которое ввел пользова- тель. Для анализа используйте только один из каналов (R, G, B).
15.
Разработайте функцию для создания эффекта мозаики. При этом изображения разбиваются на прямоугольные фрагменты, в каждом из которых выбирается цвет средней точки, и этим же цветом закраши- вается весь фрагмент.
16.
Разработайте функцию, разбивающую изображение на фраг- менты, в каждом из которых остается только один из каналов (R, G, B).
17.
Разработайте функцию, изменяющую значение канала R на всем изображении.
18.
Разработайте функцию, обнуляющую значение выбранного пользователем канала на всем изображении.
19.
Создайте функцию, переводящую прямоугольную область на изображении в градации серого цвета. Разработайте интерфейс, через который пользователь может задавать координаты этой области.
20.
Разработайте и реализуйте собственный алгоритм, переводя- щий изображение в градациях серого цвета в цвет.
89
ЛАБОРАТОРНАЯ РАБОТА № 13.
МЕТОДЫ
Цель лабораторной работы:
научиться работать с методами, на- писать программу с использованием методов.
13.1. Общие понятия
Метод – это элемент класса, который содержит программный код.
Метод имеет следующую структуру:
[
атрибуты
] [
спецификторы
] тип имя ([параметры])
{
Тело метода;
}
Атрибуты – это особые указания компилятору на свойства метода.
Атрибуты используются редко.
Спецификаторы – это ключевые слова, предназначенные для раз- ных целей, например:
определяющие доступность метода для других классов:
private
– метод будет доступен только внутри этого класса;
protected
– метод будет доступен также дочерним классам;
public
– метод будет доступен любому другому классу, кото- рый может получить доступ к данному классу;
указывающие доступность метода без создания класса;
задающие тип.
Тип определяет результат, который возвращает метод: это может быть любой тип, доступный в C#, а также ключевое слово void
, если ре- зультат не требуется.
Имя метода – это идентификатор, который будет использоваться для вызова метода. К идентификатору применяются те же требования, что и к именам переменных: он может состоять из букв, цифр и знака подчеркивания, но не может начинаться с цифры.
Параметры – это список переменных, которые можно передавать в метод при вызове. Каждый параметр состоит из типа и названия пере- менной. Параметры разделяются запятой.
Тело метода – это обычный программный код, за исключением то- го, что он не может содержать определения других методов, классов, пространств имен и т. д. Если метод должен возвращать какой-то ре-
90 зультат, то обязательно в конце должно присутствовать ключевое слово return с возвращаемым значением. Если возвращение результатов не нужно, то использование ключевого слова return не обязательно, хотя и допускается.
Пример метода, вычисляющего выражение: public double
Calc(
double a, double b, double c)
{ if
(a > b) return
Math
.Sin(a) *
Math
.Cos(b); else
{ double k =
Math
.Tan(a * b); return k *
Math
.Exp(c / k);
}
}
13.2. Перегрузка методов
Язык C# позволяет создавать несколько методов с одинаковыми име- нами, но разными параметрами. Компилятор автоматически подберет наиболее подходящий метод при построении программы. Например, мож- но написать два отдельных метода возведения числа в степень: для целых чисел будет применяться один алгоритм, а для вещественных – другой:
///
///
Вычисление X в степени Y для целых чисел
///
private int
Pow(
int
X, int
Y)
{ int b = 1; while
(Y != 0) if
(Y % 2 == 0)
{
Y /= 2;
X *= X;
} else
{
Y‐‐; b *= X;
} return b;
}
91
///
///
Вычисление X в степени Y для вещественных чисел
///
private double
Pow(
double
X, double
Y)
{ if
(X != 0) return
Math
.Exp(Y *
Math
.Log(
Math
.Abs(X))); else if
(Y == 0) return
1; else return
0;
}
Вызывается такой код одинаково, разница лишь в параметрах – в первом случае компилятор вызовет метод
Pow с целочисленными па- раметрами, а во втором – с вещественными:
Pow(3, 17);
Pow(3.0, 17.0);
13.3. Параметры по умолчанию
Язык C# начиная с версии 4.0 (Visual Studio 2010), позволяет зада- вать некоторым параметрам значения по умолчанию – так, чтобы при вызове метода можно было опускать часть параметров. Для этого при реализации метода нужным параметрам следует присвоить значение прямо в списке параметров: private void
GetData(
int
Number, int
Optional = 5)
{
MessageBox
.Show
(
"Number: {0}"
, Number);
MessageBox
.Show
(
"Optional: {0}"
, Optional);
}
В этом случае вызывать метод можно следующим образом:
GetData(10, 20);
GetData(10);
В первом случае параметр
Optional будет равен 20, так как он явно задан, а во втором будет равен 5, т. к. явно он не задан и компилятор бе- рет значение по умолчанию.
Параметры по умолчанию можно ставить только в правой части списка параметров, например, такая сигнатура метода компилятором принята не будет: private void
GetData(
int
Optional = 5, int
Number)
92
13.4. Передача параметров по значению и по ссылке
Когда параметры передаются в метод обычным образом (без до- полнительных ключевых слов ref и out
), любые изменения параметров внутри метода не влияют на его значение в основной программе. Пред- положим, у нас есть следующий метод: private void
Calc(
int
Number)
{
Number = 10;
}
Видно, что внутри метода происходит изменение переменной
Number, которая была передана как параметр. Попробуем вызвать метод: int n = 1;
Calc(n);
MessageBox
.Show(n.ToString());
На экране появится число 1, то есть, несмотря на изменение пере- менной в методе
Calc
, значение переменной в главной программе не изменилось. Это связано с тем, что при вызове метода создается копия переданной переменной, именно ее изменяет метод. При завершении метода значение копий теряется. Такой способ передачи параметра на- зывается передачей по значению.
Чтобы метод мог изменять переданную ему переменную, ее следу- ет передавать с ключевым словом ref
– оно должно быть как в сигнату- ре метода, так и при вызове: private void
Calc(
ref int
Number)
{
Number = 10;
} int n = 1;
Calc(
ref n);
MessageBox
.Show(n.ToString());
В этом случае на экране появится число 10: изменение значения в методе сказалось и на главной программе. Такая передача метода на- зывается передачей по ссылке, т. е. передается уже не копия, а ссылка на реальную переменную в памяти.
Если метод использует переменные по ссылке только для возврата значений и не имеет значения, что в них было изначально, то можно не
93 инициализировать такие переменные, а передавать их с ключевым сло- вом out
. Компилятор понимает, что начальное значение переменной не важно, и не ругается на отсутствие инициализации: private void
Calc(
out int
Number)
{
Number = 10;
} int n;
// Ничего не присваиваем!
Calc(
out n);
Индивидуальное задание
1.
Написать метод min(x, y), находящий минимальное значение из двух чисел. С его помощью найти минимальное значение из четырех чисел a, b, c, d.
2.
Написать метод max(x, y), находящий максимальное значение из двух чисел. С его помощью найти максимальное значение из четырех чисел a, b, c, d.
3.
Написать метод, вычисляющий значение n/x
n
. С его помощью вычислить выражение:
10 1
i
i
i
x
4.
Написать метод, вычисляющий значение n/x
n
. С его помощью вычислить выражение:
10 1
i
i
i
x
5.
Написать метод, вычисляющий значение
x
n
/(
n
+
x
). С его помо- щью вычислить выражение:
10 1
i
i
x
x i
6.
Написать метод, вычисляющий значение sin(x) + cos(2 * x).
С его помощью определить, в какой из точек a, b или с значение будет минимальным.
7.
Написать метод, вычисляющий значение x
2
+ y
2
. С его помо- щью определить, с какой парой чисел (a, b) или (с, d) значение будет максимальным.
8.
Написать метод, вычисляющий значение x
2
* y
3
*
√
. С его по- мощью определить, с какой тройкой чисел (a, b, c) или (d, e, f) значение будет максимальным.
94 9.
Написать метод, который у четных чисел меняет знак, а нечет- ные числа оставляет без изменения. С его помощью обработать ряд чи- сел от 1 до 10.
10.
Написать метод, который положительные числа возводит в квадрат, а отрицательные – в куб. С его помощью обработать ряд чи- сел от –10 до 10.
11.
Написать метод, который вычисляет значения x
=
sin
2
(a) и y
=
cos
2
(a). Напечатать таблицу значений от –π до π с шагом π/4.
12.
Написать метод, который вычисляет значения x
=
a
2
и y
=
√
Напечатать таблицу значений от –10 до 10 с шагом 1.
13.
Написать метод, который в переданной строке заменяет все точки на многоточие. С его помощью обработать пять разных строк и отобразить их на экране.
14.
Написать метод, который в переданной строке заменяет все строчные буквы на заглавные, и наоборот. С его помощью обработать пять разных строк и отобразить их на экране.
15.
Написать метод, который разделяет переданную строку на две отдельных строки: первая содержит исходную строку до первой точки, а вторая – исходную строку после первой точки. С его помощью обра- ботать пять разных строк и отобразить результаты на экране.
16.
Написать метод, который подсчитывает количество знаков препинания в переданной строке. С его помощью обработать пять раз- ных строк и отобразить результаты на экране.
17.
Написать метод, который находит сумму чисел в переданной строке. Числом считается непрерывная последовательность цифр, отде- ленная от остального текста пробелами или расположенная в начале ли- бо конце строки. Допустимо использовать метод
Split класса
String
С помощью этого метода обработать пять разных строк и отобразить ре- зультаты на экране.
18.
Написать метод, определяющий, является ли переданная строка палиндромом, то есть текстом, который слева направо и справа налево читается одинаково без учета пробелов и регистра символов. С помо- щью этого метода обработать пять разных строк и отобразить результа- ты на экране.
19.
Написать метод, находящий сумму матриц одинакового разме- ра и возвращающий новую матрицу. С помощью этого метода обрабо- тать пары матриц и отобразить результаты на экране.
20.
Написать метод, находящий сумму элементов, находящихся не на главной диагонали переданной матрицы. С помощью этого метода обработать пары матриц и отобразить результаты на экране.