- •В.А. Новиков Объектно-ориентированное программирование в с#
- •Минск ● вгкс
- •Лабораторная работа 1 Константы, переменные, выражения. Визуальные элементы: кнопка и текстовое поле
- •Лабораторная работа 2 Операторы управления. Визуальные элементы: маскированное поле и установка цвета
- •Лабораторная работа 3 Ввод – вывод на консоль. Визуализация через файлы. Независимый переключатель и шрифты
- •Лабораторная работа 4 Строки. Модальные формы пользователя
- •Лабораторная работа 5 Массивы. Зависимый переключатель
- •Лабораторная 6 Перечисление. Немодальные формы пользователя
- •Лабораторная 7 Регулярные выражения. Таймер
- •Лабораторная работа 8 Прототипы-данные. Визуальный элемент выпадающий список
- •Лабораторная работа 9 Подпрограммы. Визуальный элемент список. Отработка событий клавиатуры
- •Лабораторная работа 10 Обработка исключительных ситуаций. Визуальный элемент закладка tabControl
- •Лабораторная работа 11 Переопределение операций. Закладка TabStrip
- •Лабораторная работа 12 Работа с файлами. Всплывающая подсказка
- •Лабораторная работа 13 Структуры. Перетаскивание элемента на форме
- •Лабораторная работа 14 Построение графиков через Excel. Объект Drawning
- •Содержание
Лабораторная работа 9 Подпрограммы. Визуальный элемент список. Отработка событий клавиатуры
Цель работы.
Изучить формирование программ с использованием подпрограмм. Научиться создавать формы с использованием визуального элемента список. Уметь обрабатывать события клавиатуры.
План занятия.
Изучить теоретические сведения формирования программы на С#.
По приведенному листингу программы разработать на Visual Studio программу и отладить ее. Составить программу по индивидуальному заданию.
Краткие теоретические сведения.
Подпрограммы.
Подпрограмма – это инкапсулированная последовательность кода, которая по имени может вызываться много раз. Аналогия со стандартными функциями типа sin.
Текст функции формируется по следующим правилам:
static Tип Имя (параметры)
{
Тело функции
return выражение
}
Тип – любой тип как и у переменной, дополнительно void оззначает, что определена не функция, а процедура.
Примеры:
Функция Процедура
Static int M(double X) Static void MM(double X)
{ {
return math.Round(X); Concole.Write({0},X);
} }
Пример обращения:
Y=x*M(X); MM(X);
Параметры подпрограмм.
Параметры значения.
int X
В программу передаётся значение в специальной ячейке. Это не позволяет через заголовок изменить параметр:
Пример
static int M(int x)
{ x=6;
return x*x;
}
Программа:
x=2;
y=x*M(x); // y=2*(6*6)
y1=x; // y1 будет равно 2
Параметры ссылки.
ref int x
В подпрограмму передаётся именно адрес параметра, а не копия. Это позволяет в изменять значение параметра.
Пример: 30
static int M (ref int x )
{ x=6;
return x*x;
}
Программа:
x=2;
y=x*M (ref x); // y=2*(6*6)
y1=x; // y1 будет равно 6.
Выходные параметры.
out int x
Внутрь подпрограммы ничего не передается т. е. nul,
а на выходе как ref.
Пример:
static int M (out int x )
{ x=6;
return x*x;
}
Программа
x=2;
y=x*M (out x); // 2*(6*6)
y1=x; // y1=6
Параметры массивы.
Дла переметров-массивов возможны все выше приведенные варианты, т. е. значение, ссылка, выходной.
int[ ] x
Пример
static int M (int[ ] x);
{ n=x.Length
S=0;
for (i=0; i<n; i++) S+=x[ i ];
return S;
}
Программа:
int[ ] x={1, 3, 5};
y=M (x); // y=1+3+5=9.
Переменное число параметров.
Этот параметр всегда указывается в конце списка. Может совмещаться со значением, ссылкой и выходным.
params int[ ] x
Пример:
static int M(int a, params int[ ] x)
{ n=x. Length;
S=a;
for (i=0; i<n; i++) S+=x [i];
return S;
}
Программа
b=4;
int [ ] z={1, 3, 5};
y=M (b, z); // y=4+1+3+5
Другой пример, что отличает params от параметра массива:
b=4; a1=2; a2=3; a3=4;
y=M(b, a1, a2,a3); // y=4+2+3+4 из-за «a1, a2, a3» этот параметр показывается с переменными числом аргументов.
Вместо a1 … можно использовать и одномерные массивы и это количество войдет в длину параметра.
Перегрузка подпрограмм.
С# различает список параметров для подпрограмм с одним и тем же именем, поэтому можно для одной и той же полпрограммы делать разные варианты в зависимости от списка параметров (имеется в виду их число и тип). Это называется перегрузкой подпрограмм.
Пример: подпрограммы для нахождения максимума из а и b разного типа
static int Max( int a, int b)
{ int Z;
if(a>b) Z=a; else Z=b;
return Z;
}
static double Max(double a, double b)
{double Z;
if(a>b) Z=a; else Z=b;
return Z;
}
Здесь перегрузка отличается типами возвращаемого аргумента и типами параметров.
Рекурсия.
Подпрограммы-функции можно в теле самой функции вызывать рекурсивно, т. е. вызывать саму себя.
Условие: для избежания зацикливания нужно предусмотреть окончание рекурсии.
Пример: вычислить рекурсией факториал
n:=1*2*3*…n
static long fact(long n)
{
if(n<=1) return 1;
else
return n*fact(n – 1);
Недосататок: а) из-за повторных вызовов тратиться время; б) засоряется стэк.
Обобщённые подпрограммы.
Используются для обращения к ней с любим типом аргумента. Это позволяет не делать перегруженных методов!
Объявление подпрограммы
static void sort<T>(ref T[] a)
where T:Icomparable<T>
{int n=a.Length;
a[1]=5;
a[2]=4*a[1];
и т. п.
}
В программе выполняется обращение к подпрограмме:
int[] k={4,8,9,13,20};
sort<int>(ref k);
double[] x={8.1,4.5,3.2};
sort<double>(ref x);
Порядок выполнения работы.
Создайте форму:
Воспроизведите программный код.
//FORM
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
static byte Kol = 55;
float[] PL = new float[Kol];
float[] CH = new float[Kol];
float[] LT = new float[Kol];
string[] ST = new string[Kol];
int Numb;
bool KOD;
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void Form1_Activated(object sender, EventArgs e)
{
this.listBox1.Items.Clear();
this.listBox1.Items.Add("Беларусь");
this.listBox1.Items.Add("Россия");
this.listBox1.Items.Add("Польша");
PL[0] = 207600; CH[0] = 9675000; ST[0] = "Минск";
PL[1] = 17075000; CH[1] = 139000000; ST[1] = "Москва";
PL[2] = 313000; CH[2] = 35400000; ST[2] = "Варшава";
this.listBox1.SelectedIndex=1;
Numb = 1;
int K = 1;
textBox1.Text = Convert.ToString(PL[K]);
textBox2.Text = Convert.ToString(CH[K]);
textBox3.Text = String.Format("{0,5:f2}", CH[K] / PL[K]);
textBox5.Text = ST[K];
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int K = this.listBox1.SelectedIndex;
Numb = K;
textBox1.Text = Convert.ToString(PL[K]);
textBox2.Text = Convert.ToString(CH[K]);
textBox3.Text = String.Format("{0,5:f2}",CH[K]/PL[K]);
textBox5.Text = ST[K];
}
private void textBox3_MouseLeave(object sender, EventArgs e)
{
textBox3.Text = String.Format("{0,5:f2}", CH[Numb] / PL[Numb]);
}
private void textBox2_MouseLeave(object sender, EventArgs e)
{
CH[Numb] = Convert.ToSingle(textBox2.Text);
textBox3.Text = String.Format("{0,5:f2}", CH[Numb] / PL[Numb]);
}
private void textBox1_MouseLeave(object sender, EventArgs e)
{
PL[Numb] = Convert.ToSingle(textBox1.Text);
textBox3.Text = String.Format("{0,5:f2}", CH[Numb] / PL[Numb]);
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
PL[Numb] = Convert.ToSingle(textBox1.Text);
textBox3.Text = String.Format("{0,5:f2}", CH[Numb] / PL[Numb]);
}
}
private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
CH[Numb] = Convert.ToSingle(textBox2.Text);
textBox3.Text = String.Format("{0,5:f2}", CH[Numb] / PL[Numb]);
}
}
private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar <= 'я' & e.KeyChar >= 'а' |e.KeyChar <= 'Я' & e.KeyChar >= 'А' |
e.KeyChar == Convert.ToChar(Keys.Back) | e.KeyChar==Convert.ToChar(Keys.Delete) |
e.KeyChar == Convert.ToChar(Keys.Right) | e.KeyChar==Convert.ToChar(Keys.Left)))
e.Handled=true;
}
private void listBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.Alt && e.KeyCode == Keys.Z) { MessageBox.Show("Нажата Alt+Z"); e.Handled = true; }
}
} }
Индивидуальное задание.
Составьте подпрограммы-функции для вычисления выражений и лабораторной работы 2.
Содержание отчета.
Представить отлаженную программу по индивидуальному заданию.
Литература.
Павловская Т.А. С#, Программирование на языке высокого уровня. – М., СПб: Питер, 2010, с.106-114