Beispiel #1
0
 //Вызов сортировки
 private void сортироватьToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (currFilename == "")
     {
         MessageBox.Show("Файл не выбран");
     }
     else
     {
         //Если файл выбран
         float  cost;
         string r = Interaction.InputBox("Введите максимальную стоимость конфет");
         if (float.TryParse(r, out cost))
         {
             //Очищаем поле от предыдущего резульата сортировки
             textBox2.Clear();
             //Обновляем файл, который будем сортировать в соотвестии с textbox
             Sweets.PutToFile(textBox1, currFilename);
             //Создаем объект сортирощика
             Sorter s = new Sorter(5);
             //Сортировка
             resFileName = s.Sort(currFilename, cost);
             //Отображение результата
             Sweets.ReadAllFromFile(textBox2, resFileName);
         }
     }
 }
Beispiel #2
0
        //Первый проход, из основоного файла распределяем тольео те объекты, которые подходят по условию
        void FirstMerge(string FileName, float max)
        {
            //Массив потоков для записи
            StreamWriter[] writers = new StreamWriter[CountOfFiles];
            for (int i = 0; i < writers.Length; ++i)
            {
                writers[i] = new StreamWriter((i + 1).ToString(), false);
            }
            //индекс потока записи в который записываем
            int pos = 0;
            //Буфер
            Sweets buf = new Sweets();

            //Чтение файла
            using (StreamReader reader = new StreamReader(FileName))
            {
                //Пока считывание корректно, проверяем условие и, если совпало,
                //записываем в вспомогательный файл и переходим к след. файловому потоку
                while (Sweets.TryRead(buf, reader))
                {
                    if (buf.Cost < max)
                    {
                        buf.WriteStream(writers[pos]);
                        pos = (pos + 1) % CountOfFiles;
                    }
                }
            }
            //Закрываем потоки для записи
            for (int i = 0; i < writers.Length; ++i)
            {
                writers[i].Close();
            }
        }
Beispiel #3
0
        //Слияние
        int Merge()
        {
            //pos - индекс потока, в который записываем
            int pos = 0, p = 0;
            //Кол-во проходов до конца всех файлов
            int countofiterations = 0;

            //Открываем файловые потоки
            OpenFiles();
            //
            do
            {
                //С каждого потока чтения берем по 1 объекту
                CurrSweets = new List <Sweets>();
                for (int i = 0; i < FirstGroupOfStreams.Count; ++i)
                {
                    CurrSweets.Add(FirstGroupOfStreams[i].GetNext());
                }
                //Получаем индекс минимального
                p = Sweets.GetMin(CurrSweets);
                //Пока есть хотя бы 1 не null получаем индекс минимального
                while (p != -1)
                {
                    //Записываем в поток чтения
                    CurrSweets[p].WriteStream(SecondGroupOfStreams[pos]);
                    //Ставим на место записанного след объект из этого файла
                    CurrSweets.RemoveAt(p);
                    CurrSweets.Insert(p, FirstGroupOfStreams[p].GetNext());
                    //Если файл окончен, закрываем файловый поток, удаляем его из списка и удаляем объект из списка
                    if (CurrSweets[p] == null && FirstGroupOfStreams[p].IsEndOfFile)
                    {
                        CurrSweets.RemoveAt(p);
                        FirstGroupOfStreams[p].Close();
                        FirstGroupOfStreams.RemoveAt(p);
                    }
                    //Берем следующий минимальный
                    p = Sweets.GetMin(CurrSweets);
                }
                //Увеличиваем кол-во проходов
                ++countofiterations;
                //Переходим к следующему потоку записи для обработки след. серии
                pos = (pos + 1) % CountOfFiles;
                //Сбрасываем внутри аотоков для чтения считанные блоки
                Reset();
            } while (!IsFilesFinished());
            //Если Кол-во проходов ==1, сортировка завершена, сохраняем имя файла с финальной последовательностью
            if (countofiterations == 1)
            {
                finalFilename = finishFileNames[pos == 0 ? CountOfFiles - 1 : pos - 1];
            }
            //Закрываем файлы
            CloseFiles();
            return(countofiterations);
        }
Beispiel #4
0
 public static void PutToFile(TextBox text, string FileName)
 {
     using (StreamWriter writer = new StreamWriter(FileName, false))
     {
         string[] s = text.Text.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
         Sweets   buf;
         for (int i = 0; i < s.Length; ++i)
         {
             buf = new Sweets(s[i]);
             buf.WriteStream(writer);
         }
     }
 }
Beispiel #5
0
        //Чтение\запись набора объектов в\из textbox
        public static void ReadAllFromFile(TextBox text, string FileName)
        {
            text.Clear();

            using (StreamReader reader = new StreamReader(File.OpenRead(FileName)))
            {
                Sweets buf = new Sweets();
                while (TryRead(buf, reader))
                {
                    text.Text += buf.ToString() + Environment.NewLine;
                }
            }
        }
Beispiel #6
0
        private void открытьToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();

            openFile.Filter = "BIN файлы (*.bin)|*.bin";
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                //При открытии нового файла чистим все textbox и отображаем содержимое
                textBox1.Clear();
                textBox2.Clear();
                currFilename = openFile.FileName;
                Sweets.ReadAllFromFile(textBox1, currFilename);
            }
        }
Beispiel #7
0
 private void сохранитьОтсортированыыйToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (currFilename == "")
     {
         MessageBox.Show("Нет файла для сохранения");
     }
     else
     {
         SaveFileDialog saveFile = new SaveFileDialog();
         saveFile.Filter = "BIN файлы (*.bin)|*.bin";
         if (saveFile.ShowDialog() == DialogResult.OK)
         {
             Sweets.PutToFile(textBox2, saveFile.FileName);
         }
     }
 }
Beispiel #8
0
        //Попытка получить следующий объект из потока,
        //если считана вся серия или дошли до конца файла - возвращаем null, иначе - считываем,
        //увеличиваем кол-во считанных блоков и возвращаем объект
        public Sweets GetNext()
        {
            Sweets res = null;

            if (!IsEndOfFile && !IsMaxRecordsRead)
            {
                res = new Sweets();
                if (Sweets.TryRead(res, reader))
                {
                    ReadBlocks++;
                }
                else
                {
                    res = null;
                }
            }
            return(res);
        }
Beispiel #9
0
 //Попытка чтения из потока
 public static bool TryRead(Sweets sweets, StreamReader reader)
 {
     //Если конец потока - false
     if (!reader.EndOfStream)
     {
         //иначе читаем строку и стараемся получить информацию
         string st = reader.ReadLine();
         if (!ParseString(st, sweets))
         {
             return(false);
         }
         else
         {
             return(true);
         }
     }
     else
     {
         return(false);
     }
 }
Beispiel #10
0
 //попытка распарсить строку
 static bool ParseString(string st, Sweets res)
 {
     //Для корректного четния должна поступить строка в формате
     //"<Наименование>, <Вес> кг, <Стоимость> руб, пр-во: <Производитель>, с <Дата> до <Дата>"
     //Делим по запятым, должно получится 5 разделов
     string[] vs = st.Split(',');
     if (vs.Length == 5)
     {
         //Исключения может возникнуть при преобразовании строки к числу
         try
         {
             res.Name = vs[0];
             string buf = vs[1].Trim();
             buf        = buf.Remove(buf.Length - 2, 2).Trim();
             res.Weight = float.Parse(buf);
             buf        = vs[2].Trim();
             buf        = buf.Remove(buf.Length - 4, 4).Trim();
             res.Cost   = float.Parse(buf);
             res.Maker  = vs[3].Trim().Remove(0, 7);
             buf        = vs[4].Replace(" годен с ", " ").Replace(" до ", " ").Trim();
             string[] dates = buf.Split(' ');
             res.MadeDate = DateTime.Parse(dates[0]);
             res.LastDay  = DateTime.Parse(dates[1]);
             return(true);
         }
         //Если данные некорректны возвращаем false
         catch
         {
             return(false);
         }
     }
     else
     {
         return(false);
     }
 }
Beispiel #11
0
 public Input(Sweets sweets)
 {
     InitializeComponent();
     Sweets = sweets;
 }