//Зчитування списку об'єктів з текстового файлу порядково public static List <CircleInscribedInSquareWithLegend> getListObjectsFromTextFile() { using (StreamReader sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\InputValues.txt")) { //Для застосування перевантаженного бінарного оператора + FiguresOnScreen figures = new FiguresOnScreen(); while (!sr.EndOfStream) //Поки не кінець файлу { String str = sr.ReadLine(); //Читаємо усю строку String[] parsingStr = str.Split(); //Відділяємо значення один від одного // і приводимо їх до відповідних типів Double.TryParse(parsingStr[0], out double x); Double.TryParse(parsingStr[1], out double y); Double.TryParse(parsingStr[2], out double radius); float.TryParse(parsingStr[3], out float length); Int32.TryParse(parsingStr[4], out int tilt); //Текст напису розбито на слова, конкатенуємо їх в одну строку String text = ""; for (int i = 5; i < parsingStr.Length; i++) { text += parsingStr[i] + " "; } text = text.TrimEnd(' ');//Видаляє пробіл з кінця Circle local = new Circle(radius, x, y); //Перевантажений бінарний оператор +, додаємо до списку новий об'єкт figures = figures + new CircleInscribedInSquareWithLegend(local, new LegendOnCircle(local, new Legend(length, text), tilt)); } return(figures.List); } }
//Функція пошуку за текстовим полем з використанням індексатора public static List <CircleInscribedInSquareWithLegend> findSubstringIn(FiguresOnScreen figures, String value) { List <CircleInscribedInSquareWithLegend> result = new List <CircleInscribedInSquareWithLegend>(); for (int i = 0; i < figures.List.Count; i++) { if (figures[i].Legend.Legend.Text.ToLower().Contains(value.ToLower())) { result.Add(figures[i]); } } return(result); }
//Функція пошуку за числовим полем з використанням індексатора public static List <CircleInscribedInSquareWithLegend> findDoubleIn(FiguresOnScreen figures, double value) { List <CircleInscribedInSquareWithLegend> result = new List <CircleInscribedInSquareWithLegend>(); for (int i = 0; i < figures.List.Count; i++) { if (figures[i].Circle.Radius == value) { result.Add(figures[i]); } } return(result); }
//Функція введення даних private void inputData() { createNewObjectWithObservers(); Console.Write("Введiть кiлькiсть об'єктiв(не бiльше за 10): "); int amount; while ((amount = Utilities.getIntFromConsole()) <= 0 || amount > 10) { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Кiлькiсть об'єктiв не може бути менше одиницi!\n"); delShowOnScreen = OutputMethod.simplyOutputOnScreen; } int i = 0; while (i < amount) { delShowOnScreen = OutputMethod.simplyOutputOnScreen; delShowOnScreen("\nЗаповнення " + (i + 1).ToString() + "-го об'екта: \n"); figures = figures + addNewObject(); i++; } }
//Головний процес, який викликатиметься в Main() public void process() { //Додання спостерігачів figures.addObserver(new ConsoleObserver()); figures.addObserver(new FileObserver()); //Очищення лог-файлу StreamWriter logFile = new StreamWriter( Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\LogFile_Observer.txt", false); logFile.Close(); int choice; do { delShowOnScreen = OutputMethod.simplyOutputOnScreen;//Передача в делегат методу, який треба викликати delShowOnScreen("Ваш вибiр: "); while ((!Int32.TryParse((Console.ReadLine()), out choice)) || (choice < 0 || choice > 9)) { delShowOnScreen = OutputMethod.errorOutputOnScreen;//Передача в делегат методу про вивід помилки delShowOnScreen("Допускаються лише цифри вiд 0 до 9\n"); } //Очищення консолі //Console.Clear(); //showMenu(); switch (choice) { case 1: { //Введення даних inputData(); //Повідомлення спостерігачам, що кількість об'єктів змінено figures.notifyObservers(figures.List.Count); break; } case 2: //Виведення даних у виглядi таблички на екран if (figures.List.Count != 0) { OutputMethod.outputOnScreen(figures.List); } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("\nДаних для виведення ще немає, натиснiть 1, щоб ввести данi.\n"); } break; case 3: //Запис об'єктiв на диск у текстовий файл //Очищення файлу StreamWriter file = new StreamWriter( Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\objects.txt", false); file.Close(); if (figures.List.Count != 0) { OutputMethod.outputInTextFile(figures.List); delShowOnScreen = OutputMethod.successOutputOnScreen; delShowOnScreen("До текстового файлу успiшно записано!\n"); } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Немає даних для запису у текстовий файл!\n"); } break; case 4: //Запис об'єктiв на диск у бiнарний файл if (figures.List.Count != 0) { OutputMethod.serializationOutputInBinaryFile(figures.List); delShowOnScreen = OutputMethod.successOutputOnScreen; delShowOnScreen("До бiнарного файлу успiшно записано!\n"); } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Немає даних для запису у бiнарний файл!\n"); } break; case 5: //Зчитування даних з текстового файлу try { figures.List = Utilities.getListObjectsFromTextFile(); delShowOnScreen = OutputMethod.successOutputOnScreen; delShowOnScreen("З текстового файлу успiшно зчитано об'єкти!\n"); } catch (FileNotFoundException) { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen(@"Файлу за шляхом C:\Users\USER_NAME\Documents\InputValues.txt не iснує.\n"); delShowOnScreen("Створiть його, розмiстивши в кожному рядку через пробiл поля об'єкта\n" + "Х У Радiус Довжину_напису Кут_нахилу Текст напису (до кiнця рядка)\n"); } //Повідомлення спостерігачам, що кількість об'єктів змінено figures.notifyObservers(figures.List.Count); break; case 6: //Зчитування даних з бiнарного файлу try { figures.List = Utilities.getListObjectsFromBinaryFile(); delShowOnScreen = OutputMethod.successOutputOnScreen; delShowOnScreen("З бiнарного файлу успiшно зчитано об'єкти!\n"); } catch (System.IO.FileNotFoundException) { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen(@"Файлу за шляхом C:\Users\USER_NAME\Documents\objects.dat не iснує.\n"); delShowOnScreen("Створiть його за допомогою пункту 1 i 5\n"); } //Повідомлення спостерігачам, що кількість об'єктів змінено figures.notifyObservers(figures.List.Count); break; case 7: //Пошук даних в масивi об'єктiв за текстовим чи числовим полем if (figures.List.Count != 0) { Console.WriteLine("За яким полем бажаєте вести пошук у масивi об'єктiв?"); Console.WriteLine("1 - за числовим(радiус)"); Console.WriteLine("2 - за текстовим"); Console.Write("Поле: "); int ch; while ((ch = Utilities.getIntFromConsole()) < 1 || ch > 2) { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Тiльки 1 або 2\n"); delShowOnScreen = OutputMethod.simplyOutputOnScreen; } switch (ch) { case 1: { double value; delShowOnScreen("Введiть шуканий радiус: "); while ((value = Utilities.getDoubleFromConsole()) <= 0) { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Радiус вписаного кола не може бути вiд'ємною величиною!\n"); delShowOnScreen = OutputMethod.simplyOutputOnScreen; } List <CircleInscribedInSquareWithLegend> temp = Utilities.findDoubleIn(figures, value); if (temp.Count != 0) { OutputMethod.outputOnScreen(temp); } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Кола з заданим радiусом немає у списку об'єктiв!\n"); } } break; case 2: { String value; delShowOnScreen("Введiть шуканий рядок: "); while ((value = Console.ReadLine()) == "") { ; } List <CircleInscribedInSquareWithLegend> temp = Utilities.findSubstringIn(figures, value); if (temp.Count != 0) { OutputMethod.outputOnScreen(temp); } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("У списку об'єктiв немає кола з написом, текст якого мiстить заданий рядок!\n"); } } break; } } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Немає даних!\n"); } break; case 8: //Розрахунку статистичної функцiї, щоб охарактеризувати данi if (figures.List.Count != 0) { Console.WriteLine("Яку функцiю бажаєте розраховувати?"); Console.WriteLine("1 - середнє геометричне"); Console.WriteLine("2 - середнє гармонiйне"); Console.Write("Функцiя: "); int ch; while ((ch = Utilities.getIntFromConsole()) < 1 || ch > 2) { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Тiльки 1 або 2\n"); delShowOnScreen = OutputMethod.simplyOutputOnScreen; } switch (ch) { case 1: statisticDelegate = Utilities.averageGeometric; break; case 2: statisticDelegate = Utilities.averageGarmonic; break; } statisticDelegate(figures.List); } else { delShowOnScreen = OutputMethod.errorOutputOnScreen; delShowOnScreen("Немає даних для розрахунку функцiї!\n"); } break; case 9: //Додання об'єкту до поточного списку figures = figures + addNewObject(); //Повідомлення спостерігачам, що кількість об'єктів змінено figures.notifyObservers(1); break; } } while (choice != 0);//Якщо 0 - вихід з програми }
private void createNewObjectWithObservers() { figures = new FiguresOnScreen(); figures.addObserver(new ConsoleObserver()); figures.addObserver(new FileObserver()); }