Базы данных для карманного персонального компьютера

Поиск в текстовых файлах

Разбить на страницы
Показывать лекцию целиком

Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих загрузку данных из текстового файла в форму для просмотра, поиска и выборки записей по ключу, добавление и сохранение данных в текстовом файле.

Разработка: Приложение "Поиск записей в текстовом файле" для автоматического подсчета средней зарплаты в выборке.

Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, закрыть
  • Операции с записями: добавить, найти, выбрать
  • Алгоритмы: подсчет средней зарплаты в выборке
  • Информационно-справочные: О программе
  • Наращивание функциональности не предусматривается.

    Защита данных предусматривается только от неквалифицированных действий пользователей. Редактирование – вручную с помощью редактора "Блокнот".

    В качестве входных данных используется отдельный текстовой файл Сотрудники.txt в котором хранится база данных отдела кадров предприятия. Каждая строка файла содержит запись об одном сотруднике. Формат записи: Фамилия и инициалы – 18 символов, начиная с первой позиции; год рождения – 6 позиций; оклад – неограниченно. Тип данных определяется программно. Выходные данные программы – графическое отображение результатов в виде листбоксов и набора текстовых полей экранных форм для SmartDevice.

    Шаг 1. Разработка графического интерфейса

    Для программы используются три формы, примерный дизайн которых показан на рис.3.1, 3.2 и 3.3.

    Главная форма ( Form1 ) на рис.3.1 содержит элементы:

  • 3 надписи (label) со свойствами Text: В текстовом файле Сотрудники.txt хранится база данных отдела кадров предприятия. Каждая строка файла содержит запись об одном сотруднике. Формат записи: фамилия и инициалы (18 позиций, фамилия должна начинаться с первой позиции), год рождения (6 позиций), оклад (неограничено); Программа по заданной фамилии выводит на экран сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников; (С)Родигин Л.А., 2006. Платформа MS Visual C#.Net 2003;
  • главное меню (mainMenu) с двумя опциями: "База данных" и "Новая запись".
  • Форма "База данных" (Form2) на рис.3.2 содержит элементы:

  • 5 надписей (label) со свойствами Text: Фамилия и инициалы; г.р. (год рождения); Оклад; Click для удаления (записи из выборки); Ср.оклад в выборке, у.е.;
  • 2 листбокса (listBox) – для базы данных (верхний) и для выборки данных (нижний) из базы;
  • 1 текстовое поле для ввода фамилии в качестве ключа поиска в базе данных;
  • 1 кнопку "Найти и добавить" активизации поиска и выборки данных
  • (рис 3.2) Главная форма(рис 3.1) База данных(рис 3.3) Новая запись

    Форма "Новая запись" ( Form3 ) на рис.3.3 содержит элементы:

  • 5 надписей со свойствами Text: Добавление записи в файл Сотрудники.txt; Фамилия, инициалы; Год рождения; Оклад, у.е.; Внимание. Для редактирования и удаления записей откройте файл в текстовом редакторе;
  • 3 текстовых поля ( textBox );
  • Кнопку "Добавить" для добавления записи в файл Сотрудники.txt
  • Шаг 2. Открываем форму "База данных"

    Для опции меню "База данных" ( menuItem1_Click ) пишем:

    private void menuItem1_Click(object sender, System.EventArgs e)
    {// Открываем форму базы данных 
    Form DB=new Form2();
    DB.Show(); // выводим форму на экран
    }

    Шаг 3. Открываем форму "Новая запись"

    Для опции меню "Новая запись" ( menuItem2_Click ) пишем:

    private void menuItem2_Click(object sender, System.EventArgs e)
    {// Открываем форму ввода новой записи 
    Form RW=new Form3();
    RW.Show();
    }

    Шаг 4. Расширяем состав библиотек формы 2

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    // добавляем библиотеку работы с файлами
    using System.IO;

    Шаг 5. Включаем переменные для хранения результатов вычислений в public class Form2 : System.Windows.Forms.Form

    string s_new; // переменная для хранения данных нового сотрудника
    int i_row=0; // число строк в выборке
    int i_sum=0; // сумма выборки

    Шаг 6. Загружаем данные из файла (по умолчанию)

    public Form2() {
    InitializeComponent();
    // Тестируем наличие файла с данными и создаем файл для записи значений
    FileStream fin;
    Try {
    fin=new FileStream("Сотрудники.txt",FileMode.Open);
    	}
    catch(IOException exc)	{
    MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    return;
    }
    // Считываем значения из файла
    string s;
    StreamReader fstr_in=new StreamReader(fin);
    while((s=fstr_in.ReadLine())!=null)	{
    listBox1.Items.Add(s); // заполняем верхний листбокс
    	   }
    fstr_in.Close(); // закрываем файловый поток
    }

    Шаг 7. Создаем функцию вычисления средней в выборке

    void AppListBox2() {
    // вычисляем длину выбранной строки из листбокса
    int i_len=s_new.Length;		
    string s_pay=s_new.Substring(25,i_len-25);
    i_row=i_row+1; // считаем количество строк 
    // преобразуем текст в сумму и считаем сумму выборки
    i_sum=int.Parse(s_pay)+i_sum;
    float f_sum=i_sum/i_row; // считаем среднюю
    textBox2.Text=f_sum.ToString(); // выводим среднюю в текстовое поле   
    }

    Шаг 8. Создаем процедуру выборки значения из верхнего листбокса в нижний по щелчку

    private void listBox1_SelectedIndexChanged
      (object sender, System.EventArgs e)
    {
    s_new=listBox1.SelectedItem.ToString();
    listBox2.Items.Add(s_new); // добавляем запись в листбокс2
    AppListBox2(); // вызваем функцию вычисления средней в выборке
    }

    Шаг 9. Создаем процедуру удаления записей из выборки и пересчета средней по оставшимся в выборке записям

    private void listBox2_SelectedIndexChanged
      (object sender, System.EventArgs e)
    {// если в выборке есть еще записи, которые можно удалить
    if (listBox2.SelectedItem != null) {
    // вычисляем длину выбранной строки из листбокса
    int i_len=listBox2.SelectedItem.ToString().Length;		
    string s_pay=listBox2.SelectedItem.ToString().Substring(25,i_len-25);
    // считаем количество строк 
    i_row=i_row-1;
    // преобразуем текст в сумму и считаем сумму выборки
    i_sum=-int.Parse(s_pay)+i_sum;
    // считаем среднюю
    float f_sum;
    if (i_row = = 0) {f_sum=0;}
    else	{f_sum=i_sum/i_row;}
    textBox2.Text=f_sum.ToString();
    // удаляем строки из listbox2
    listBox2.Items.Remove(listBox2.SelectedItem.ToString());
    	}
    }

    Шаг 10. Создаем процедуру поиска при активизации кнопки

    private void button1_Click(object sender, System.EventArgs e) {
    // вычисляем длину выбранной строки из TEXTбокса
    int i_len=textBox1.Text.Length;
    int i_row=listBox1.Items.Count+1;
    //цикл просмотра списка верхнего листбокса
    for(int i=0; i<listBox1.Items.Count;i++) {
    // сравниваем значения текстбокса и листбокса
    string s_name=listBox1.Items[i].ToString().Substring(0,i_len);
    if (textBox1.Text==s_name)	{i_row=i;}
    	}
    if (i_row<=listBox1.Items.Count) {
    s_new=listBox1.Items[i_row].ToString();
    listBox2.Items.Add(s_new);
    AppListBox2();
    	}
    else	{MessageBox.Show(textBox1.Text,"Не найдено");}
    }

    Шаг 11. Расширяем состав библиотек формы 3

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    // добавляем библиотеку работы с файлами
    using System.IO;

    Шаг 12. Включаем константы размеров полей базы данных в public class Form3 : System.Windows.Forms.Form

    const int l_name=18;
    const int l_year=6;

    Шаг 13. Создаем процедуру добавления записи в файл Сотрудники.txt для кнопки button1

    private void button1_Click(object sender, System.EventArgs e) {
    // Проверка значений полей
    if (textBox1.Text = = "") {
    MessageBox.Show("Введите фамилию и инициалы сотрудника!","Ошибка");
    return;
    	}
    // год рождения должен вводиться цифрами
    if (!char.IsDigit(textBox2.Text[0])) {
    textBox2.Text = "1940";
    MessageBox.Show("Введите год рождения в поле 'г.д.'!","Ошибка");
    return;
    	}
    if (!char.IsDigit(textBox3.Text[0])) {
    textBox3.Text = "0";
    MessageBox.Show("Введите цифру в поле 'Оклад'!","Ошибка");
    return;
    	}
    /* Тестируем наличие файла с данными о сотрудниках и 
      создаем файл для записи значений */
    FileStream fin;
    try {
    fin=new FileStream("Сотрудники.txt",FileMode.OpenOrCreate);
    fin.Close();	}
    catch(IOException exc)	{
    MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    return;}
    //форматируем значения
    string s_field1=textBox1.Text;
    if (s_field1.Length<l_name) {
    for (int i=s_field1.Length; i<l_name; i++)
     s_field1=s_field1+" ";
    	}
    string s_field2="|"+textBox2.Text; //  пользовательский разделитель данных!
    if (s_field2.Length<l_year) {
    for (int i=s_field2.Length; i<l_year; i++)
     s_field2=s_field2+" ";
    	}
    string s_field3="|"+textBox3.Text; //  пользовательский разделитель данных!
    StreamWriter fin_out; // открываем файл для записи
    try {fin_out=new StreamWriter("Сотрудники.txt", true);}
    catch(IOException exc)	{
    MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    return;}
    string s=s_field1+s_field2+s_field3+"\r\n";
    fin_out.Write(s);
    fin_out.Close();
    MessageBox.Show(s_field1+"\n"+s_field2+" г.р.\n"+s_field3+
    " у.е.- оклад.","Запись добавлена");
    // Обнуляем поля
    textBox1.Text="";
    textBox2.Text="1940";
    textBox3.Text="0";
    }
    Страницы:

    Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих загрузку данных из текстового файла в форму для просмотра, поиска и выборки записей по ключу, добавление и сохранение данных в текстовом файле.

    Разработка: Приложение "Поиск записей в текстовом файле" для автоматического подсчета средней зарплаты в выборке.

    Состав выполняемых функций:

  • Файловые операции: открыть, сохранить, закрыть
  • Операции с записями: добавить, найти, выбрать
  • Алгоритмы: подсчет средней зарплаты в выборке
  • Информационно-справочные: О программе
  • Наращивание функциональности не предусматривается.

    Защита данных предусматривается только от неквалифицированных действий пользователей. Редактирование – вручную с помощью редактора "Блокнот".

    В качестве входных данных используется отдельный текстовой файл Сотрудники.txt в котором хранится база данных отдела кадров предприятия. Каждая строка файла содержит запись об одном сотруднике. Формат записи: Фамилия и инициалы – 18 символов, начиная с первой позиции; год рождения – 6 позиций; оклад – неограниченно. Тип данных определяется программно. Выходные данные программы – графическое отображение результатов в виде листбоксов и набора текстовых полей экранных форм для SmartDevice.

    Шаг 1. Разработка графического интерфейса

    Для программы используются три формы, примерный дизайн которых показан на рис.3.1, 3.2 и 3.3.

    Главная форма ( Form1 ) на рис.3.1 содержит элементы:

  • 3 надписи (label) со свойствами Text: В текстовом файле Сотрудники.txt хранится база данных отдела кадров предприятия. Каждая строка файла содержит запись об одном сотруднике. Формат записи: фамилия и инициалы (18 позиций, фамилия должна начинаться с первой позиции), год рождения (6 позиций), оклад (неограничено); Программа по заданной фамилии выводит на экран сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников; (С)Родигин Л.А., 2006. Платформа MS Visual C#.Net 2003;
  • главное меню (mainMenu) с двумя опциями: "База данных" и "Новая запись".
  • Форма "База данных" (Form2) на рис.3.2 содержит элементы:

  • 5 надписей (label) со свойствами Text: Фамилия и инициалы; г.р. (год рождения); Оклад; Click для удаления (записи из выборки); Ср.оклад в выборке, у.е.;
  • 2 листбокса (listBox) – для базы данных (верхний) и для выборки данных (нижний) из базы;
  • 1 текстовое поле для ввода фамилии в качестве ключа поиска в базе данных;
  • 1 кнопку "Найти и добавить" активизации поиска и выборки данных
  • (рис 3.2) Главная форма(рис 3.1) База данных(рис 3.3) Новая запись

    Форма "Новая запись" ( Form3 ) на рис.3.3 содержит элементы:

  • 5 надписей со свойствами Text: Добавление записи в файл Сотрудники.txt; Фамилия, инициалы; Год рождения; Оклад, у.е.; Внимание. Для редактирования и удаления записей откройте файл в текстовом редакторе;
  • 3 текстовых поля ( textBox );
  • Кнопку "Добавить" для добавления записи в файл Сотрудники.txt
  • Шаг 2. Открываем форму "База данных"

    Для опции меню "База данных" ( menuItem1_Click ) пишем:

    private void menuItem1_Click(object sender, System.EventArgs e)
    {// Открываем форму базы данных 
    Form DB=new Form2();
    DB.Show(); // выводим форму на экран
    }

    Шаг 3. Открываем форму "Новая запись"

    Для опции меню "Новая запись" ( menuItem2_Click ) пишем:

    private void menuItem2_Click(object sender, System.EventArgs e)
    {// Открываем форму ввода новой записи 
    Form RW=new Form3();
    RW.Show();
    }

    Шаг 4. Расширяем состав библиотек формы 2

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    // добавляем библиотеку работы с файлами
    using System.IO;

    Шаг 5. Включаем переменные для хранения результатов вычислений в public class Form2 : System.Windows.Forms.Form

    string s_new; // переменная для хранения данных нового сотрудника
    int i_row=0; // число строк в выборке
    int i_sum=0; // сумма выборки

    Шаг 6. Загружаем данные из файла (по умолчанию)

    public Form2() {
    InitializeComponent();
    // Тестируем наличие файла с данными и создаем файл для записи значений
    FileStream fin;
    Try {
    fin=new FileStream("Сотрудники.txt",FileMode.Open);
    	}
    catch(IOException exc)	{
    MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    return;
    }
    // Считываем значения из файла
    string s;
    StreamReader fstr_in=new StreamReader(fin);
    while((s=fstr_in.ReadLine())!=null)	{
    listBox1.Items.Add(s); // заполняем верхний листбокс
    	   }
    fstr_in.Close(); // закрываем файловый поток
    }

    Шаг 7. Создаем функцию вычисления средней в выборке

    void AppListBox2() {
    // вычисляем длину выбранной строки из листбокса
    int i_len=s_new.Length;		
    string s_pay=s_new.Substring(25,i_len-25);
    i_row=i_row+1; // считаем количество строк 
    // преобразуем текст в сумму и считаем сумму выборки
    i_sum=int.Parse(s_pay)+i_sum;
    float f_sum=i_sum/i_row; // считаем среднюю
    textBox2.Text=f_sum.ToString(); // выводим среднюю в текстовое поле   
    }

    Шаг 8. Создаем процедуру выборки значения из верхнего листбокса в нижний по щелчку

    private void listBox1_SelectedIndexChanged
      (object sender, System.EventArgs e)
    {
    s_new=listBox1.SelectedItem.ToString();
    listBox2.Items.Add(s_new); // добавляем запись в листбокс2
    AppListBox2(); // вызваем функцию вычисления средней в выборке
    }

    Шаг 9. Создаем процедуру удаления записей из выборки и пересчета средней по оставшимся в выборке записям

    private void listBox2_SelectedIndexChanged
      (object sender, System.EventArgs e)
    {// если в выборке есть еще записи, которые можно удалить
    if (listBox2.SelectedItem != null) {
    // вычисляем длину выбранной строки из листбокса
    int i_len=listBox2.SelectedItem.ToString().Length;		
    string s_pay=listBox2.SelectedItem.ToString().Substring(25,i_len-25);
    // считаем количество строк 
    i_row=i_row-1;
    // преобразуем текст в сумму и считаем сумму выборки
    i_sum=-int.Parse(s_pay)+i_sum;
    // считаем среднюю
    float f_sum;
    if (i_row = = 0) {f_sum=0;}
    else	{f_sum=i_sum/i_row;}
    textBox2.Text=f_sum.ToString();
    // удаляем строки из listbox2
    listBox2.Items.Remove(listBox2.SelectedItem.ToString());
    	}
    }

    Шаг 10. Создаем процедуру поиска при активизации кнопки

    private void button1_Click(object sender, System.EventArgs e) {
    // вычисляем длину выбранной строки из TEXTбокса
    int i_len=textBox1.Text.Length;
    int i_row=listBox1.Items.Count+1;
    //цикл просмотра списка верхнего листбокса
    for(int i=0; i<listBox1.Items.Count;i++) {
    // сравниваем значения текстбокса и листбокса
    string s_name=listBox1.Items[i].ToString().Substring(0,i_len);
    if (textBox1.Text==s_name)	{i_row=i;}
    	}
    if (i_row<=listBox1.Items.Count) {
    s_new=listBox1.Items[i_row].ToString();
    listBox2.Items.Add(s_new);
    AppListBox2();
    	}
    else	{MessageBox.Show(textBox1.Text,"Не найдено");}
    }

    Шаг 11. Расширяем состав библиотек формы 3

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    // добавляем библиотеку работы с файлами
    using System.IO;

    Шаг 12. Включаем константы размеров полей базы данных в public class Form3 : System.Windows.Forms.Form

    const int l_name=18;
    const int l_year=6;

    Шаг 13. Создаем процедуру добавления записи в файл Сотрудники.txt для кнопки button1

    private void button1_Click(object sender, System.EventArgs e) {
    // Проверка значений полей
    if (textBox1.Text = = "") {
    MessageBox.Show("Введите фамилию и инициалы сотрудника!","Ошибка");
    return;
    	}
    // год рождения должен вводиться цифрами
    if (!char.IsDigit(textBox2.Text[0])) {
    textBox2.Text = "1940";
    MessageBox.Show("Введите год рождения в поле 'г.д.'!","Ошибка");
    return;
    	}
    if (!char.IsDigit(textBox3.Text[0])) {
    textBox3.Text = "0";
    MessageBox.Show("Введите цифру в поле 'Оклад'!","Ошибка");
    return;
    	}
    /* Тестируем наличие файла с данными о сотрудниках и 
      создаем файл для записи значений */
    FileStream fin;
    try {
    fin=new FileStream("Сотрудники.txt",FileMode.OpenOrCreate);
    fin.Close();	}
    catch(IOException exc)	{
    MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    return;}
    //форматируем значения
    string s_field1=textBox1.Text;
    if (s_field1.Length<l_name) {
    for (int i=s_field1.Length; i<l_name; i++)
     s_field1=s_field1+" ";
    	}
    string s_field2="|"+textBox2.Text; //  пользовательский разделитель данных!
    if (s_field2.Length<l_year) {
    for (int i=s_field2.Length; i<l_year; i++)
     s_field2=s_field2+" ";
    	}
    string s_field3="|"+textBox3.Text; //  пользовательский разделитель данных!
    StreamWriter fin_out; // открываем файл для записи
    try {fin_out=new StreamWriter("Сотрудники.txt", true);}
    catch(IOException exc)	{
    MessageBox.Show ("Невозможно открыть файл.","Ошибка");
    return;}
    string s=s_field1+s_field2+s_field3+"\r\n";
    fin_out.Write(s);
    fin_out.Close();
    MessageBox.Show(s_field1+"\n"+s_field2+" г.р.\n"+s_field3+
    " у.е.- оклад.","Запись добавлена");
    // Обнуляем поля
    textBox1.Text="";
    textBox2.Text="1940";
    textBox3.Text="0";
    }
    Вернуться к учебному плану