- •Введение
- •1 Компоненты Visual C#
- •1.1 Компонент класса TextBox
- •1.2 Компонент класса Label
- •1.3 Компонент класса Button
- •1.4 Компонент класса DataGridView
- •1.5 Компонент класса NumericUpDown
- •2 Примеры выполнения практических заданий
- •2.1 Простейшие алгоритмы
- •2.2 Выражения
- •2.3 Циклы
- •2.4 Одномерные массивы
- •2.5 Матрицы
- •2.6 Строки
- •2.7 Записи и файлы
- •2.8 Функции и процедуры
2.6 Строки
Задание: Дана строка, состоящая из слов, разделенных пробелом. Сформировать одномерный массив, состоящий из слов данной строки.
Для решения поставленной задачи потребуются компоненты:
Source_L класса Label для подписи компонента Source_TB;
Source_TB класса TextBox для ввода исходной строки;
Calc_B класса Button для активизации расчета;
Dest_L класса Label для подписи компонента Dest_TB;
Dest_TB класса TextBox для вывода полученного массива слов.
Установим следующие значения свойств компонентов (таблица 9).
Таблица 9 – Значения свойств компонентов для примера выполнения задания по работе со строками
Компонент.Свойство |
Значение |
Source_L.Text |
&Исходная строка |
Calc_B.Text |
Рас&чет |
Dest_L.Text |
Полученный массив &слов |
Dest_TB.Multilines |
true |
Dest_TB.ReadOnly |
true |
Dest_TB.ScrollBars |
Vertical |
|
|
Опишем событие Click кнопки Calc_B:
private void Calc_B_Click(object sender, EventArgs e)
{
string s;
string[] mas = new string[0]; // Размер массива не известен
/* Получение исходной строки */ s = Source_TB.Text;
/* Переменная start указывает на начала обрабатываемого
слова. Если ее значение равно "-1", то никакое слово не обрабатывается */
int start = -1;
{Установка начального количества слов в "0"} int n = 0;
/* Организация цикла по перебору символов строки */ for (int i=0; i<s.Length; i++)
if (s[i] == ' ') // Текущий символ пробел
{
if (start != -1) // Имеется текущее слово
{
/* Увеличение количества найденных слов и изменение размерности массива */
Array.Resize(ref mas, ++n); mas[n-1] = s.Substring(start,
20
|
i-start); // Копирование слова |
start = -1; |
// Текущих слов нет |
} |
|
} |
|
else |
// Текущий символ не пробел |
if (start == -1) // Текущих слов нет |
|
start = i; |
// Запоминание позиции текущего слова |
if (start != -1) |
// Имеется текущее слово |
{ |
|
/* Увеличение количества найденных слов и изменение размерности массива */
Array.Resize(ref mas, ++n);
/* Копирование последнего слова */
mas[n-1] = s.Substring(start, s.Length-start);
}
/* Вывод массива слов */
Dest_TB.Clear(); // Очистка компонента вывода for (int i = 0; i < n; i++)
Dest_TB.AppendText(mas[i] + "\n"); // Добавление строк
end;
Внешний вид и пример работы программы показаны на рисунке 6.
Рисунок 6 – Внешний вид и пример работы программы, реализующей обработку строк
2.7 Записи и файлы
Задание: Картотека содержит данные о людях: фамилия, года рождения, количество детей. Составить программы, использующие для хранения данных о человеке тип «запись» и обеспечивающие:
а) ввод данных о людях и запись их в двоичный файл;
21
б) чтение данных из файла, вывод прочитанных данных, а также данных о человеке, имеющим наибольшее количество детей среди людей, родившихся позднее заданного года.
Будем считать, что максимальное количество людей – 100, заданный год лежит в диапазоне 1900÷2010, а начальное значение года – 1980. Примем в качестве имени файла для записи и чтения название «data.dat».
Для решения поставленной задачи потребуются компоненты:
Count_L класса Label для подписи компонента Count_NUD;
Count_NUD класса NumericUpDown для задания количества людей;
PeoplesSave_L класса Label для подписи компонента
PeoplesSave_DGV;
PeoplesSave_DGV класса DataGridView для ввода данных о людях;
Save_B класса Button для активизации записи данных в файл;
Year_L класса Label для подписи компонента Year_NUD;
Year_NUD класса NumericUpDown для задания заданного года;
Load_B класса Button для активизации чтения данных из файла и вы-
полнения поиска человека.
PeoplesLoad_L класса Label для подписи компонента
PeoplesLoad_DGV;
PeoplesLoad_DGV класса DataGrigView для вывода считанных из фай-
ла данных о людях;
Find_L класса Label для подписи компонента Find_DGV;
Find_DGV класса DataGridView для вывода данных о найденном чело-
веке.
Установим следующие значения свойств компонентов (таблица 10);
Таблица 10 – Значения свойств компонентов для примера выполнения задания по работе с записями и файлами
Компонент.Свойство |
Значение |
Count_L.Text |
Количество &людей |
Count_NUD.Minimum |
1 |
Count_NUD.Maximum |
100 |
Count_NUD.Value |
1 |
|
|
PeoplesSave_L.Text |
С&писок людей для записи |
PeoplesSave_DGV.AllowUserToAddRows |
false |
|
|
PeoplesSave_DGV.AllowUserToDeleteRows |
false |
|
|
PeoplesSave_DGV.RowHeadersVisible |
false |
Save_B.Text |
З&аписать |
Year_L.Text |
Заданный &год |
Year_NUD.Minimum |
1900 |
Year_NUD.Maximum |
2010 |
Year_NUD.Value |
1980 |
22
Продолжение таблицы 10
Компонент.Свойство |
Значение |
Load_B.Text |
П&рочитать и найти |
PeoplesLoad_L.Text |
С&читанный список людей |
PeoplesLoad_DGV.AllowUserToAddRows |
false |
PeoplesLoad_DGV.AllowUserToDeleteRows |
false |
PeoplesLoad_DGV.RowHeadersVisible |
false |
PeoplesLoad_DGV.ReadOnly |
true |
|
|
Find_L.Text |
На&йденный человек |
Find_DGV.AllowUserToAddRows |
false |
|
|
Find_DGV.AllowUserToDeleteRows |
false |
|
|
Find_DGV.RowHeadersVisible |
false |
Find_DGV.ReadOnly |
true |
В таблицах PeoplesSave_DGV, PeoplesLoad_DGV, Find_DGV с помощью
встроенного редактора необходимо задать по три столбца, имеющих следующие значения свойства HeaderText: «Фамилия», «Год рождения», «К-во детей».
Чтобы при старте программы в таблицах отображалось начальное количество строк, опишем событие Load формы (идентификатор формы – Main_F):
private void Main_F_Load(object sender, EventArgs e)
{
PeoplesSave_DGV.RowCount = Convert.ToInt32(Count_NUD.Value); PeoplesLoad_DGV.RowCount = 1;
Find_DGV.RowCount = 1;
}
Опишем событие ValueChanged компонента Count_NUD:
private void Count_NUD_ValueChanged(object sender, EventArgs e)
{
PeoplesSave_DGV.RowCount = Convert.ToInt32(Count_NUD.Value);
}
Опишем тип данных для хранения информации об одном человеке. Тип данных должен быть описан в блоке namespace ... перед описанием класса
Main_F.
struct TPeople
{
public string LastName; public int BirthYear; public int CountChild;
}
23
Для работы с файлами необходимо подключить дополнительное пространство имен:
using System.IO;
Опишем событие Click кнопки Save_B (программа «а)»):
private void Save_B_Click(object sender, EventArgs e)
{
TPeople people;
/* Создание и открытие двоичного файла для записи */ using (BinaryWriter bw = new BinaryWriter(
File.Open("data.dat", FileMode.Create)))
{
for (int i=0; i<PeoplesSave_DGV.RowCount; i++)
{
/* Получение данных о i-ом человеке*/ people.LastName = Convert.ToString(
PeoplesSave_DGV[0,i].Value); people.BirthYear = Convert.ToInt32(
PeoplesSave_DGV[1,i].Value); people.CountChild = Convert.ToInt32(
PeoplesSave_DGV[2,i].Value); /* Запись данных о i-ом человеке */ bw.Write(people.LastName); bw.Write(people.BirthYear); bw.Write(people.CountChild);
}
}
}
Опишем событие Click кнопки Load_B (программа «б)»):
private void Load_B_Click(object sender, EventArgs e)
{
/* Создадим массив людей */ TPeople[] peoples = new TPeople[0];
int i,n = 0; // n – количество считанных данных
/* Задание имени файла и открытие на чтение */ using (BinaryReader br = new BinaryReader(
File.Open("data.dat", FileMode.Open)))
{
/* Организация цикла считывания данных. Считывание осуществляется до конца файла */
while (br.PeekChar() != -1)
{
/* Увеличение количества считанных данных и изменение размера массива */
Array.Resize(ref peoples, ++n); {Считывание новых данных} peoples[n-1].LastName = br.ReadString(); peoples[n-1].BirthYear = br.ReadInt32();
24
peoples[n-1].CountChild = br.ReadInt32();
}
}
/* Установка количества с трок в таблице для считанных данных */
PeoplesLoad_DGV.RowCount = n; {Вывод считанных данных}
for (i=0; i<n; i++)
{
PeoplesLoad_DGV[0, i].Value = peoples[i].LastName; PeoplesLoad_DGV[1, i].Value = peoples[i].BirthYear; PeoplesLoad_DGV[2, i].Value = peoples[i].CountChild;
}
/* Получение заданного года */
int year = Convert.ToInt32(Year_NUD.Value);
/* Будем считать, что значение min_index либо равно "-1",
если ни одного человека не найдено, либо хранит номер текущего найденного человека */
int min_index = -1;
/* Перебор всех людей */ for (i=0; i<n; i++)
/*Проверка, соответствует ли год рождения i-го человека заданному условию */
if (peoples[i].BirthYear > year)
/* Проверка, были ли ранее найден подходящий человек */ if (min_index == -1)
/* Ранее не был найден подходящий человек. Запоминаем его номер */
min_index = i;
else // Ранее был найден подходящий человек
/* Проверка, имеет ли вновь найденный человек большее
количество детей, чем найденный ранее */ if (peoples[i].CountChild >
peoples[min_index].CountChild)
min_index = i; // Запоминание номера человека /* Проверка, найден ли подходящий человек */
if (min_index != -1)
{
/* Подходящий человек найден. Вывод данных о найденном человеке */
Find_DGV[0,0].Value = peoples[min_index].LastName; Find_DGV[1,0].Value = peoples[min_index].BirthYear; Find_DGV[2,0].Value = peoples[min_index].CountChild;
}
else
{
/* Подходящий человек не найден. Вывод сообщения, что
никто не найден, и очистка оставшихся ячеек */ Find_DGV[0,0].Value = "Не найден"; Find_DGV[1,0].Value = "";
Find_DGV[2,0].Value = "";
25