Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Desktop_1 / ЛК / Лекция 15Мass

.doc
Скачиваний:
51
Добавлен:
10.06.2015
Размер:
389.12 Кб
Скачать

Лекция 15

22.0. Массивы в Windows Forms Application

Массивы – это структура данных, представляющая собой набор переменных одинакового типа, имеющих общее имя.

Каждый элемент массива однозначно определяется именем и индексом (номером элемента в массиве). Индексы массива принадлежат целочисленному типу.

Все элементы массива имеют одинаковый тип.

Используются при работе с таблицами и списками.

Массив может быть:

- одномерным,

- двумерным /многомерным.

Массивы различают:

  • статические и

  • динамические.

В статическом массиве размеры массива (верхний индекс элементов) задаются при объявлении массива (размеры известны до компиляции программы).

Формат объявления одномерного массива в C#:

тип[ ] ИмяМассива = new тип [размер];

Формат объявления двумерного массива в C#:

тип [ , ] ИмяМассива = new тип [количество строк, количество столбцов];

Если массив объявлен с инициализацией глобально в программе, то начальные значения элементов массива будут использоваться во всех процедурах и обработчиках событий. Пример объявления массива:

// using – раздел объявления модулей;

using System.Windows.Forms;

namespace WindowsFormsApplication1 //пространство имен приложения

{

public partial class Form1 : Form // объявление класса

{

public Form1() // объявление формы1

{

InitializeComponent(); // объявление компонент на форме

}

// глобальное объявление массивов

int[] А = new int[5]; // одномерный массив А из 5 целых чисел

double[,] M = new double[2, 3]; // двумерный массив M[2х3]

string[ ] Team = {"Zenith", "Dynamo", "Sparta", "Rotor", "CSK"}; //строковый

double[] F = { 1.5, 2.1, 3.65, 4.7, 5.14, 6.36 }; // F[6] из 6 вещественных чисел

int[,] D = { { 0, 2, 4, 6 }, { 2, 9, 6, 3 }, { 4, 7, 5, 8 }, { 1, 6, 5, 7 } }; // массив M [4х4]

}

}

// обработчики событий

Элементы массива, объявленного глобально можно инициализировать в процедуре обработчика события, во время работы программы, например, для массива A из 5 эл.:

private void button1_Click(object sender, EventArgs e)

{

// инициализация элементов массива A, объявленного глобально

A[1] = 5; A[2] = 6; A[3] = 0; A[4] = -5; A[5] = -10;

}

Локальный массив объявляется в процедуре обработчика события, и тогда его как правило инициализируют во время исполнения этого события. Значения элементов, как и сам массив известен только в этой процедуре. При необходимости работы с массивом его надо заново объявлять в другом обработчике события и производить его инициализацию. Например:

private void button2_Click(object sender, EventArgs e)

{

int[] B = new int[10]; // массив B объявлен локально

for (int k = 0; k <= 4; k++) // с инициализацией элементов

B[k] = k;

}

При обращении к элементам массива заданного локально в другом обработчике событий, будет выдано сообщение об ошибке:

В динамическом массиве при объявлении указывается имя массива, тип его элементов, а размер массива определяется при выполнении программы и задается некой переменной. Значение переменной можно ввести в процессе диалога программы с пользователем или используя свойство length, содержащее количество элементов, которое может хранить массив. Например:

private void button1_Click(object sender, EventArgs e)

{

int size = int.Parse(textBox1.Text); //Задание верхней границы массива

int [] H = new int[size];

………

}

22.1 Операции с массивами в Windows-приложениях

Типовые операции:

  • вывод/ввод массива;

  • поиск максимального или минимального элемента массива;

  • поиск заданного элемента массива;

  • сортировка массива.

Ввод-Вывод массивов в Windows-приложениях

Поскольку эти приложения позволяют создать дружелюбный интерфейс пользователя, то это облегчает работу по вводу и выводу массивов.

Пример. Форма разделена условно на две части – для ввода и вывода массива.

Пользователь в текстовое окно число элементов массива и нажимает командную кнопку «Создать массив», обработчик которой создает массив заданной размерности, если корректно задан размер, в противном случае выдается сообщение об ошибки.

Затем пользователь переходит к вводу элементов массива. Элемент вводится в текстовое окно, а командная кнопка «Ввести элемент» обеспечивает передачу значения в массив. Корректность ввода контролируется и на этом этапе.

Для облегчения ввода пользователю выводится подсказка, какой именно элемент надо ввести. После ввода элементов массива окно ввода становится недоступным для ввода элементов.

В нижней части отображается введенный массив в форме, удобной для восприятия пользователя. Для этого пригодны элементы: ListBox, CheckedListBox, ComboBox. Как только вводится очередной элемент, он немедленно отображается во всех объектах.

ComboBox11

label1

label2

label3

label4

label5

label6

label7

listBox1- список

checkedListBox1

comboBox1- комбинированный список

textBox1

button1

textBox2

button2

panel1

panel2

Три объекта вывода элементов массива приведены для демонстрации, реально их всех отображать не нужно. Компонент выбирается по желанию пользователя.

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

{

public Form1()

{

InitializeComponent();

}

double [] mas;

int i=0;

private void button1_Click(object sender, EventArgs e)

{

try //охраняемый блок

{

int n = int.Parse(textBox1.Text);

mas = new double[n];

label4.Text = "mas[ " + 0 + " ]";

textBox2.ReadOnly = false;

listBox1.Items.Clear();

checkedListBox1.Items.Clear();

comboBox1.Items.Clear();

i = 0;

}

catch //перехватчик исключения и формирование ошибки

{

MessageBox.Show("Надо вводить цифры ", "Ошибочный ввод данных", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void button2_Click(object sender, EventArgs e)

{

int n = int.Parse(textBox1.Text);

mas = new double[n]; // задание размера массива

mas[i] = double.Parse(textBox2.Text);

label4.Text = "mas[ " + i + " ]";

listBox1.Items.Add(mas[i]);

checkedListBox1.Items.Add(mas[i]);

comboBox1.Items.Add(mas[i]);

i++;

textBox2.Text = " ";

label6.Text = "ОК";

if (i == n)

{

label3.Text = " ";

label4.Text = " ";

label6.Text = "Ввод не доступен ";

textBox2.Text = " ";

textBox2.ReadOnly = true;

}

}

}

}

Последовательность чисел удобно вводить в строку таблицы с помощью компонента DataGridView (данные строкового вида).

DataGridView – это таблица, ячейки которой содержат строки символов.

Столбец

Таблица

Строка

Ячейка

Свойства DataGridView определяют:

Columns колонки таблицы

Rows строки таблицы

Cells ячейки

ColumnCount количество столбцов таблицы

RowCount количество строк таблицы

Rows[n].Cells[k] ячейка, лежащая на пересечении n - го ряда row и k-ой столбца

Задача1, 2. Ввести элементы одномерного массива и вычислить:

Задача1: суммарное, среднеарифметическое,

Задача2: максимальное и минимальное значения элементов этого массива.

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

{

public Form1()

{

InitializeComponent(); // объявление компонентов на Form1

}

double[] K = new double[5]; // объявление массива

private void button1_Click(object sender, EventArgs e) // Задача1

{

double avr = 0; //среднее значение

double summ = 0; //сумма элементов

int n = 0; // количество введенных элементов

try //охраняемый блок

{

for (int i = 0; i < 5; i++) //преобразование данных, вводимых в 1 строку

{ // с клавиатуры в цифровой эквивалент

K[i] = System.Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);

summ = summ + K[i];

n= n + 1;

}

avr = summ / n;

label1.Text = "Сумма элементов: " + String.Format("{0,6:f}", summ);

label2.Text = "Среднее арифмет. значение: " + String.Format("{0,6:f3}", avr);

}

catch //перехватчик исключения и формирование ошибки

{

MessageBox.Show("Надо вводить цифры ", "Ошибочный ввод данных", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void button2_Click(object sender, EventArgs e) // Задача2

{

double Kmax = 0;

double Kmin = 0;

int Nmx = 0;

int Nmn = 0;

try //охраняемый блок

{

for (int i = 0; i < 5; i++) //преобразование данных, вводимых в первую строку

{ //с клавиатуры в цифровой эквивалент

K[i] = System.Convert.ToDouble(dataGridView1.Rows[0].Cells[i].Value);

}

Kmax = K[0]; // предположение

Nmx = 0;

for (int i = 1; i < 5; i++)

{

if (K[i] > Kmax)

{

Kmax = K[i]; // выявление max

Nmx = i;

}

}

Kmin = K[0]; // предположение

Nmn = 0;

for (int i =1; i < 5; i++)

{

if (K[i] < Kmin)

{

Kmin = K[i]; // выявление min

Nmn = i;

}

}

label3.Text = "Максимальное значение: " + String.Format("{0,6:f1}", Kmax) + ", его номер: " + Nmx.ToString();

label4.Text = "Минимальное значение: " + String.Format("{0,6:f1}", Kmin) + ", его номер: " + Nmn.ToString();

}

catch //перехватчик исключения и формирование ошибки

{

MessageBox.Show("Надо вводить цифры ", "Ошибочный ввод данных", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

}

}

0 1 2 3 4

Двумерную таблицу можно представить как совокупность одномерных массивов.

Задача 3. Обработать результаты спортивных соревнований олимпиады.

Программа должна вычислять общее количество медалей каждой страны и соответствующее количество баллов, по правилу:

- за золотую медаль – 7 баллов,

- за серебряную медаль – 6 баллов,

- за бронзовую медаль – 5 баллов,

Устанавливаем на форму объекты dataGridView1 и button1. Используя свойство Colomns, создаем коллекцию столбцов с полями: Страна, Золотых, Серебряных, Бронзовых, Всего, Баллов

dataGridView

Изменив свойство Name, переименуем dataGridView в Tabl.

Количество строк в компоненте по умолчанию dataGridView = 1 и для увеличения их численности необходимо при инициализации элементов добавить нужное их число через метод dataGridView.Rows.Add();

public Form1()

{

InitializeComponent();

Tabl.Rows.Add(8); //добавление строк в таблицу

}

Заполнение ячеек организовано через процедуру обработки события Activate, которое происходит при активизации формы.

Запуск приложения

При нажатии на кнопку «Итоги» происходит расчет показателей:

using System;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

Tabl.Rows.Add(8); //добавление строк в таблицу

}

private void Form1_Activated(object sender, EventArgs e) //при активизации формы

{

string[] Ctrana = new string[8] { "Австрия", "Великобритания", "Германия", "Италия",

"Россия", "США", "Франция", "Япония" };

int[] Zoloto = new int[8] { 16, 11, 14, 13, 32, 39, 13, 5 };

int[] Serebro = new int[8] { 25, 10, 17, 8, 28, 25, 14, 8 };

int[] Bronza = new int[8] { 17, 7, 28, 13, 28, 33, 11, 5 };

for (int i = 0; i < 8; i++)

{

Tabl.Rows[i].Cells[0].Value = Ctrana[i]; // заполнение элементами 0 столбца

Tabl.Rows[i].Cells[1].Value = Zoloto[i]; // заполнение элементами 1 столбца

Tabl.Rows[i].Cells[2].Value = Serebro[i]; // заполнение элементами 2 столбца

Tabl.Rows[i].Cells[3].Value = Bronza[i]; // заполнение элементами 3 столбца

}

}

private void button1_Click(object sender, EventArgs e) //кнопка Итоги

{

int c,r; //номер колонки и строки Tabl

int s=0; //всего медалей у команды

int b=0; //всего баллов у команды

for (r = 0; r < 8; r++) //цикл по строкам

{

//вычисление общего количества медалей

for (c = 1; c <= 3; c++)

s = s + System.Convert.ToInt16(Tabl.Rows[r].Cells[c].Value);

//вычисление общего количества баллов

b = 7 * System.Convert.ToInt16(Tabl.Rows[r].Cells[1].Value) +

6 * System.Convert.ToInt16(Tabl.Rows[r].Cells[2].Value) +

5 * System.Convert.ToInt16(Tabl.Rows[r].Cells[3].Value);

Tabl.Rows[r].Cells[4].Value = s.ToString(); // всего медалей для каждой страны

Tabl.Rows[r].Cells[5].Value = b.ToString(); // всего баллов для каждой страны

}

}

}

}

Соседние файлы в папке ЛК