Итак, необходимо решить следующую задачу. Сотрудники одной конторы часто звонят по междугородней и международной связи. В конце месяца телефонная станция присылает счет за эти звонки. В свою очередь контора ведет свой учет телефонных переговоров. При подведении итогов оказывается, что два списка телефонных переговоров отличаются. Нужно выявить эти лишние переговоры для дальнейшего изучения. Проблема состоит в том, что обе организации ведут учет переговоров в разных форматах, а самих переговоров набирается несколько сотен. Необходимо написать программу, которая автоматизирует этот процесс.
Формат записей телефонной станции (ats.txt) - дата, время, продолжительность, номер исходящего телефона, номер вызываемого телефона, код звонка.
Формат записей конторы (office.txt) - дата, время, продолжительность, номер телефона.
Обратите внимание, что по крайней мере первые пять записей телефонных переговоров совпадают. Есть небольшие различия в дате приема телефонного переговора и продолжительности. Например, разница во времени первой записи составляет 40 секунд, а во второй записи разница составляет 40 секунд и разница в продолжительности разговора составляет 1 секунду. Эти телефонные переговоры считаются идентичными и нас не интересуют. Наша задача - найти "лишние" телефонные переговоры как со стороны телефонной станции, так и со стороны конторы.
Задача решается на языке C# (Visual Studio 2008).
Проект, которые служат учебным материалом для этой задачи можно скачать здесь - учебный файл.
Итак, поступило несколько предложений для разработки проекта. Во-первых, нужно создать какой-то графический интерфейс программы. Создаем новый проект, далее на форму кладем две кнопки и два списка. С помощью кнопок мы будем загружать наши текстовые файлы и выводить их в списках ListBox. Таким образом, нам нужно написать код для кнопок. Кроме того, нужно как-то совместить два разных стандарта записей в текстовых файлах к общему знаменателю. Попытаемся узнать, по какому принципу идет формирование новой записи.
У файла ats.txt сначала идут 11 строк служебной информации. Далее 19 символов отводится на дату и время. 11 символов на продолжительность звонка (цифры дополняются пробелами слева). 8 символов на номер абонента (пробел и 7-значный номер телефона). Далее идут 14 пробелов. Потом 48 символов отводится для Абонента Б (11-значный номер+пробелы). Далее один символ отводится под код звонка.
У файла конторы 21 символ отводится на дату (19 символов даты + 2 пробела). На продолжительность отводится 8 символов (2-3 символа + пробелы). Номер звонка занимает 18 символов (10, 11, 12 цифр + пробелы). Общая длина строки 47 символов.
Наша задача на будущее - перевести формат АТС в формат конторы, чтобы было удобно сравнивать два списка.
Необходим какой-то интерфейс для загрузки файла в список. Воспользуемся элементом OpenFileDialog и напишем процедуру для открытия файла.
// Процедура для выбора файла и загрузки его содержимого в список private void OpenPhoneTextFile() { oFileDiag.DefaultExt = "txt"; oFileDiag.Filter = "Текстовые файлы (*.txt)|*.txt"; DialogResult result = oFileDiag.ShowDialog(); if (result == DialogResult.OK) // Открываем файл, копируем содержимое в список, { this.Text = oFileDiag.FileName; // и так далее } }
Теперь нам необходимо загрузить сам файл в список.
// Загружаем файл АТС в список private void butLoadFileAts_Click(object sender, EventArgs e) { listAts.Items.Clear(); // очистим список string fileName = OpenPhoneTextFile(); // полное имя файла int index = 11; //номер строки, с которой начинать // Если выбран файл, то загружаем его в список if (fileName != "") { string[] allLines = System.IO.File.ReadAllLines(fileName); for (int i = index; i < allLines.Length; i++) { listAts.Items.Add(allLines[i]); } } }Это задание для следующего шага.
Жду ваших предложений.