Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в среде Visual C# (Часть 1).pdf
Скачиваний:
38
Добавлен:
27.05.2015
Размер:
1.09 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;

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