Лекция
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(); // всего
баллов
для
каждой
страны
}
}
}
}
Соседние файлы в папке ЛК
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
В моём коде почему-то записывается только последний элемент массива. Например, я ввожу размер массива 3 и ввожу числа 1, 2 и 3, то при выводе я получаю 0 0 3.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _masss
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int a = 0, b, c = 0, d = 1, f = -1;
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "Введите размер массива";
}
string str = "";
private void button1_Click(object sender, EventArgs e)
{
if (a == 0)
{
b = int.Parse(textBox1.Text);
label1.Text = d.ToString() + " число";
}
int[] arr = new int[b];
if (a > 0)
{
if (f <= b)
{
label1.Text = d.ToString() + " число";
while (c == 0)
{
arr[f] = int.Parse(textBox1.Text);
c++;
}
}
}
c = 0;
a++;
f++;
d++;
if (f == b)
{
for (int i = 0; i < b; i++)
{
str += arr[i] + " ";
}
label1.Text = str;
}
textBox1.Clear();
}
}
}
Для ввода элементов использую DataGridView
. Посмотрел множество примеров использования, но когда пытаюсь сделать что-то в собственном коде, при отладке сам компонент DataGridView
представляется в виде серого прямоугольника без каких-либо столбцов и строк. В качестве источника данных этот компонент видит только главную форму программы Form1
. Что необходимо отредактировать в списке свойств и добавить в код, чтобы была возможность ввести элементы и считать их?
На примере ввода массива с дальнейшей его обработкой (arrayGrid
— объект DataGridView
):
private void button1_Click(object sender, EventArgs e)
{
arrayGrid.RowCount = 1;
arrayGrid.ColumnCount = SIZE;
arrayGrid.Rows.Add();
for (int i = 0; i < SIZE; i++)
arrayGrid.Columns.Add("column" + i.ToString(), i.ToString());
for (int i = 0; i < SIZE; i++)
arr[i] = int.Parse((string)arrayGrid.Rows[0].Cells[i].Value);
int min = arr[0];
for (int i = 1; i < SIZE; i++)
if (arr[i] < min)
min = arr[i];
label3.Text = min.ToString();
}
задан 28 сен 2017 в 18:37
Один из самых простых способов — использовать DataTable
.
dataTable = new DataTable();
// Количество столбцов
for (int i = 0; i < 3; i++)
dataTable.Columns.Add(i.ToString(), typeof(int)); // укажите нужный тип данных матрицы
// Количество строк
for (int i = 0; i < 3; i++)
dataTable.Rows.Add(dataTable.NewRow());
dataGridView.DataSource = dataTable;
// Опции по желанию
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView.AllowUserToAddRows = false;
Далее, соответственно, вместо массива работайте в коде с DataTable
.
К отдельным элементам можно обращаться следующим образом:
dataTable.Rows[0][0]
ответ дан 28 сен 2017 в 19:49
Alexander PetrovAlexander Petrov
28.4k5 золотых знаков26 серебряных знаков53 бронзовых знака
Работа с однородными структурированными типами данных. Элементы пользовательского интерфейса для работы с массивами
Цель работы: получить практические навыки работы с компонентами для отображения однородных структурированных данных.
Основной материал для выполнения работы:
- Видео-материал по созданию класса Monster
- Презентация по создания класса Monster (см. ниже в прикрепленных файлах)
- Описание создания класса «Монстр»
- Код класса Monster
- Видео-материал «Классы и объекты на примере зоопарка»
- Видео-материал «Создание класса Animal»
Задание:
Создайте приложение, использующее основные компоненты для ввода и отображения массивов в приложениях Windows Forms и позволяющее организовать обмен данными с пользователем, сохранение информации в текстовом файле и вычитывание информации из файла по требованию пользователя. Обязательно предусмотрите возможность выполнения основных функций приложения с помощью главного меню формы и с помощью панели инструментов. Графический интерфейс пользователя должен удовлетворять всем требованиям, предъявляемым к GUI в ОС Windows.
В приложении должно содержаться как минимум три формы:
1. Форма для реализации задания, позволяющая наглядно работать с элементами массива, задавать размер массива, осуществлять ввод элементов массива с клавиатуры, или с помощью генератора случайных чисел или чтением из файла.
2. Форма для реализации функций настроек параметров приложения, позволяющая задать цвет главной формы приложения, включение/отключение панели инструментов, координаты появления главной формы на экране (по центру, сверху экрана, снизу экрана).
3. Форма «О программе», на которой должна отображаться следующая информация: Фамилия, имя, фотография автора, номер группы, номер варианта, номер и название лабораторной работы.
Номер варианта соответствует списку в журнале группы
Задания по вариантам:
№ варианта | Задание |
---|---|
1, 21 | Заполнить одномерный массив целыми числами. Вычислить сумму и произведение элементов массива, значения которых кратны 3. |
2, 22 | Заполнить одномерный массив целыми числами. Вычислить произведение и среднее арифметическое элементов массива, значения которых кратны 5. |
3, 23 | Заполнить одномерный массив целыми числами. Вычислить произведение ненулевых элементов в первой и во второй половине массива. |
4, 24 | Заполнить одномерный массив целыми числами. Найти номер минимального элемента массива. Удвоить элементы массива, стоящие до минимального. |
5, 25 | Заполнить одномерный массив целыми числами. Найти в массиве элементы, кратные 4, и вывести их номера. Если таких элементов нет, то вывести сообщение об этом. |
6, 26 | Заполнить одномерный массив целыми числами. Вычислить количество четных и нечетных по значениям элементов массива. Если четных или нечетных элементов нет, то вывести сообщение об этом. |
7, 27 | Заполнить одномерный массив целыми числами. Вычислить количество перемен знака с минуса на плюс или с плюса на минус. Нуль знака не имеет. |
8, 28 | Заполнить одномерный массив целыми числами. Вычислить произведение элементов массива, кратных своим порядковым номерам. Если таких элементов нет, то вывести сообщение об этом. |
9, 29 | Заполнить одномерный массив целыми числами. Вычислить сумму и произведение элементов массива, индексы которых кратны 3. |
10, 30 | Заполнить одномерный массив целыми числами. Вычислить произведение ненулевых элементов массива, стоящих после первого отрицательного элемента. |
11, 31 | Заполнить одномерный массив целыми числами. Вычислить номер первого кратного 3 и последнего кратного 3 элемента массива. |
12, 32 | Заполнить одномерный массив целыми числами. Вычислить номер первого отрицательного и последнего отрицательного элемента массива. |
13, 33 | Заполнить одномерный массив целыми числами. Поменять местами максимальный и минимальный элемент массива. |
14, 34 | Заполнить одномерный массив целыми числами. Вычислить произведение элементов массива, стоящих после максимального элемента. |
15, 35 | Заполнить одномерный массив целыми числами. Вычислить произведение элементов массива, стоящих между максимальным и минимальным элементами. |
16, 36 | Заполнить одномерный массив целыми числами. Найти номер первого четного и последнего четного по значению элементов массива. |
17, 37 | Заполнить одномерный массив целыми числами. Поменять местами первый положительный и последний положительный элемент массива. |
18, 38 | Заполнить одномерный массив целыми числами. Вычислить номер первого кратного 10 и последнего кратного 10 элемента массива. Если таких элементов нет, то вывести сообщение об этом. |
19, 39 | Заполнить одномерный массив целыми числами. Вычислить номер первого максимального элемента массива и количество максимальных элементов. |
20, 40 | Заполнить одномерный массив целыми числами. Вычислить номер первого минимального элемента массива и поменять его местами с первым элементом. |
Критерии оценки лабораторной работы:
- Присутствие на занятии, приложение отсутствует или оно «пустое» — оценка 1 балл.
- Имеется приложение, но оно не работает или находится в начальной стадии разработки — оценка 2 балла.
- Имеется приложение, выполняющее поставленную задачу, однако с неоформленным интерфейсом пользователя — оценка 3 балла.
- Имеется работающее приложение, но в нем имеются незначительные недостатки оформительского характера — оценка 4 балла.
- Имеется полностью готовое приложение в соответствии с вариантом и заданием — оценка 5 баллов.
- Имеется полностью готовое приложение в соответствии с вариантом и заданием + добавлены дополнительные элементы, защиты, оформление и другое, не предусмотренное заданием — оценка 6 баллов и выше.
Коментарии к выполнению задания:
- Создайте отчет к лабораторной работе — текстовый документ с именем ЛР06_ФамилияИмя.doc. Скопируйте в отчет свой вариант задания.
- Выполните разработку структуры входных и выходных данных.
- Для того чтобы разработать структуру входных данных, продумайте, какие входные данные необходимы для решения поставленной задачи? Сколько их? Какого типа? Откуда (из какого источника) могут быть получены входные данные?
- Введите обозначения входных данных и опишите их смысл, типы, источники получения (с клавиатуры, из файла, с помощью списка, переключателей на форме и др.).
- Для того чтобы разработать структуру выходных данных, продумайте, что является результатом решения задачи? В какой форме должны быть получены результаты? Каковы типы результатов? Куда должен быть выведен ответ (на экран, в файл, на принтер)?
- Введите обозначения выходных данных и опишите их смысл, типы, форму выдачи, куда они выдаются.
- Запишите в отчёт входные данные задания (что дано) и выходные данные (что надо найти), с указанием типов исходных данных и результатов.
- Опишите по порядку функциональные характеристики проекта (что должна делать программа), начиная с получения входных данных (возможно несколько вариантов получения), затем опишите обработку входных данных (что вычисляется, каким методом), выдачу результатов, дополнительные сервисные функции.
- Создайте новый проект, выполнив для этого команду Файл / Создать / Проект …. В открывшемся окне выберите Шаблоны / Visual C# и далее выберите Приложение Windows Forms.
Укажите следующие данные для сохранения проекта:
Имя: lab06_fio, где fio — ваши Фамилия и инициалы (латиницей и без пробелов!)
Расположение: в личном каталоге на диске H
Лабораторные работы с отличными от указанных имен файлов ПРОВЕРЯТЬСЯ НЕ БУДУТ!!!
Проверьте, что у вас отмечено поле «Создавать каталог для решения» (в этом случае поле «Имя решения» будет не доступно для задания) и не отмечено поле «Добавить в систему управления версиями» - Разработайте структуру класса для работы с массивом.
- Для того чтобы разработать структуру класса, продумайте, какие характеристики необходимы для работы? Какого они типа? Введите обозначения полей класса и укажите их тип. При этом обязательно предусмотрите, чтобы все имена были значимыми и соответствовали своей смысловой нагрузке.
- Подумайте, какие параметры должны передаваться в конструктор класса? Сколько их? Какого типа они должны быть?
- Какие функции должен выполнять класс? Введите обозначения методов класса. Для каждого метода решите, должен ли метод возвращать результат? Какого типа? Должны ли передаваться в метод параметры? Сколько их? Какого они типа? Должен ли быть доступ к методу из другого класса?
- К каким полям должен быть доступ из вне, а какие являются внутренними?
- Создайте диаграмму классов, указав:
- поля с указанием типа и спецификатора доступа
- конструктор с указанием передаваемых параметров
- методы с указанием входных и выходных параметров и спецификатора доступа.
- Добавьте в проект файл с классом, необходимым для выполнения задания вашего варианта (если данный класс не был создан в процессе создания диаграммы классов). При создании класса предусмотрите, чтобы ваш код соответствовал принципам самодокументируемости (т.е. все поля, свойства и методы имели значимые имена). Предусмотрите в классе:
- поля для хранения характеристик массива,
- свойства для работы с полями,
- конструкторы для создания массива,
- методы для работы с массивом
- Разработайте блок-схему алгоритма метода, производящего необходимые вычисления. Внесите разработанную блок-схему в отчет.
- Продумайте, какие элементы интерфейса необходимо разместить на форме, чтобы обеспечить удобную и наглядную работу пользователя. Предусмотрите возможность задания размера массива. Ввод массива нужно осуществлять с клавиатуры, случайным образом или путем чтения из файла. Способ ввода можно менять с помощью зависимых кнопок выбора. Для отображения массива можно использовать компонент dataGridView.
- Выполните настройку свойств компонента dataGridView. Так как массив одномерный, установите количество строк таблицы 1, количество колонок по умолчанию 10. Строка заголовка должна отображать номер элемента, а столбец заголовка не требуется.
- Добавьте на форму поле ввода с кнопкой-переключателем numericUpDown. При нажатии на кнопку-переключатель должно устанавливаться соответствующее количество ячеек таблицы и её ширина. Добавьте метод нажатия на кнопку numericUpDown и внесите необходимые команды в тело метода. Также предусмотрите изменение необходимых полей в классе массива.
- При переключении кнопок-переключателей radioButton в контейнере groupBox должен меняться способ
ввода массива. Создайте метод обработки события щелчка по контейнеру. - При выборе пользователем кнопки «С клавиатуры» таблица на форме должна очищаться и переводиться в состояние редактирования пользователем.
- При выборе пользователем кнопки «Случайно» таблица на форме должна заполняться случайными числами в интервале [-100; 100] и переводиться в состояние запрета редактирования пользователем.
- При выборе пользователем кнопки «Из файла» должно открываться диалоговое окно для выбора файла с данными таблицы. В файле должны храниться следующие данные: первая строка — размер массива, вторая строка — элементы массива через пробел. При открытии файла должен устанавливаться корректный размер таблицы, и таблица должна заполняться значениями из файла. В случае недостаточного количества элементов в файле, она должна дополняться нулями.
- Все расчёты в программе должны происходить при нажатии
на кнопку «Вычислить». Создайте соответствующий обработчик события нажатия на кнопку. При нажатии на кнопку «Вычислить» значения из таблицы должны считываться в массив (с помощью вызова одного из методов класса массива), а затем с этим массивом должны производить действия и вычисления по заданию (опять же с помощью вызова необходимых методов класса массива). - Составьте протокол испытаний приложения.
- Протестируйте приложение в соответствии с протоколом испытаний. Отследите, чтобы не возникали ошибки выполнения при недопустимости исходных данных, например, если пользователь оставил одну или несколько ячеек таблицы пустыми, ввел в ячейку недопустимые символы, открыл файл с недопустимым форматом и т.д. Подумайте, как можно предотвратить такие ошибки. Добавьте необходимые методы проверки правильности ввода исходных данных.
- Протестируйте приложение при различных значениях
размерности массива, в режиме ввода с клавиатуры, случайного ввода и вычитывания из файла. Добавьте в отчет скриншоты различных вариантов выполнения программы.
Например:
Класс MyArray
1) Поля:
— int nstandart — стандартный размер массива, только для чтения
— int n — размер массива
— int[] array — массив целых чисел
2) Конструкторы:
— MyArray() — по умолчанию, создает массив стандартного размера и заполняет его нулями
— MyArray(int n) — создает массив размера n и заполняет его случайными числами
— MyArray(string filename) — читает массив из указанного файла
3) Методы:
— Sum() — вычисляет сумму элементов массива, возвращает целое число
— MaxEl() — возвращает целое число — максимальный элемент массива
Примерный вид формы при запуске:
Таблица 1. Основные свойства табличных компонентов
Свойство | Назначение |
---|---|
RowCount, ColumnCount | задают число строк и столбцов таблицы (нумерация строк и столбцов начинается с нуля). Путем задания новых значений этих свойств можно динамически менять размерность таблицы |
RowHeadersVisible, ColumnHeadersVisible | задают будут ли отображаться заголовки строк и столбцов |
ColumnHeadersHeights, RowHeadersWidths | задают высоту и ширину ячеек таблицы. Размеры таблицы и её ячеек задаются в пикселях и могут изменяться во время работы программы по содержимому ячеек |
ColumnHeadersHeightSizeMode | определяет поведение при изменении высоты заголовков столбцов. Если установить это свойство в значение EnableResizing, то высота заголовков столбцов не будет изменяться по содержимому, и можно будет в конструкторе задать высоту строки заголовка |
AutoSizeColumnMode | определяет режим автоматической установки размера для видимых столбцов (рекомендуется установить значение Fill) |
AllowUserToAddRows | определяет, есть ли возможность добавления строк (рекомендуется установить значение false) |
AllowUserToDeleteRows | определяет, есть ли возможность удаления строк (рекомендуется установить значение false) |
ReadOnly | определяет, может ли пользователь редактировать содержимое ячеек таблицы (рекомендуется устанавливать true при вводе с клавиатуры и false — в остальных случаях) |
dataGridView1.Rows[i].Cells[j].Value | используется для доступа к отдельной ячейке с указанием номера столбца и номера строки. Используя цикл для перебора номеров строк и столбцов таблицы, можно поочередно обращаться к каждой ячейке |
Пример оформления протокола испытаний:
Проверяемые требования | Действия пользователя и вводимые значения | Результаты и сообщения программы |
---|---|---|
Способность программы обеспечить ввод размера массива | С помощью кнопок «Вверх-вниз» задать различные значения от 1 до 100. Проверить возможность задания размера путем ввода с клавиатуры | Размер массива изменяется, количество ячеек в таблице соответствует заданному размеру массива |
Способность программы обеспечить контроль вводимого размера массива. | В поля ввода попробовать ввести: 1) отрицательное значение 2) нуль 3) 101 4) дробное значение 5) символ, отличный от цифры |
В поле ввода можно ввести только целое число от 1 до 100. |
и т.д. для всех функций, которые были выделены в п.3!! |
Подведение итогов лабораторной работы:
Результатом выполнения лабораторной работы должен быть
проект, сохранённый в отдельной папке, и отчёт. Отчёт должен содержать:
- название лабораторной работы, цель работы;
- текст вашего задания с указанием номера варианта;
- структуру входных и выходных данных;
- функциональные характеристики проекта;
- структуру класса для работы с массивом и диаграмму класса;
- алгоритм основного вычислительного метода класса;
- протокол испытаний;
- скриншоты проекта на этапе выполнения, соответствующие протоколу испытаний;
- колонтитулы с вашей фамилией и номером группы.
Продемонстрируйте результаты работы преподавателю и
получите оценку.
Контрольные вопросы:
- Какие свойства таблицы dataGridView можно установить на этапе конструирования? Поясните назначение этих свойств.
- Какое свойство таблицы dataGridView позволяет обратиться к определённой ячейке в программе?
- Сколько методов получилось в классе массива, какое у них назначение?
- Сколько методов — обработчиков событий получилось в классе Program, какие события они обрабатывают?
1. Массивы в C#
2. Различные классификации типов данных
Типы
данных
Простые
Типы
данных
Структуриро
ванные
Встроенные
Типы
данных
Статические
Динамические
Определяемые
программистом
3.
Основная классификация типов C#
Типы
данных
Тип void
Значения
Указатели
Ссылочные
Перечисления
Структурные
типы
Булевский
Целые
Вещественные
Финансовый
Символьный
Типы nullable
object
Массивы
Строки string
Классы
Интерфейсы
Делегаты
Структуры
Типы C# разделяют по способу хранения элементов на типы-значения и ссылочные типы.
Элементы значимых типов (value types), представляют собой просто последовательность битов в
памяти, необходимый объем которой выделяет компилятор. Величины значимых типов хранят
свои значения непосредственно. Величина ссылочного типа хранит не сами данные, а ссылку на
них (адрес, по которому расположены данные). Сами данные хранятся в хипе.
4.
Массивы
Массив — ограниченная совокупность однотипных
величин
Элементы массива имеют одно и то же имя, а
различаются по порядковому номеру (индексу)
Пять простых переменных (в стеке):
a
b
c
d
Массив из пяти элементов значимого типа (в хипе):
a[0]
a[1]
a[2]
a[3]
a
4
e
a[4]
5. Массивы в C#
В языке C# каждый индекс массива
изменяется в диапазоне от 0 до некоторого
конечного значения. Массивы в языке C#
являются настоящими динамическими
массивами. Как следствие этого, массивы
относятся к ссылочным типам, память им
отводится динамически в «куче». Массивы
могут быть одномерными и многомерными.
6. Объявление одномерного массива
<тип>[] <объявители>;
каждый объявитель может быть именем или
именем с инициализацией.
Объявление массива:
•с инициализацией
•с отложенной инициализацией
7. Объявление одномерного массива
Объявление массива с инициализацией:
•Явная инициализация константным массивом
•Создание массива с помощью операции new
Пример явной инициализации:
double[] x = {5.5, 6.6, 7.7};
в динамической памяти создаётся константный массив с заданными
значениями, с которым и связывается ссылка.
Пример сознания с помощью операции new:
int[] d = new int[5];
массив создаётся в динамической памяти, его элементы получают
начальные нулевые значения, и ссылка связывается с этим массивом.
8. Объявление одномерного массива
Объявление с отложенной инициализацией
выполняется в 2 этапа:
1. Объявление массива
2. Инициализация массива
9. Объявление одномерного массива
Объявление массива
Пример:
int[ ] a;
При объявлении с отложенной инициализацией сам массив
не формируется, а создаётся только ссылка на массив,
имеющая неопределённое значение Null. Поэтому пока
массив не будет реально создан и его элементы
инициализированы, использовать его в вычислениях
нельзя!!!
10. Одномерные массивы
• Варианты описания массива:
тип[] имя;
тип[] имя = new тип [ размерность ];
тип[] имя = { список_инициализаторов };
тип[] имя = new тип [] { список_инициализаторов };
тип[] имя = new тип [ размерность ] { список_инициализаторов };
• Примеры описаний (один пример на каждый вариант описания,
соответственно):
int[] a;
// элементов нет
int[] b = new int[4];
// элементы равны 0
int[] c = { 61, 2, 5, -9 };
// new подразумевается
int[] d = new int[] { 61, 2, 5, -9 }; // размерность вычисляется
int[] e = new int[4] { 61, 2, 5, -9 };
// избыточное описание
10
11. Размерность массива
• Количество элементов в массиве (размерность) задается при выделении
памяти и не может быть изменена впоследствии. Она может задаваться
выражением:
short n = …;
string[] z = new string[2*n + 1];
• Размерность не является частью типа массива.
• Элементы массива нумеруются с нуля.
Для обращения к элементу массива после имени массива указывается
номер элемента в квадратных скобках, например:
w[4]
z[i]
• С элементом массива можно делать все, что допустимо для переменных
того же типа.
• При работе с массивом автоматически выполняется контроль выхода за
его границы: если значение индекса выходит за границы массива,
генерируется исключение IndexOutOfRangeException.
11
12. Объявление одномерного массива
Инициализация массива:
Пример:
a = new int[10];
Выражение, задающее границу изменения индексов, в динамическом
случае может содержать переменные. Единственное требование –
значения переменных должны быть определены в момент объявления!
Пример:
n=Convert.ToInt32(Textbox1.Text);
a = new int[n];
13. Пример 1. С клавиатуры ввести элементы массива из 20-ти значений. Вывести элементы массива с указанием для каждого его индекса
(порядкового номера в массиве)
14. Ввод одномерного массива в Windows Forms
15. Ввод одномерного массива в Windows Forms
namespace одномерный_массив
{
public partial class Form1 : Form
{
int[] a;
int i;
public Form1()
{
InitializeComponent();
a = new int[10];
i = 0;
textBox1.Focus();
label1.Text = «Элемент » + Convert.ToString(i + 1);
}
16. Ввод одномерного массива в Windows Forms
private void button1_Click(object sender, EventArgs e)
{
a[i] = Convert.ToInt32(textBox1.Text);
i++;
if (i < 10)
{ label1.Text = «Элемент » + Convert.ToString(i + 1);
textBox1.Focus();
}
else
{ button1.Enabled = false;
label1.Text = «Конец»;
}
textBox1.Text = «»;
}
17. Вывод одномерного массива
18. Вывод одномерного массива
Первый вариант:
private void button2_Click(object sender, EventArgs e)
{ listBox1.Items.Clear();
for(int k=0; k<10; k++)
listBox1.Items.Add(Convert.ToString(a[k]));
}
19. Вывод одномерного массива
Новый оператор цикла:
foreach(тип идентификатор in массив) оператор
Цикл работает в полном соответствии со своим названием – тело цикла
выполняется для каждого элемента в контейнере. Тип идентификатора
должен быть согласован с типом элементов, хранящихся в массиве
данных. На каждом шаге цикла идентификатор, задающий текущий
элемент массива, получает значение очередного элемента в
соответствии с порядком, установленным на элементах массива. С этим
текущим элементом и выполняется тело цикла — выполняется столько раз,
сколько элементов находится в массиве. Цикл заканчивается, когда
полностью перебраны все элементы массива.
20. Вывод одномерного массива
Второй вариант:
private void button2_Click(object sender, EventArgs e)
{ listBox1.Items.Clear();
foreach (int item in a)
listBox1.Items.Add(Convert.ToString(item));
}
21. Действия с массивами
• Массивы одного типа можно присваивать друг другу. При этом
происходит присваивание ссылок, а не элементов:
int[] a = new int[10];
int[] b = a;
// b и a указывают на один и тот же массив
• Для удобства работы с массивами в C# существует базовый класс
Array, в котором собраны основные методы обработки массивов.
• В лабораторной работе 1 методы класса Array не используются. Цель
работы – написание собственных методов для выполнения требуемых
функций.
©Павловская Т.А. (СПбГУ
ИТМО)
21
22. Пример (не лучший способ)
Для массива, состоящего из 6 целочисленных элементов,
программа определяет:
• сумму и количество отрицательных элементов;
• максимальный элемент.
22
23. Программа
const int n = 6;
int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };
Console.WriteLine( «Исходный массив:» );
for ( int i = 0; i < n; ++i ) Console.Write( «t» + a[i] );
Console.WriteLine();
long sum = 0;
// cумма отрицательных элементов
int num = 0;
// количество отрицательных элементов
for ( int i = 0; i < n; ++i )
if ( a[i] < 0 ) {
sum += a[i]; ++num;
}
Console.WriteLine( «Сумма отрицательных = » + sum );
Console.WriteLine( «Кол-во отрицательных = » + num );
int max = a[0];
// максимальный элемент
for ( int i = 0; i < n; ++i )
if ( a[i] > max ) max = a[i];
Console.WriteLine( «Максимальный элемент = » + max );
23
24. Оператор foreach (упрощенно)
• Применяется для перебора элементов массива. Синтаксис:
foreach ( тип имя in имя_массива ) тело_цикла
• Имя задает локальную по отношению к циклу переменную,
которая будет по очереди принимать все значения из массива,
например:
int[] massiv = { 24, 50, 18, 3, 16, -7, 9, -1 };
foreach ( int x in massiv ) Console.WriteLine( x );
Оператор foreach служит только для перебора и просмотра
значений в некоторой коллекции. Изменять данные в коллекции с
помощью него нельзя.
24
25. Программа с использованием foreach
int[] a = { 3, 12, 5, -9, 8, -4 };
Console.WriteLine( «Исходный массив:» );
foreach ( int elem in a )
Console.Write( «t» + elem );
Console.WriteLine();
long sum = 0;
// cумма отрицательных элементов
int num = 0;
// количество отрицательных элементов
foreach ( int elem in a )
for ( int i = 0; i < n; ++i )
if ( elem < 0 ) {
if ( a[i] < 0 ) {
sum += elem; ++num;
sum += a[i]; ++num;
}
}
Console.WriteLine( «sum = » + sum );
Console.WriteLine( «num = » + num );
int max = a[0];
// максимальный элемент
foreach ( int elem in a )
if ( elem > max ) max = elem;
Console.WriteLine( «max = » + max );
25
26. Работа с массивом, размерность которого вводится в процессе работы программы Пример 5. Даны два n -мерных вектора. Найти сумму
Работа с массивом, размерность которого вводится в процессе работы
программы
Пример 5. Даны два n -мерных вектора. Найти сумму этих векторов.
27. Формирование значений элементов массива случайным образом
Random random = new Random();
for (int i=0;i<=n-1;i++)/*пробегая последовательно элементы массива*/
X[i]= random.Next(1,50); /* запишем туда случайное число, кото
рое сформирует компьютер в диапазоне [1..50]*/
28. Обмен значений двух переменных
3
5
5
3
3
28