Лекция 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(); // всего баллов для каждой страны
}
}
}
}