Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodicheskoe_posobie_VGKS_po_S.docx
Скачиваний:
49
Добавлен:
13.02.2016
Размер:
433.75 Кб
Скачать

Лабораторная работа 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);

Недосататок: а) из-за повторных вызовов тратиться время; б) засоряется стэк.

Обобщённые подпрограммы.

Используются для обращения к ней с любим типом аргумента. Это позволяет не делать перегруженных методов!

  1. Объявление подпрограммы

static void sort<T>(ref T[] a)

where T:Icomparable<T>

{int n=a.Length;

a[1]=5;

a[2]=4*a[1];

и т. п.

}

  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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]