- •Введение
- •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 = Source_TB.Text;
/* Задание массива разделителей слов */ char[] sep = { ' ' };
/* Разделение строки на слова и сохранение слов в массиве */ string[] mas = s.Split(sep,
StringSplitOptions.RemoveEmptyEntries); /* Удаление символов цифр из каждого слова */
for (int j = 0; j < mas.Length; j++) // Перебор слов
{
int i = 0;
while (i < mas[j].Length) // Перебор символов в слове
if ((mas[j][i] >= '0') && (mas[j][i] <= |
'9')) |
||
mas[j] = mas[j].Remove(i, 1); |
// Если |
цифра, то удаление, |
|
else |
// |
иначе |
|
i++; |
// |
переход |
к следующему символу |
}
21
/* Вывод массива слов */
Dest_TB.Clear(); // Очистка компонента вывода foreach (string m in mas)
Dest_TB.AppendText(m + "\n"); // Добавление строк
}
Внешний вид и пример работы программы показаны на рисунке 6.
Рисунок 6 – Внешний вид и пример работы программы, реализующей обработку строк
2.7 Записи и файлы
Задание: Картотека содержит данные о людях: фамилия, года рождения, количество детей. Реализовать два алгоритма, использующие для хранения данных о человеке тип «запись» и обеспечивающие:
а) ввод данных о людях и запись их в двоичный файл; б) чтение данных из файла, вывод прочитанных данных, а также дан-
ных о человеке, имеющим наибольшее количество детей среди людей, родившихся позднее заданного года.
Будем считать, что максимальное количество людей – 100, заданный год лежит в диапазоне 1900÷2010, а начальное значение года – 1980. Примем в качестве имени файла для записи и чтения название «data.dat».
Для решения поставленной задачи потребуются компоненты:
Count_L класса Label для подписи компонента Count_NUD;
Count_NUD класса NumericUpDown для задания количества людей;
PeoplesSave_L класса Label для подписи компонента
PeoplesSave_DGV;
PeoplesSave_DGV класса DataGridView для ввода данных о людях;
22
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 |
|
|
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 |
|
|
23
В таблицах 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;
}
Для работы с файлами необходимо подключить дополнительное пространство имен:
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-ом человеке*/
24
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(); 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",
если ни одного человека не найдено, либо хранит номер
25