Методичка по C (987695), страница 9
Текст из файла (страница 9)
temp = dan.Split(';');
// выделение отдельных элементов массива, аргументом функции
// Split является наш разделитель ;
k = temp.Length; //определим длину введенного массива
while (temp[k - 1] == "") k--; // см. разъяснение 1
int[] x = new int[k];
//объявление массива чисел для введенных данных
for (int i = 0; i < k; i++)
//преобразование типов введенных данных
x[i] = Convert.ToInt32(temp[i]);
for (int i = 0; i < k; i++)
{ // обработка введенного массива
x[i] = x[i] * x[i];
pr *= x[i];
}
rezult.Text = "Proizv " + pr; // вывод результата
dan = "";
mas_row.Clear(); // очистка поля mas_row для вывода
for (int i = 0; i < k; i++)
dan += " " + x[i];
// накопление полученных элементов числового массива в
// переменной символьного типа, в качестве разделителя – пробел
mas_row.Text = dan; //вывод результата
}
Разъяснение 1. Если закончить последовательность вводимых данных разделителем (в нашем случае ;), то последним элементом массива temp будет пустая строка, которая не может быть преобразована в число. Поэтому исключим эту возможность. Если при вводе ставить два разделителя подряд, то в массиве temp будет пустая строка в середине. Что с ней делать – решать программисту!
4.4.2. Ввод/вывод и обработка одномерного массива-столбца
При вводе одномерного массива в виде столбца необходимо просто набрать значения, нажав после каждого на Enter. Нажатие на Enter после последнего значения вставит пустую строку в качестве последнего элемента. Реализация кнопки «Массив-столбец»:
private void button4_Click(object sender, EventArgs e)
{
string []st1;
int []mas;
//массивы для размещения данных
int k,pr=0;
st1=new string[mas_col.Lines.Length];
k=mas_col.Lines.Length;
mas = new int[k];
//инициируем массивы для принятия исходных данных, количество
//элементов равно количеству строк в компоненте mas_col
st1 = mas_col.Lines;
//перенесем введенный массив из компонента mas_col в массив st1
while(st1[k-1]=="") k--; //см. разъяснение 1 выше
for(int i=0;i<k;i++) // преобразование типов данных
mas[i]=Convert.ToInt32(st1[i]);
for (int i = 0; i < k; i++)
{ // обработка массива
mas[i] = 5 * mas[i];
pr += mas[i];
st1[i] = Convert.ToString(mas[i]);
// преобразование типов данных для вывода
}
mas_col.Clear(); //очистка поля вывода
mas_col.Lines = st1; // вывод результата: массива-столбца
rezult.Text="Summa Col "+pr;
}
4.4.3. Ввод/вывод и обработка двумерного массива
Перед тем, как приступить к вводу/выводу и обработке двумерного массива, введем некоторые уточнения. Очевидно, что на кнопку «Обработка и вывод двумерного массива» нет смысла нажимать пока массив не введен. Поэтому изначально пусть эта кнопка будет «серой», для чего на этапе проектирования дадим ее свойству Enabled значение False. Во-вторых, ввод и обработка двумерного массива будут в разных функциях, поэтому его необходимо объявить как переменную класса Form1 (напомним, что каждой форме соответствует класс). Найдем раздел переменных этого класса и запишем туда:
private double[,] a;
int n, m; //количество строк и столбцов
Мы по существу уже знаем, как ввести двумерный массив: он представляет собой столбец с одномерными массивами-строками. Используем в качестве разделителя ; . Предположим, что двумерный массив прямоугольный.
Реализация кнопки «Ввод двумерного массива»:
private void button1_Click(object sender, EventArgs e)
{
string[] mas; // массив для представления одной вводимой строки
string s = "";
string[] dan; //массив для представления всех введенных строк
this.button2.Enabled = true; // кнопка обработки откроется
n = mas22.Lines.Length; /* количество строк в двумерном
массиве будет равно количеству введенных строк */
dan = new string[n];
dan = mas22.Lines; //введенные строки передаем в
// массив символьных строк, одна строка – один элемент
while (dan[n - 1] == "") n--;
mas = dan[0].Split(';'); //разделим первую строку на
//элементы с помощью разделителя
m = mas.Length; // определим количество столбцов двумерного
// массива
a = new double[n, m]; // инициализация двумерного массива
for (int i = 0; i < n; i++)
{ // строка за строкой преобразуем типы данных и
// формируем числовой массив
mas = dan[i].Split(';');
for (int j = 0; j < mas.Length; j++)
a[i, j] = Convert.ToDouble(mas[j]);
} }
Реализация кнопки «Обработка и вывод двумерного массива»:
private void button2_Click(object sender, EventArgs e)
{
string[] st1 = new string[n]; // массив для
// накопления двумерного массива после обработки
double smm=0;
mas22.Clear(); //очистка поля для вывода
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{ // обработка массива
a[i, j] = 2 * a[i, j];
smm += a[i, j];
}
// цикл подготовки двумерного массива к выводу
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
st1[i]+=" "+Convert.ToString(a[i,j]);
mas22.Lines = st1; // вывод двумерного массива
rezult.Text = "Summa 2: "+Convert.ToString(smm);
}
Примечание. На рис. 4.1. форма показана после нажатия кнопок «Ввод двумерного массива» и «Обработка и вывод двумерного массива»
4.4.4. Форматированный ввод/вывод двумерного массива
Приведенные выше примеры ввода массивов легки в реализации, но требуют от пользователя большой аккуратности при наборе данных. Имеется и возможность форматированного ввода/вывода массивов. Ограничимся рассмотрением двумерного массива, упростить приводимый пример для одномерного случая не составляет труда. Рассмотрим реализацию формы, приведенной на рис. 4.3. Кроме знакомых нам компонентов занесем на форму компонент DataGridView из группы Data и дадим ему имя Gr1. Этот компонент служит для представления таблицы (по сути двумерного массива) на форме. Для внутреннего представления двумерного массива используем стандартный класс DataTable (объект Tabel).
Рис. 4.3
Разрешается, кроме класса Form1, который создается автоматический, иметь и собственные классы, но их объявления должны всегда быть после Form1. В состав класса Form1 добавим функцию InitGrid с двумя параметрами: количество строк и количество столбцов. Эта функция определяет свойства создаваемой таблицы и связывает ее с представлением на форме. Для начальной инициализации таблицы включим ее вызов в конструктор класса Form1.
namespace WA1
{
public partial class Form1 : Form
{
DataTable Tabel;
void InitGrid(int n, int m)
{
Tabel = new DataTable();
DataColumn x2 = Tabel.Columns.Add("First ", typeof(Int32));
//создание первого столбца
DataColumn x1;
for (int i = 0; i < m; i++)
{ //создание остальных столбцов
x1 = Tabel.Columns.Add("Col " + (i + 1), typeof(Int32));
x1.DefaultValue = 0;
}
for (int i = 0; i < n; i++)
{ //создание срок
DataRow y = Tabel.NewRow();
Tabel.Rows.Add(y);
Tabel.Rows[i][0] = i+1;
}
x2.ReadOnly = true; /* первый столбец для номеров, туда
нельзя ввести данные*/
Gr1.DataSource = Tabel;
}
public Form1()
{
InitializeComponent();
InitGrid(3, 4);
//создание начальной таблицы
}
private void In1_Click(object sender, EventArgs e)
{ // инициализация таблицы, ее имя Tabel
int k,n;
k = Convert.ToInt32(textBox1.Text);
// Количество столбцов
n = Convert.ToInt32(textBox2.Text);
// Количество строк
InitGrid(k, n);
}
private void First_Click(object sender, EventArgs e)
{ //обработка данных из таблицы
int sum = 0;
for (int i = 0; i < Tabel.Rows.Count ; i++)
for (int j = 1; j < Tabel.Columns.Count; j++)
sum += Convert.ToInt32(Tabel.Rows[i][j]);
rezult.Text=Convert.ToString(sum);
}
private void Second_Click(object sender, EventArgs e)
{
int y,z = 3;
for (int i = 0; i < Tabel.Rows.Count ; i++)
for (int j = 1; j < Tabel.Columns.Count; j++)
{
y = Convert.ToInt32(Tabel.Rows[i][j]);
y += z;
Tabel.Rows[i][j] = Convert.ToString(y);
}
}
private void button1_Click(object sender, EventArgs e)
{
Close();
} } }
Примечания.
-
Нумерация строк и столбцов начинается с нуля. Нулевой столбец мы используем для номеров строк, поэтому при обработке минимальное значение номеров столбцов равно единице, а номеров строк – нулю. Первая строка считается стандартной и она в нумерацию не входит.
-
Компонент DataGridView предназначен и для представления данных из баз данных (реляционных таблиц), этим и объясняется необходимость указывать для каждого столбца тип данных. Явные преобразования типов данных тем не менее обязательны!
-
На рис. 4.3. форма показана после нажатия кнопки «Сумма».
4.5. Создание многооконных приложений
Microsoft Visual Studio 2005 позволяет создавать две разновидности многооконных приложений: SDI - и MDI-приложения. SDI-приложения состоят из нескольких независимых форм (окон). По умолчанию будет создано SDI-приложение. В MDI-приложении имеется одна главная форма, остальные формы находятся в пределах главной; из главной формы можно управлять подчиненными формами. Единственное меню MDI-приложения находится в главном окне.
Перед созданием многооконного приложения его необходимо проектировать: продумать вопрос о том, какие окна нужны и что на них будет отображено. Форма – это разновидность класса. Экземпляры классов, как известно, необходимо создавать. Это правило распространяется и на формы: автоматически создается лишь одна форма – главная. Создание всех остальных форм лежит на программисте. Закрытие формы функцией Close(); или нажатием на кнопку вызывает уничтожение формы, и в случае необходимости она должна быть создана заново.
В принципе, любую задачу можно решить как с помощью SDI-приложения, так и с помощью MDI-приложения. Пожалуй, создание SDI-приложения проще. MDI-приложение можно рекомендовать при необходимости создать и работать одновременно с несколькими одинаковыми формами. Сам Microsoft Visual Studio 2005 является SDI-приложением.
4.5.1. Создание SDI-приложения
Пусть наше приложение содержит следующие формы:
-
главная форма с меню;
-
форма для определения режимов работы программы;
-
форма «О программе» (About);
-
форма для ввода исходных данных и вывода результата.
В момент запуска приложения на экране появляются первые две формы, остальные появляются при выборе соответствующего пункта меню.
Пусть меню имеет следующую структуру:
File Windows Help
Quit New About
Open Dialog
Главная форма содержит только меню, и поэтому она здесь не приводится. Форма для определения режимов работы (Form2) программы приведена на рис. 4.4.
Рис. 4.4
Две радиокнопки имеют имена rB1 и rB2; две кнопки выбора –имена cB1 и cB2; строка редактирования textBox1. Реализация единственной командной кнопки: Hide(); (убрать с экрана, но не уничтожить, в таком случае ее можно позже только открыть, нет необходимости ее заново создавать).