На этом шаге мы рассмотрим несколько примеров решения задач, в которых используется изученный материал.
Здесь мы рассмотрим несколько программ, в которых используется материал, изученный на предыдущих шагах.
Задание 1. Напишите программу, в которой для указанного интервала времени (в годах) определяются годы, первый день которых (1 января) попадает на понедельник.
Раскрыть/скрыть решение и комментарии.
Решение этой задачи основано на приложении из 291 шага, только значение для и месяца берется равным 1:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr301_1 { class Program { static void Main() { // Годы начала и окончания поиска, месяц и день месяца: int start = 2000, end = 2023, month = 1, day = 1; // Флаг наличия такой даты: bool flag = false; // Переменная для записи даты: DateTime date; Console.WriteLine("1-е января - это понедельник в интервале от {0} до {1}:", start, end); // Перебираются годы: for (int year = start; year <= end; year++) { // Дата: date = new DateTime(year, month, day); // Если это понедельник: if (date.DayOfWeek == DayOfWeek.Monday) { // Отображение даты: Console.WriteLine(date.ToString("dd MMMM yyyy года")); // Дата найдена: flag = true; } } if (!flag) // Дата не найдена { Console.WriteLine("В интервале от {0} до {1} года 1-е января не приходилось на понедельник!", start, end); } // Задержка: Console.ReadLine(); } } }
Дополнительно вводится флаг flag, определяющий, есть ли на заданном интервале такие года.
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
Раскрыть/скрыть решение и комментарии.
За основу созданного приложения была взята программа из 295 шага. Надеемся, что приведенных комментариев будет достаточно для понимания принципа ее работы.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace pr301_2 { class Program { static void Main() { // Название и полный путь для исходного файла: string file = "MyText1.txt"; // Текстовая переменная: string str; // Ключевое слово: string word = "exit"; // Целочисленная переменная: int k = 1; try { // Контролируемый код // Символьный поток для записи в файл: StreamWriter fw = new StreamWriter(file); Console.WriteLine("Для завершения введите \"{0}\"", word); // Считывание текстовых строк с консоли: do { // Приглашение ввести строку: Console.Write("{0}-я строка: > ", k); k++; // Считывание текстовой строки с консоли: str = Console.ReadLine(); if (str == word) { // Если введено ключевое слово // Завершение оператора: break; } else { // Если не введено ключевое слово // Запись текстовой строки в файл: fw.WriteLine(str); } } while (true); // Закрывается поток: fw.Close(); Console.WriteLine("Первый файл создан!"); // ============================================================ // === Чтение из файла, преобразование и последующая запись === // ============================================================ // Название и полный путь для результирующего файла: string file2 = "MyText2.txt"; // Символьный поток для записи в файл: StreamWriter fw2 = new StreamWriter(file2); // Создание потока для считывания из файла: StreamReader fr = new StreamReader(file); Console.WriteLine("Содержимое файла:"); // Считывание строки из файла: str = fr.ReadLine(); // Построчное считывание содержимого файла: while (str != null) { // Меняем все пробелы на подчеркивание, // а заглавные буквы - на строчные // Замена пробелов на подчеркивания: str = str.Replace(' ', '_'); // Текст с символами в нижнем регистре: str = str.ToLower(); // Отображение считанной из файла строки: Console.WriteLine(str); // Запись преобразованной строки в файл: fw2.WriteLine(str); // Считывание строки из файла: str = fr.ReadLine(); } // Закрытие потоков: fr.Close(); fw2.Close(); Console.WriteLine("Второй файл создан!"); } // Обработка исключений: catch (Exception e) { Console.WriteLine("Произошла ошибка!"); Console.WriteLine(e.Message); } // Задержка: Console.ReadLine(); } } }
Результат работы приложения приведен на рисунках 2-4.
Рис.2. Результат работы приложения (консольное окно)
Рис.3. Результат работы приложения (исходный файл)
Рис.4. Результат работы приложения (результирующий файл)
Раскрыть/скрыть решение и комментарии.
Решение этой задачи базируется на приложении из 298 шага. Дополнительно добавлен статический метод, принимающий в качества аргуента целочесленный массив, и возвращающий в качестве результата сформированный, согласно условию задачи, стек.
Для вывода массива и стека используется метод show(), поскольку массив тоже можно рассматривать как частный случай коллекции.
Текст приложения.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace pr301_3 { class Program { // Метод для получения коллекции (стека): static Stack stk(int[] arr) { // Вычисление среднего значения элементов массива: double avg = 0; for (int i = 0; i < arr.Length; i++) { avg += arr[i]; } avg /= arr.Length; // Создание стека: Stack mystack = new Stack(); // Заполнение стека: for (int i = 0; i < arr.Length; i++) { // Если текущий элемент больше // среднего значения: if (arr[i] > avg) { // Добавление элемента в стек: mystack.Push(arr[i]); } } return mystack; } // Метод для отображения содержимого коллекции: static void show(ICollection s) { foreach (object obj in s) { Console.Write("|" + obj); } Console.WriteLine("|"); } // Главный метод: static void Main() { // Исходный массив. // Среднее значение - 5.5: int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Console.WriteLine("Содержимое массива:"); show(arr); // Заполняем стек: Stack mystk = stk(arr); Console.WriteLine("Содержимое стека:"); show(mystk); // Задержка: Console.ReadLine(); } } }
Результат работы приложения приведен на рисунке 5.
Рис.1. Результат работы приложения
На следующем шаге мы подведем общие итоги.