
puhpr4op2012
.docМІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Національний аерокосмічний університет ім. М.Є. Жуковського “ХАІ”
Кафедра 603
Лабораторна робота № 4
з дисципліни “Основи програмування”
ХАІ.603.611пст.12О.050103. 126377.ПЗ
Виконав студент гр. 611пст Чулков С.С.
________________ (№ групи) (П.І.Б)
(підпис, дата)
Перевірила: __________________________
(наукова ступінь, вчене звання)
____________________________________
(підпис, дата) (П.І.Б)
2012
Тема: Обработка динамических массивов данных. Компонент DataGridView (таблица строк).
Цель: Изучение компонента DataGridView и его основных свойств.
Задание: Удалить все чётные елементы матрицы. Матрицу заполнить целочисленными значениями от 1 до n, где n – размерность матрицы, по главной и второстепенной диагонали слева направо.
Постановка задачи
Создать приложение для решения задачи формирования и обработки двумерного динамического массива согласно варианту. Приложение должно содержать главную форму, в которой находится:
текстовый элемент управления с меткой для ввода исходных данных;
элементы управления DataGridView для вывода результатов;
кнопки формирования исходной и результирующей матриц.
Разработать отдельные подпрограммы с параметрами:
формирования динамической квадратной матрицы целочисленных данных;
вывода на экран динамической матрицы в элемент управления DataGridView;
удаления элементов (с изменением размера) динамической матрицы, заданных в варианте.
Размер исходной матрицы N вводится с клавиатуры и фактически не ограничен (ограничен лишь оперативной памятью).
Заполнять матрицу по главной и второстепенной диагонали слева на право целыми числами в порядке возрастания.
Обработать все возможные исключительные ситуации.
Теоретические сведения
Многомерные массивы
Помимо простых массивов — массивов с одним измерением в С# поддерживаются также две основные разновидности многомерных массивов:
прямоугольные массивы. Такой тип массива образуется простым сложением нескольких измерений. При этом все строки и столбцы в данном массиве будут одинаковой длины. Объявление таких массивов имеет вид:
тип[,] имя__массива;
тип[,] имя__массива = new тип [р_1,р_2];
тип[,] имя__массива = {список инициализаторов};
тип[,] имя__массива = new тип [,] {список инициализаторов};
тип[,] имя__массива = new тип [р_1,р_2] {список инициализаторов};
Например:
int [,] a; //элементов нет описана только ссылка на массив
int [,] b=new int [2,3]; //элементы в массиве равны 0
int [,] c={{5,7},{-9,8,4}}; //выделена память под 5 эл-тов new подразумевается
int [,] d=new int[,] {{5,7},{-9,8,4,-4}}; //размерность вычисляется
int [,] e=new int[2,3] {{5,7,-9},{8,4,-4}}; //избыточное описание при этом размер должен быть постоянным.
Доступ к элементам массива: имя_массива[ном_строки,ном_столб].
ломаные (jagged) (ступенчатые). Taкoй массив содержит в качестве внутренних элементов некоторое количество внутренних массивов, каждый из которых может иметь свой внутренний уникальный размер.
Объявление таких массивов имеет вид:
тип[][] имя__массива;
Под каждый из массивов, составляющий ломаный массив память требуется выделять явно. Например:
int [][] a=new int [3][]; //память под 3 строки ссылки
a[0]=new int [5];
a[1]=new int [7];
a[2]=new int [2];
Доступ к элементам массива: имя_массива[ном_строки][ном_столб].
Элемент управления DataGridView (таблица)
Элемент управления DataGridView
(таблица) отображает данные в настраиваемой
сетке. Добавляется компонент с помощью
кнопки
группы Data (Данные)
панели инструментов.
Некоторые свойства элемента управления DataGridView приведены в табл. 4.1.
Таблица 4.1
Свойства и методы DataGridView
Свойство |
Описание свойства |
Rows |
Коллекция всех строк |
Colums |
Коллекция всех столбцов |
ColumnCount |
Получает или задает кол-во столбцов в элементе |
DataGridViewRow.Cells |
Возвращает коллекцию ячеек, заполняющих строку |
Rows.Add(numb) |
Добавляет numb строк |
Columns[i].ReadOnly |
Установка свойства Readonly (только для чтения) для столбца i |
Columns[i].SortMode |
Установка режима сортировки для столбца i |
Columns[i].Name |
Установка свойства Name для столбца i (заголовок столбца) |
Columns[i].Width |
Установка ширины столбца i |
Rows[i].Cells[j].Value |
Значение ячейки находящейся на пересечении строки i столбца j |
SelectedCells.Count |
Количество выделенных ячеек |
SelectedCells |
Коллекция выделенных ячеек |
SelectedCells[i].Value |
Значение выделенной ячейки с номером i (i=0-если разрешено выделять только одну ячейку, свойство Multiselect=false) |
Ход работы
1. Экранные формы.
Рис 1. Главная форма при запуске
Рис 2. Отображение матрицы чётного порядка
Рис 3. Отображение матрицы нечётного порядка
Рис 4. Вид таблицы после удаления чётных элементов
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 puhpr4op2012
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int[][] matrix = new int[0][];//Наша матрица
private void DoSomething_Click(object sender, EventArgs e)
{
int n= Convert.ToByte(Numeric.Value); //размерность матрицы
Array.Resize(ref matrix, n); //подгонка размера, выделение памяти
CreateMatrix(ref matrix, n); //заполнение значениями
PutinGrid(matrix, MatrixView); //внесение на форму в таблицу
}
private void PutinGrid(int[][] mas, DataGridView OutPut)
{
int temp=mas[0].Length;
OutPut.ColumnCount = 0;
OutPut.ColumnCount = mas[0].Length;
OutPut.Rows.Add(temp);
for (int i = 0; i < temp; i++)
{
OutPut.Columns[i].Visible = true;
OutPut.Columns[i].Name = i.ToString();
OutPut.Columns[i].Width = 20;
OutPut.Columns[i].ReadOnly = true;
OutPut.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
for (int j = 0; j < mas[0].Length; j++)
{
OutPut.Rows[i].Cells[j].Value = mas[i][j];
if (mas[i][j]!=0)OutPut.Rows[i].Cells[j].Style.BackColor= Color.Yellow;//решил выделить цветом
}
}
MessageBox.Show("матрица внесена");
}
private void CreateMatrix(ref int[][] A, int size)
{
for (int i=0;i<size;i++)
{
A[i] = new int[size];
}
for (int i=0;i<size;i++)
for (int j = 0; j < size; j++)
{
if (i != j) A[i][j] = 0;//сначала недиагональные элементы делаем нулевыми;
else A[i][j] = j+1;//а так же главную диагональ заполняем от 1 до n;
if (j == (size - 1)- i) { A[i][j] = size - i; }//...и вспомогательную от 1 до n;
}
//MessageBox.Show("все элементы заполнены");
}
private void button3_Click(object sender, EventArgs e)
{
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Внимание! Сейчас будут удалены чётные элементы из полученой матрицы");
KillPairs(MatrixView, matrix);
//MessageBox.Show("Знаю, не изменил размер уже существующего массива! =/");
}
private void KillPairs(DataGridView table, int[][] mas)
{
byte size = Convert.ToByte(Numeric.Value);// разрядность строки
byte last;
for (byte i=0; i<size; i++)
{
last = size;//длина строки после всех операций
for (byte j=0; j<size; j++)
{
if ((mas[i][j] % 2 == 0) && (mas[i][j] != 0))//проверка на чётность
{
for (byte m=j;m<last-1;m++)mas[i][m]=mas[i][m+1];// last-1 !
mas[i][last-1] = 0;
last -= 1;
}
}
Array.Resize(ref mas[i], last);// не уверен, но работает!
}
PutinGrid(mas, table);
}
}
}
Вывод. В ходе работы над практической освоил основы работы с двумерными массивами, а так же выод их на форму при помощи специализированных компонентов. Считаю материал усвоенным, но требующим практики и неоднократного закрепления на практике.