Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Программирование в среде Visual C# (Часть 1).pdf
Скачиваний:
67
Добавлен:
27.05.2015
Размер:
1.17 Mб
Скачать

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