Главная страница

лекция. Зиборов. Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги


Скачать 7.39 Mb.
НазваниеСправочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Анкорлекция
Дата13.04.2023
Размер7.39 Mb.
Формат файлаdoc
Имя файлаЗиборов.doc
ТипСправочник
#1060897
страница10 из 31
1   ...   6   7   8   9   10   11   12   13   ...   31
1   ...   6   7   8   9   10   11   12   13   ...   31
ГЛАВА 7 Ввод и вывод табличных данных. Решение системы уравнений

Пример 44. Формирование таблицы. Функция String.Format

При создании инженерных, экономических и других приложений часто задача сводится к вводу данных, расчету (обработке введенных данных), а затем — выво­ду результатов вычислений в таблицу. В этом разделе мы обсудим такую типичную задачу: как оптимально сформировать таблицу, а затем вывести ее на экран с воз­можностью печати на принтере.

Чтобы выразительно показать именно процесс формирования таблицы, абстра­гируемся от ввода данных и расчетов и сосредоточимся только на сути. Например, пусть мы имеем информацию о телефонах наших знакомых, и нам хотелось бы представить эту информацию в виде наглядной таблицы. Предположим, что ре­зультаты обработки записаны в два массива: массив имен знакомых imena и массив телефонов Tel. Наша программа формирует таблицу из этих двух массивов в тек­стовом поле TextBox. Кроме того, в программе участвует элемент управления MenuStrip для организации раскрывающегося меню, с помощью которого пользо­ватель выводит сформированную таблицу в Блокнот (notepad.exe) с целью после­дующей корректировки (редактирования) и вывода на печать.

Таким образом, новый проект будет содержать форму, текстовое поле TextBox со свойством Multiline = true и меню MenuStrip. Текст программы представлен в листинге 7.1.

Листинг 7.1. Формирование таблицы

// Программа формирует таблицу из двух строковых массивов в текстовом поле,

// используя функцию String.Format. Кроме того, в программе участвует

// элемент управления MenuStrip для организации выпадающего меню,

// с помощью которого пользователь выводит сформированную таблицу

//в Блокнот с целью последующего редактирования и вывода на печать

using System;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace ТаблТxt

{

public partial class Form1:Form

{

public Form1()

{

InitializeComponent();

this.textBox1.Multiline = true;

this.textBox1.Size = new System.Drawing.Size(320, 216);

this.Text = "Формирование таблицы";

String[] Imena = {"Андрей - раб", "Света-X", "ЖЭК", "Справка по тел", "Александр Степанович", "Мама - дом", "Карапузова Таня", "Погода сегодня", "Театр Браво"};

String[] Tel = {"274-88-17","+38(067)7030356", "22-345-72", "009", "223-67-67 доп 32-67", "570-38-76", "201-72-23-прямой моб", "001", "216-40-22"};

textBox1.ScrollBars = ScrollBars.Vertical;

textBox1.Font e new System.Drawing.Font("Courier New", 9.0F);

textBox1.Text = "ТАБЛИЦА ТЕЛЕФОНОВ\r\n\r\n";

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

textBox1.Text += String.Format(

"{0, -21} {1, -21}", Imena[i], Tel[i]) + "\r\n";

textBox1.Text += "\r\nПРИМЕЧАНИЕ:" + "\r\пдля корректного отображения таблицы" +

"\r\nв Блокноте укажите шрифт Courier New";

// Запись таблицы в текстовый файл C:\Table.txt.

// Создание экземпляра StreamWriter для записи в файл

var Писатель = new System.10.StreamWriter(@"С:\Table_CS.txt", false

System.Text.Encoding.GetEncoding(1251));

// - здесь заказ кодовой страницы Win1251 для русских букв

Писатель.Write(textBoxl.Text);

Писатель.Close();

}

private void показатьТаблицуВБлокнотеТооlStripMenuItem_Click(object sender, EventArgs e)

{

try

{

System.Diagnostics.Process.Start("Notepad", @"C:\Table.txt");

}

catch (Exception Ситуация)

{ // Отчет об ошибках

MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{ // Выход из программы:

this.Close();

}

}

}

Чтобы в текстовом поле TextBox таблица отображалась корректно, мы заказали шрифт Courier New. Особенность этого шрифта заключается в том, что каждый символ (буква, точка, запятая и др.) этого шрифта имеет одну и ту же ширину, как это было на печатающей машинке. Поэтому, пользуясь шрифтом Courier New, удобно строить таблицы. Таким же замечательным свойством обладает, например, шрифт Consolas.

Далее в пошаговом цикле for мы использовали оператор +=, он означает: сце­пить текущее содержание текстовой переменной textBox1.Text с текстом, пред­ставленным справа. Функция String.Format возвращает строку, сформированную по формату. Формат заключен в кавычки. Ноль в первых фигурных скобках озна­чает: вставить вместо нуля переменную Imena[i], а единица во вторых фигурных скобках— вставить вместо единицы строку Tel[i]. Число 21 означает, что длина строки в любом случае будет состоять из 21 символа (недостающими символами будут пробелы), причем знак "минус" заставляет прижимать текст влево. Символы "\r\n" означают, что следует начать текст с новой строки. Внешний вид таблицы в текстовом поле формы показан на рис. 7.1.

После формирования всех строк textBox1.Text записываем их в текстовый файл C:\Table.txt через StreamWriter с кодовой таблицей Windows 1251. Подроб­ное обсуждение этого фрагмента программы читатель может посмотреть в примере 24 (см. главу 4).

При выборе пользователем пункта меню Показать таблицу в Блокноте сис­тема создает событие, которое обрабатывается в соответствующей процедуре. Здесь вызываем программу операционной системы Блокнот (notepad.exe) для от­крытия файла C:\Table.txt (см. рис. 7.2).

Убедиться в работоспособности программы можно, открыв решение ТаблТхt.sIn в папке ТаблТхt.



Рис. 7.1. Таблица из двух массивов в текстовом поле.



Рис. 7.2. Просмотр созданной таблицы в Блокноте

Пример 45. Форматирование Double-переменных в виде таблицы. Вывод таблицы на печать. Поток String/Reader

Данная программа решает похожую задачу, однако в результате вычислении не строковые переменные string, а два массива переменных с двойной точностью Double. Например, пусть в результате расчетов получены координаты точек на местности Xи Y. Эти координаты необходимо оформить в виде таблицы. Таблицу следует назвать "Каталог координат". Координаты в таблице должны быть округлены до 2-х знаков после запятой. Сформированную таблицу следует показать пользователю в тексховом поле TextBox. Далее надо организовать возможность распечатать таблицу на принтере. Заметьте, что в этой задаче мы решаем проблемы без использования Блокнота.

Для решения этой задачи, также как и в предыдущем разделе, в форме с помо­щью панели элементов управления Toolbox создадим текстовое поле TextBox, выберем элементы управления MenuStip и PrintDocument. На вкладке Design под­готовим пункты меню Печать и Выход так, как показано на рис. 7.3. Непосред­ственно текст программы представлен в листинге 7.2.

Листинг 7.2. Формирование таблицы и вывод ее на печать

// Программа формирует таблицу на основании двух массивов переменных

// сдвойной точностью. Данную таблицу программа демонстрирует пользователю

//в текстовом поле TextBox. Есть возможность распечатать таблицу на принтере

using System;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace TablTxtPrint

{

public partial class Form1:Form

{

System.IO.StringReader Читатель;

public Form1()

{

InitializeComponent();

this.Text = "Формирование таблицы";

Double[] X = {5342736.17653, 2345.3333, 234683.853749, 2438454.825368, 3425.72564, 5243.25, 537407.6236, 6354328.9876, 5342.243};

Double[] Y = {27488.17, 3806703.356, 22345.72, 54285.34, 2236767.3267, 57038.76, 201722.3, 26434.001, 2164.022};

textBox1.Multiline = true;

textBox1.ScrollBars = ScrollBars.Vertical;

textBox1.Font = new System.Drawing.Font("Courier New", 9.0F);

textBox1.Text = "КАТАЛОГ КООРДИНАТ\r\n";

textBox1. Text += " \r\n";

textBox1.Text += "|Пункт| X | У |\r\n";
textBox1. Text += " - \r\n";

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

textBox1.Text += String.Format(

"I {0,3:D} I {1,10:F2} | {2,10:F2} |", i, X[i], Y[i]) + "\r\n".
textBox1. Text += " \r\n";

}

private void печатьToolStripMenuItem_Click(object sender, EventArgs e)

{ // Пункт меню "Печать"

try

{ // Создание потока Читатель для чтения из строки:

Читатель = new System. IO.StringReader(textBox1.Text) ;

try

{ printDocumentl.Print(); }

finally

{ Читатель.Close(); }

}

catch (Exception ex)

{ MessageBox.Show(ex.Message); }

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{ // Выход из программы this.Close();

}

}

}

Как видно, формирование таблицы также происходит в цикле for с помощью функции String.Format. В фигурных скобках числа 0, 1 и 2 означают, что вместо фигурных скобок следует вставлять переменные i, x[i], y[i]. Выражение "3:D означает, что переменную i следует размещать в трех символах по формату целых переменных "D". Выражение "10:F2" означает, что переменную x(i) следует раз­мещать в десяти символах по фиксированному формату с двумя знаками после за­пятой.

При обработке события "щелчок на пункте меню" Печать (см. рис. 7.3) в бло­ках try.. .finaiy.. .catch создаем поток читатель, однако не для чтения из фай­ла, а для чтения из текстовой переменной textBox1.Text. В этом случае мы обра­щаемся с потоком Читатель так же, как при операциях с файлами, но совершенно не обращаясь к внешней памяти (диску). Поэтому организация многостраничной печати остается абсолютно такой же, как в примере 29 (см. главу 4).

Как видно из приведенной программы, для того чтобы просмотреть, откоррек­тировать и распечатать на принтере таблицу (инженерных или экономических вы­числений), совершенно необязательно записывать эту таблицу в текстовый файл И читать его Блокнотом.



Рис. 7.3. Вывод таблицы в текстовое поле

Убедиться в работоспособности программы можно, открыв соответствующее решение в папке ТаблТхtPrint.

Пример 46. Вывод таблицы в Internet Explorer

Приведем несколько необычный подход к выводу таблицы для целей ее про­смотра и распечатывания на принтере. Запишем таблицу в текстовый файл в фор­мате HTML, затем прочитаем ее с помощью обозревателя (браузера) Web-страниц Internet Explorer. HTML (HyperText Markup Language, язык гипертекстовой размет­ки)— специальные инструкции браузеру, с помощью которых создаются Web-страницы. То есть Web-страницы — это документы в формате HTML, содержащие текст и специальные теги (дескрипторы) HTML. По большому счету теги HTML необходимы для форматирования текста (т. е. придания ему нужного вида), кото­рый "понимает" браузер. Документы HTML хранятся в виде файлов с расширением htm или html. Теги HTML сообщают браузеру информацию о структуре и особен­ностях форматирования Web-страницы. Каждый тег содержит определенную инст­рукцию и заключается в угловые скобки (<>).

Приведем пример простейшей таблицы, записанный на языке HTML (лис­тинг 7.3).

Листинг 7.3. Представление таблицы на языке HTML





Таблица телефонов

Aндрей - pa6274-88-17

Cвета - X+38 (067) 7030356

ЖЭК22-345-72

Cпpaвкa no Teл009



Вообще говоря, если строго придерживаться правил языка HTML, то сначала следует написать теги <html>, <head>, <title> и т.д. Однако современные браузеры понимают и такую разметку, которая приведена в листинге 7.3. В нашем примере даже не указан ни один закрывающий тег для <tr> (тег, задающий строку в таблице) и для <td> (тег, задающий ячейку в таблице). Очень полезно будет читатели набрать приведенный нами пример в Блокноте, как-нибудь назвать этот файл с расширением htm и открыть его в каком-либо браузере Internet Explorer, MoziU Firefox или другом обозревателе. Также поучительно открыть этот файл в редакторе HTML Microsoft Office FrontPage и проследить, как меняется HTML форматирование при тех или иных изменениях, сделанных в таблице.

Наша программа имеет данные, уже знакомые читателю из примера 44. Эти данные находятся в двух массивах: Imena и Tel. На основании этих двух массивов программа формирует таблицу в формате HTML, т. е. создает текстовый файл (в нашей программе он называется C:\Tab1_tel.htm), а затем открывает этот файл браузером Internet Explorer. Текст программы приведен в листинге 7.4.

Листинг 7.4. Вывод таблицы в Internet Explorer

// Вывод таблицы в Internet Explorer. Здесь реализован несколько необычный

// подход к выводу таблицы для ее просмотра и печати на принтере.

// Программа записывает таблицу в текстовый файл в формате HTML.

// Теперь у пользователя появляется возможность прочитать эту таблицу

//с помощью обозревателя Web-страниц Internet Explorer или другого браузера

using System;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Табл_НТМ

{

public partial class Forml : Form

{

public Form1()

{

InitializeComponent();

this.Text = "Таблица в формате HTML";

string[] Imena = {"Андрей - раб", "Света-Х", "ЖЭК", "Справка по тел", "Александр Степанович", "Мама - дом", "Карапузова Таня", "Погода сегодня", "Театр Браво"};

string[] Tel = {"274-88-17", "+38(067)7030356", "22-345-72", "009", "223-67-67 доп 32-67",

"570-38-76", "201-72-23-прямой моб", "001", "216-40-22"};

string text = "" + "" +

"Таблица телефонов\г\п" ; for (int i = 0; i <= 8; i++)

text += string.Format("
{0}{l}", Imena[i], Tel[i]) + "\r\n";

text += "
";

// Запись таблицы в текстовый файл C:\Tabl_tel.htm.

// Создание экземпляра StreamWriter для записи в файл

var Писатель = new System.IO.StreamWriter(@"С:\Tabl_tel.htm", false,

System.Text.Encoding.GetEncoding(1251));

// - здесь заказ кодовой страницы Win1251 для русских букв

Писатель.Write(text); Писатель.Close();

try

{

// System.Diagnostics.Process.Start("Iexplore", @"C:\Tabl_tel.htm");

// Файл HTM можно открывать также с пом MS_WORD: System.Diagnostics.Process.Start("WinWord", @"C:\Tabl_tel.htm");

}

catch (Exception Ситуация)

{ // Отчет об ошибках.

MessageBox.Show(Ситуация.Message, "Ошибка",

MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

}

}

Как видно, HTML-файл формируется с помощью строковой переменной text. Между тегами <title> и title> указано название страницы. Это текст, который браузер покажет в заголовке окна.

Тег <table> указывает на начало таблицы, между тегами <caption> и caption> расположено название таблицы. Далее в пошаговом цикле for форми­руется каждая строка таблицы. Используется уже известный читателю String.Format, т. е. вместо фигурной скобки {0} подставляется элемент массива

Imena [ i ], а вместо {1}Tel [ i ].

Затем, создавая поток писатель, сохраняем на диск текстовый файл C:\Tabl_tel.htm. Далее в блоке try. . .catch открываем этот файл с помощью браузера Internet Explorer.

Результат работы программы приведен на рис. 7.4.



Рис. 7.4. Вывод таблицы в браузер

Очень технологично открыть созданный НТМ-файл не Web-браузером, а тек­стовым редактором MS Word, т. е. в программном коде написать: System.Diagnostics.Process.Start("WinWord", @"C:\Tabl_tel.htm")

В этом случае пользователь вашей программы будет иметь возможность редак тировать полученную таблицу. Убедиться в работоспособности программы можно, открыв решение Табл_НТМ.sln в папке Табл_НТМ.

Пример 47. Формирование таблицы с помощью элемента управления DataGridView

Создадим приложение, которое заполняет два строковых массива и выводит эти массивы на экран в виде таблицы, используя элемент управлении DataGridView (просмотр сетки данных). Элемент управления DataGridView предназначен для просмотра таблиц с возможностью их редактирования.

Запускаем Visual Studio 2010, далее — новый проект и выбираем шаблон Windows Forms Application C#, при этом получаем стандартную форму. Перенесем в форму элемент управления DataGridView (Сетка данных) из панели Toolbox В данной программе два уже знакомых читателю массива Imena[] и теl[] выво­дятся на сетку данных DataGridView. Для максимального упрощения программе формируем таблицу сразу после вызова процедуры InitializeComponent. Текст программы приведен в листинге 7.5.

Листинг 7.5. Формирование таблицы с помощью элемента управления DataGridView

// Программа заполняет два строковых массива и выводит эти массивы в виде таблицы, используя элемент управления

//DataGridView (Сетка данных). Элемент управления DataGridView предназначен для просмотра таблиц c возможностью их //редактирования

using System;

using System. Drawing;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace TaблGrid

{

public partial class Form1: Form

{

public Form1()

{

InitializeComponent();

base.Text = "Формирование таблицы";

String[] Imena = {"Андрей - раб", "Света-Х", "ЖЭК", "Справка по тел", "Александр Степанович",

"Мама - дом", "Карапузова Таня", "Погода сегодня", "Театр Браво"};

String[] Tel = {"274-88-17", "+38(067)7030356", "22-345-72", "009", "223-67-67 доп 32-67", "570-38-76", "201-72-23-прямой моб", "001", "216-40-22"};

// Создание объекта "таблица данных"

DataTable Таблица = new DataTable();

// Заполнение "шапки" таблицы

Таблица.Columns.Add("Имена");

Таблица.Columns.Add("Номера телефонов");

// Заполнение клеток (ячеек) таблицы данных

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

Таблица. Rows. Add (new String[] { Imena [i], Tel[i] });

// Для сетки данных указываем источник данных

dataGridView1.DataSource = Таблица;

}

}

}

Как видно, в программе используется объект таблица данных DataTable. С его помощью сначала заполняем "шапку" таблицы данных, используя метод Columns.Add, а затем непосредственно ячейки таблицы, используя метод Rows.Add.

Чтобы передать построенную таблицу в элемент управления DataGridView указываем в качестве источника данных DataSource объект таблица класca DataTable.



Рис. 7.5. Форматирование таблицы

На рис. 7.5 приведен результат работы программы. Заметьте, щелкая мышью нa заголовках колонок, получаем сортировку данных в алфавитном порядке полей таблицы.

Убедиться в работоспособности программы можно, открыв решение Табл.Grid.sln в папке ТаблGrid.

Пример 48. Табличный ввод данных. DataGridView. DataTable. DataSet. Инструмент для создания файла XML

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

Мы предлагаем для цели ввода табличных данных использовать элемент управления DataGridView (Сетка данных). Прежде всего, этот элемент управления предназначен для отображения данных, которые удобно представить в виде таблицы, чаще всего источником этих данных является база данных. Однако кроме отображения DataGridView позволяет также редактировать табличные данные. Элмент управления DataGridView поддерживает выделение, изменение, удаление, разбиение на страницы и сортировку.

Программа, обсуждаемая в данном разделе, предлагает пользователю заполнить таблицу телефонов его знакомых, сотрудников, родственников, любимых и т.д. После щелчка на кнопке Запись данная таблица записывается на диск в формате XML. Для упрощения текста программы предусмотрена запись в один и тот же файл C:\tabl.xml. При последующих запусках данной программы таблица будет считываться из файла, и пользователь может продолжать редактирование таблицы. Поэтому эту программу можно громко назвать табличным редактором. Щелкая мышью на заголовках колонок, можно расположить записи в колонках в алфавитном порядке для удобного поиска необходимого телефона.

Для написания программы требуется из панели управления Toolbox перенести мышью элементы управления: сетка данных DataGridView и кнопка Button. Текст программы приведен в листинге 7.6.

Листинг 7.6. Заполнение телефонной книги

// Программа предлагает пользователю заполнить таблицу телефонов его знакомых,

// сотрудников, родственников, любимых ит. д. После щелчка на кнопке Запись

// данная таблица записывается на диск в файл в формате XML. Для упрощения

// текста программы предусмотрена запись в один и тот же файл C:\tabl.xml.

// При последующих запусках данной программы таблица будет считываться

// из этого файла, и пользователь может продолжать редактирование таблицы

using System;

using System.Data;

using System.Windows. Forms ;

// Другие директивы using удалены, поскольку они не используются вданной программе

namespace ТаблВвод

{

public partial class Form1: Form

{

DataTable Таблица = new DataTable(); // Создание объекта "таблица данных"

DataSet НаборДанных = new DataSet(); // Создание объекта "набор данных"

public Form1()

{

InitializeComponent();

base.Text = "Почти табличный редактор";

button1.Text = "Запись";

if (System.IO.File.Exists(@"C:\tabl.xml") == false)

{ // Если XML-файла НЕТ:

dataGridView1.DataSource = Таблица;

// Заполнение "шапки" таблицы

Таблица.Columns.Add("Имена");

Таблица.Columns.Add("Номера телефонов");

// Добавить объект Таблица в DataSet

НаборДанных.Tables.Add(Таблица);

}

else // Если XML-файл ЕСТЬ:

{

НаборДанных.ReadXml(@"С:\tabl.xml");

// Содержимое DataSet в виде строки XML для отладки:

string СтрокаХМL = НаборДанных.GetXml();

dataGridView1.DataMember = "Название таблицы";

dataGridView1.DataSource = НаборДанных;

}

}

private void button1_Click(object sender, EventArgs e)

{ // Сохранить файл tabl.xml:

Таблица.TableName = "Название таблицы";

НаборДанных.WriteXml(@"C:\tabl.xml");

}

}

}

Как видно из текста программы, потребовалось всего лишь несколько строк программного кода для создания такой многофункциональной программы. Это cтало возможным благодаря использованию мощной современной технологии ADO.NET. В начале класса объявлены два объекта этой технологии: набор данных Dataset и таблица данных DataTable. Объект класса DataSet является основным компонентом архитектуры ADO.NET. DataSet представляет кэш данных, располо­женный в оперативной памяти. DataSet состоит из коллекции объектов класса DataTable. То есть в один объект класса DataSet может входить несколько таблиц, a информацию о них мы можем записывать в файл на диск одним оператором WriteXml, соответственно читать — ReadXML. Таким образом, в этой программе мы имеем дело преимущественно с тремя объектами: DataSet— кэш данных. )DataTable— представляет одну таблицу с данными и DataGridview— элемент у правления для отображения данных.

Сразу после инициализации компонентов формы мы обработали две ситуации. Если файла, в который мы сохраняем информацию о таблице, не существует Еxists("C:\\tabi.xml") == false, то назначаем в качестве источника данных )DataSource для DataGrid объект класса DataTable и заполняем "шапку" таблицы, т. е. указываем названия колонок: "Имена" и "Номера телефонов", а затем добавляем объект DataTable в объект с DataSet. Теперь пользователь видит пустую таблицу с двумя колонками и может ее заполнять. Если файл существует( ветвь else ), то данные в объект DataSet отправляем из XML-файла (ReadXML). Здесь уже в качест­ве источника данных для сетки данных DataGrid указываем объект DataSet.

При щелчке мышью на кнопке Запись (рис. 7.6)— событие button1 .clickпроисходит запись XML-файла на диск (WriteXml).



Здесь используются так называемые ХML- файлы. Формат этих файлов позволяет легко и надежно передавать данные посредством Интернета даже на компьютеры другой платформы ( например, Macintosh). В нашей задаче мы не ставили перед собой цель работать в Интернете, а всего лишь воспользовались данной технологией. Файл формата XML можно просмотреть Блокнотом или с помощью MS Word, поскольку это текстовый файл. Однако следует учесть, что этот файл записан в кодировке UTF-8, поэтому другими текстовыми редакторами, например edit.com или Rpad32.exe (русский Блокнот), его прочитать затруднительно. XML-документ открывается Web-браузером, XML-editor (входит в состав Visual Studio 2010), MS Office SharePoint Designer, MS Front Page и другими программами. При этом отступы и разные цвета позволяют выразительно увидеть структуру дан­ного файла. XML-файл можно открыть табличным редактором MS Excel, и при этом он может отобразиться в виде таблицы. На рис. 7.7 приведен образец пред­ставления XML-файла в MS Word.

При использовании нами XML-файлов для данной задачи программирования простейшего табличного редактора совсем необязательно вникать в его структуру, тем более что при выборе имени файла для сохранения совершенно необязательно Устанавливать расширение файла xml, файл с любым расширением будет читаться Методом ReadXml, как XML-файл.

Программист может иметь доступ к полям таблицы. Например, доступ к левой верхней ячейке (полю) таблицы можно получить,, используя свойство объекта класса DataTable: Таблица.Rows.Item(0).Item(0). Однако запись этого поля, например, в последовательный файл будет некорректной даже при использовании дополнительной переменной из-за того, что технология ADO.NET предусматривает кэширование данных. Таким образом, чтение и запись данных для подобных лиц следует организовывать только через методы объекта DataSet.



Рис. 7.7. Образец представления XML-файла в MS Word

Замечу, что данная программа может также являться инструментом для созда­ния XML-файлов. Убедиться в работоспособности программы можно, открыв ре­шение ТаблВвод-sln в папке ТаблВвод.

Пример 49. Решение системы линейных уравнений. Ввод коэффициентов через DataGridView

В инженерном деле, в экономических, научных расчетах часто встречается за­дача по решению системы линейных алгебраических уравнений (СЛАУ). Между тем, решение данной задачи последнее время редко приводится в книгах по языкам программирования. Данная программа приглашает пользователя ввести в текстовое поле количество неизвестных (т. е. размерность системы). Если пользователь спра­вился с этим заданием, то это текстовое поле становится недоступным и появляется элемент управления сетка данных DataGridView, куда пользователь имеет воз­можность ввести коэффициенты линейных уравнений и свободные члены. При целчке на кнопке Решить программа проверяет корректность введенных данных (не должно быть нечисловых символов, количество строк в матрице коэффициентов должно быть равно количеству неизвестных). Далее происходит непосредст­венное решение введенной системы методом Гаусса и вывод результатов вычисле­ний с помощью MessageBox.

Таким образом, пользовательский интерфейс будет состоять (см. рис. 7.8) из формы, метки Label, текстового поля TextBox, элемента управления DataGridView и кнопки Button. В листинге 7.7 приведен программный код решения задачи.



Рис. 7.8. Фрагмент табличного ввода данных

Листинг 7.7. Решение системы линейных уравнений

// Программа для решения системы линейных уравнений. Ввод коэффициентов

// предусмотрен через DataGridView

using System;

using System.Data;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace ГayccGrid

{

Public partial class Form1 : Form

{

int n; // - размерность СЛАУ

DataTable dt = new DataTable();

public Form1()

{

InitializeComponent();

base.Text = "Решение системы уравнений";

// Чтобы при старте программы фокус находился в текстовом поле:

textBox1.Tablndex = 0;

dataGridView1.Visible = false; // сетку данных пока не видно
ргlabel1.Text = "Ведите количество неизвестных:";

button1.Text = "Ввести"; // первоначальная надпись на кнопке

}

private void button1_Click(object sender, EventArgs e)

{

double[,] A = new double[n, n]; // - матрица коэффициентов

double[] L = new double[n]; // - вектор свободных членов

int i, j; bool Число_ли = false;

string tmp; // - временная рабочая переменная

if (button1.Text == "Ввести")

{

for (; ; )

{ // Бесконечный цикл, пока пользователь не введет именно число:

Число_ли = int.TryParse(textBox1.Text,

System.Globalization.NumberStyles.Integer,

System.Globalization.NumberFormatlnfo.Currentlnfо, out n) ;

if (Число_ли == false) return;

button1.Text = "Решить";

textBox1.Enabled = false; // теперь текстовое поле недоступно

dataGridView1.Visible = true; // сетку данных теперь уже видно

dataGridView1.DataSource = dt;

// Создаем "шапку" таблицы

for (i = 1; i <= n; i++)

{

tmp = "X" + Convert.ToString(i);

dt.Columns.Add(new DataColumn(tmp));

}

// Колонка правой части системы:

dt.Columns.Add(new DataColumn(" L"));

return;

}

}

else // buttonl.Text == "Решить")

{ // Нажали кнопку "Решить"

// dt.Rows.Count - количество рядов

if (dt.Rows.Count != n)

{

MessageBox.Show("Количество строк не равно количеству колонок");

return;

}

// Заполнение матрицы коэффициентов системы A[j, i]

for (j = 0; j <= n - 1; j++)

{

for (i = 0; i <= n - 1; i++)

{

A[j, i] = ВернутьЧисло(j, i, ref Число_ли);

if (Число_ли == false) return;

}

// Правая часть системы B(j, 0)

L[j] = ВернутьЧисло(j, i, ref Число_ли);

if (Число_ли == false) return;

} // j

}

gauss(n, A, ref L); // Решение системы A*x = L методом Гаусса

// L - вектор свободных членов системы, сюда же возвращается

// решение х

string s = "Неизвестные равны:\n";

for (j = 1; j <= n; j++)

{

tmp = L[j - 1].ToString();

s = s + "X" + j.ToString() + " = " + tmp + ";\n";

}

MessageBox.Show(s);

}

private void gauss(int n, double[,] A, ref double[] LL)

{ // n - размер матрицы

//A - матрица коэффициентов Линейных уравнений

// LL - правая часть, сюда возвращаются значения неизвестных

int i, j, 1=0;

Double c1, c2, c3;

for (i = 0; i <= n - 1; i++) // цикл по элементам строки

{

c1 = 0;

for (j = i; j <= n - 1; j++)

{

c2 = A[j, i];

if (Math.Abs(c2) > Math.Abs(c1))

{

1 = j; c1 = c2;

}

}

for (j = i; j <= n - 1; j++)

{

сЗ = A[1, j] / c1;

A[l, j] = A[i, j]; A[i, j] = c3;

} // j
c3 = LL[1] / c1; LL[1] = LL[i]; LL[i] = c3;

for (j = 0; j <= n - 1; j++)

{

if (j == i) continue;

for (1 = i + 1; 1 <= n - 1; 1++)

{

A[j, 1] = A[j, 1] - A[i, 1] * A[j, i] ;

} // 1

LL[j] = LL[j] - LL [i] * A[j, i] ;

} // j

} // i

}

private double ВернутьЧисло(int j, int i, ref bool Число_ли)
{ // j - номер строки, i - номер столбца

double rab; // - рабочая переменная

string tmp = dt .Rows [j][i].ToString ();

Число_ли = Double.TryParse(tmp, Sys tern.Globalization.NumberStyles.Number, System.Globalization.NumberFormatlnfo.Currentlnfo, out rab);

if (Число_ли == false)

{

tmp = String.Format("Номер строки {0}, номер столбца " +

"{1},\п в данном поле - не число", j + 1, i + 1)Mes sageBox.Show(tmp);

}

return rab;

}

}

}

Как видно их программного кода, при начальной загрузке программы польза ватель не видит (visible = false) сетку данных, а первоначальная надпись нa кнопке — "Ввести". При щелчке на кнопке, если пользователь корректно ввел количество неизвестных, меняем надпись на кнопке (она теперь будет "Решить"), по количеству неизвестных подготавливаем "шапку" таблицы и размерность сетки данных, куда пользователь будет вводить коэффициенты линейных уравнений и свободные члены.

После ввода коэффициентов и щелчка на кнопке Решить происходит проверка количества введенных рядов коэффициентов и проверка на нечисловые символы. После этого вызывается процедура решения СЛАУ методом Гаусса gauss, т. е. методом последовательного исключения неизвестных. В основе процедуры gauss — цикл for по элементам строки матрицы системы. В этот внешний цикл вложены три внутренних цикла по строкам матрицы. После вызова процедуры gauss форми­руется строковая переменная s для вывода значений неизвестных, которая выво­дится посредством диалогового окна MessageBox (рис. 7.9).



Рис. 7.9. Вывод неизвестных значений в диалоговое окно

Данная программа не предусматривает проверку на вырожденность СЛАУ, од­нако в этом случае в качестве значений неизвестных пользователь получает либо "бесконечность", либо константу NaN, значение которой является результатом де­ления на ноль. Программа не предусматривает ограничение сверху на размерность решаемой системы и должна работать при любой разумной размерности. Работа программы должна быть ограничена лишь размером оперативной памяти. Однако автор не тестировал эту программу на решение систем большой размерности. Если количество неизвестных равно одному, то программа также нормально функцио­нирует.

Убедиться в работоспособности программы можно, открыв решение ГаусcGrid.sln в папке ГayccGrid.



написать администратору сайта