Урфу. Задачи. Первое знакомство с C#
Скачать 23.6 Kb.
|
Первое знакомство с C#Терминология1) Метод 2) Сборка — это как правило результат компиляции проекта; Solution (решение) может содержать несколько проектов; В проекте может быть более одного кодового файла; Разные проекты одного решения могут содержать классы в одном и том же пространстве имён 3) Сборки, классы которых доступны для использования в кодовых файлах проекта 4) Избавляет программиста от необходимости указывать пространство имён перед именами классов данного пространства имён, сокращая код 5) Скорее всего в подпапке bin/Debug папки вашего проекта Первый шагpublic static void Main() { Console.WriteLine("The first step!"); } Неверный тип данныхpublic static void Main() { double num1 = +5.5e-2; float num2 = 7.8f; int num3 = 0; long num4 = 2000000000000L; Console.WriteLine(num1); Console.WriteLine(num2); Console.WriteLine(num3); Console.WriteLine(num4); } Ошибки преобразования типовpublic static void Main() { double pi = Math.PI; int tenThousand = 10000; float tenThousandPi = (float)pi*tenThousand; int roundedTenThousandPi = (int)Math.Round(tenThousandPi); int integerPartOfTenThousandPi = (int)tenThousandPi; Console.WriteLine(integerPartOfTenThousandPi); Console.WriteLine(roundedTenThousandPi); } Биткоины в массы!public static void Main() { double amount = 1.11; int peopleCount = 60; int totalMoney = (int)Math.Round(amount*peopleCount); Console.WriteLine(totalMoney); } Преобразование строки в числоpublic static void Main() { string doubleNumber = "894376.243643"; double number = double.Parse(doubleNumber, CultureInfo.InvariantCulture); Console.WriteLine(number + 1); } Использование varstatic public void Main() { double a = 5; a += 0.5; Console.WriteLine(a); } Добрый работодательprivate static string PrintGreeting(string name, double salary) { salary = (int)Math.Ceiling(salary); return "Hello, " + name + ", your salary is " + salary.ToString(); } Главный вопрос Вселеннойstatic double GetSquare(double a) { a = Math.Pow(a, 2); return a; } static void Print(double a) { Console.WriteLine(a); } Разыскиваются методы!static string GetLastHalf(string text) { int half = text.Length / 2; text = text.Substring(half, half); text = text.Replace(" ", ""); return text; } Области видимости1) Да, корректно 2) class 3) H 4) Ничего. Будет ошибка компиляции 5) M1; M2 ОшибкиОшибки компиляции1) Написать "System.Math.Min" вместо "Math.Min"; Дописать "using System;" в начало 2) Ошибка где-то в девятой строке; Ошибка в файле Program.cs; Вася попытался вызвать функцию Min с одним аргументом Очепяткиpublic static void Main() { Console.WriteLine("Hello, World!"); var number = 5.5; number += 7; Console.WriteLine(number); } Минимум функцииprivate static void WriteParabolaMinX(int a, int b, int c) { double x = 0; if (a == 0) Console.WriteLine("Impossible"); else { x = -b / (2.0 * a); Console.WriteLine(x); } } Горячие клавиши отладкиStep Into – F11, запуск – F5, Step Out – Shift+F11, Step Over – F10 Дизайн кода1) Все, кроме: theNumberToSquareAndSum названа с маленькой буквы, что противоречит принятым в C# правилам именования; theNumberToSquareAndSum лучше сделать полем класса 2) Название переменной не соответствует содержанию; Название переменной не соответствует правилу camelCase 3) Неверно 4) applesCount, amountOfApples 5) Write(string s), PrintString(string s) Рефакторинг и улучшение кода1) Использовать константу Math.PI, вместо 3.14; Выделить нахождение площади круга и вывод на экран в отдельный метод 2) Использовать enum вместо целых чисел 3) Неверно 4) Всё Сделай то, не знаю чтоstatic int Decode(string a) { return int.Parse(a.Replace(".", "")) % 1024; } ВетвленияВисокосный годpublic static bool IsLeapYear(int year) { return (year % 400 == 0) || ((year % 100 != 0) & (year % 4 == 0)); } Среднее трехpublic static int MiddleOf(int a, int b, int c) { if (a >= b) if (b >= c) return b; else { if (a <= c) return a; else return c; } if (b >= c) if (c >= a) return c; else { if (b <= a) return b; else return a; } if (c >= a) if (a >= b) return a; else { if (c <= b) return c; else return b; } return 0; } Ход ферзяpublic static bool IsCorrectMove(string from, string to) { var dx = Math.Abs(to[0] - from[0]); var dy = Math.Abs(to[1] - from[1]); bool isCorrect; if ((dx == dy || dy == 0 || dx == 0) && !(dx == 0 && dy == 0)) isCorrect=true; else isCorrect=false; return isCorrect; } Логические выражения и условия1) Сравнение чисел или строк; Любое выражение типа bool; Вызов метода, возвращающего bool; Переменная, поле или свойство класса типа bool 2) Лучше вместо метода IsNotPrimeNumber написать метод IsPrimeNumber, тогда не будет двойного отрицания в условии 3) Всё Управление роботомstatic bool ShouldFire2(bool enemyInFront, string enemyName, int robotHealth) { return (enemyInFront && (enemyName != "boss")) || (enemyInFront && (enemyName == "boss") && (robotHealth > 49)); } ЦиклыВ поисках степени двойкиprivate static int GetMinPowerOfTwoLargerThan(int number) { int result = 1; int i=0; while (result <= number) { result = (int)Math.Pow(2, i); i++; } return result; } Убрать пробелыpublic static string RemoveStartSpaces(string text) { while (char.IsWhiteSpace(text[0])) { text = text.Substring(1); if (text.Length == 0) break; } return text; } Рамочкаprivate static void WriteTextWithBorder(string text) { int i; string border = "+"; for (i=0; i border += "-"; border += "+"; Console.WriteLine(border); Console.WriteLine("| " + text + " |"); Console.WriteLine(border); } Шахматная доскаprivate static void WriteBoard(int size) { for (int i=0; i if (i % 2 == 0) Console.WriteLine(WriteEvenRow(size)); else Console.WriteLine(WriteOddRow(size)); Console.WriteLine(); } private static string WriteEvenRow(int size) { string row = ""; for (int i = 0; i < size; i++) if (i % 2 == 0) row += "#"; else row += "."; return row; } private static string WriteOddRow(int size) { string row = ""; for (int i = 0; i < size; i++) if (i % 2 == 0) row += "."; else row += "#"; return row; } МассивыЧетный массивpublic static int[] GetFirstEvenNumbers(int count) { int[] evenNumbers; evenNumbers = new int[count]; for (int i=1; i<=count; i++) evenNumbers[i-1]=i*2; return evenNumbers; } Индекс максимумаpublic static int MaxIndex(double[] array) { var max = double.MinValue; int maxIndex = -1; for (int i=0; i if (array[i] > max) { max = array[i]; maxIndex = i; } return maxIndex; } Подсчетpublic static int GetElementCount(int[] items, int itemToFind) { int count = 0; foreach (var item in items) if (item == itemToFind) count++; return count; } Поиск массива в массивеpublic static bool ContainsAtIndex (int[] array, int[] subArray, int i) { foreach (int element in subArray) if (array[i] != element) return false; else i++; return true; } Карты Тароprivate static string GetSuit(Suits suit) { return new[] { "жезлов", "монет", "кубков", "мечей" }[(int)suit]; } Null или не Null?public static bool CheckFirstElement(int[] array) { return array != null && array.Length != 0 && array[0] == 0; } Возвести массив в степеньpublic static int[] GetPoweredArray(int[] arr, int power) { var poweredArray = new int[arr.Length]; for (int i=0; i poweredArray[i] = (int)Math.Pow(arr[i], power); return poweredArray; } Массивы1) Нет смысла заполнять массив нулями в цикле; Произойдет выход за границы массива 2) Неверно 3) поиска значения по его номеру; хранения набора однотипных данных 4) Все ячейки массива `b` содержат значение null; Все ячейки массива `a` содержат значение 0; Тип элементов `a` — int; Массив `a` двумерный; Тип элементов `b` — int[] Крестики-ноликиpublic static GameResult GetGameResult(Mark[,] field) { bool crossWin = HasWinSequence(field, Mark.Cross); bool circleWin = HasWinSequence(field, Mark.Circle); if (crossWin & !circleWin) return GameResult.CrossWin; if (circleWin & !crossWin) return GameResult.CircleWin; return GameResult.Draw; } static bool HasWinSequence(Mark[,] field, Mark mark) { if(IsWinLine(field, mark, 0, 0, 1, 1) || IsWinLine(field, mark, 0, 2, 1, -1)) return true; for(int i = 0; i < 3; i++) if(IsWinLine(field, mark, i, 0, 0, 1) || IsWinLine(field, mark, 0, i, 1, 0)) return true; return false; } static bool IsWinLine(Mark[,] field, Mark mark, int x0, int y0, int dx, int dy) { for(int i = 0; i < 3; i++) if(field[x0 + i * dx, y0 + i * dy] != mark) return false; return true; } Коллекции, строки, файлыШифр незнакомкиprivate static string DecodeMessage(string[] lines) { var words = new List foreach (var line in lines) { var str = line.Split(' '); foreach (var c in str) if (c.Length != 0 && char.IsUpper(c[0])) words.Add(c); } words.Reverse(); string text = ""; foreach (var e in words) text += e + “ “; return text; } Полезные знакомстваprivate static Dictionary { var dictionary = new Dictionary foreach (var e in contacts) { var parsedContact = e.Split(':'); var key = e.Substring(0, Math.Min(2, parsedContact[0].Length)); if (!dictionary.ContainsKey(key)) dictionary[key] = new List dictionary[key].Add(e); } return dictionary; } Снова незнакомкаprivate static string ApplyCommands(string[] commands) { var message = new StringBuilder(); foreach (var line in commands) if (line.StartsWith("push")) message.Append(line.Substring(5)); else message.Length -= int.Parse(line.Split(' ')[1]); return message.ToString(); } Работа со строками1) Неверно 2) Строки являются типами-ссылками (Reference Type) 3) 32145 4) Код вызовет ошибку при исполнении 5) Использовать форматированный вывод Работа с файлами1) System.IO 2) Directory 3) 9 4) Кодровка – это способ преобразования символов в байты и обратно; Формат записи латинских букв в кодировке UTF-8 совпадает с форматом в старой кодировке ASCII 5) UTF-8 ТестированиеТестирование1) Всё 2) При разработке веб-сервисов (например, заказа билетов) ошибки могут мгновенно приводить к финансовым убыткам разработчиков сервиса; Некоторые ошибки могут привести к значительному ущербу, а мероприятия по их поиску и исправлению выгоднее исправления последствий; Ошибки совершают даже очень опытные разработчики Модульные тесты1) Чтобы можно было повторно использовать код из библиотек в других проектах 2) Логика может пригодиться в других обстоятельствах, а если она будет объединена с вводом-выводом, ее не получится использовать повторно; Логику, отделенную от ввода-вывода проще тестировать 3) Всё 4) Этот тест не автоматический. Если алгоритм станет работать неправильно, тест не упадет и не станет "красным"; Название теста не раскрывает сути — по слову Test непонятно, что тестируется; Этот тест не содержит проверок корректности работы алгоритма. Это как минимум подозрительно. Модульные тесты 21) Долю строк кода программы, выполнившихся при тесте 2) Он позволяет найти участки кода, которые не тестируются; не позволяет найти ошибки в нерассмотренных случаях; в простых случаях анализ можно провести с помощью точек останова и отладчика 3) При подходе "Белый ящик", в отличие от "Черного ящика", отталкиваются от деталей реализации; При подходе "Черный ящик" отталкиваются от спецификации; При подходе "Черный ящик" иногда используют тесты на случайных данных 4) Рефакторинг становится менее опасной затеей; Повышается доверие к коду у других программистов; Тратится меньше усилий на выявление и устранение ошибок после старта эксплуатации 5) RepeatAttribute 6) TimeoutAttribute Сложность алгоритмовБазовые понятия1) Верно 2) Существует некоторый вход размера nn, на котором алгоритм FF выполнит в точности f(n)f(n) "элементарных" операций 3) Да, так как любая информация (как переданная на вход, так и вычисленная алгоритмом) может быть описана последовательностью байт, а байты можно считать буквами алфавита 4) Зависит от выбранного алфавита и способа кодирования входа Сложность и скорость1) G может выполняться быстрее алгоритма F на некоторых входах 2) Всё О-символика1) Верно 2) Верно 3) Верно 4) Неверно 5) Неверно 6) Верно 7) Неверно 8) Верно 9) Верно Оценка сложности алгоритма1) Всё, кроме: Θ(n) 2) O(n2); O(n3); o(n3); Θ(n2) 3) Θ(2n) О-символика 21) f(n)=O(10n); f(n)=O(0.001n); f(n)=O(n-1000/n); f(n)=o(n2); f(n)=o(0.0001n3-1000) 2) F может быть быстрее G на любом входе; F может быть медленнее G на любом входе; F может быть таким, что для любого n он делает n^2 2 операций на некотором входе размера n 3) f(n)=O(g(n)); 1000f(n)=O(g(n)); 1000f(n)=Θ(g(n)) 4) Существует такой вход, на котором F выполнит меньше операций, чем G; Начиная с некоторого размера входа F в худшем случае выполняет меньше операций, чем G в худшем случае Рекурсивные алгоритмыИсправить рекурсиюpublic static void WriteReversed(char[] items, int startIndex = 0) { if (startIndex < items.Length) { WriteReversed(items, startIndex+1); Console.Write(items[startIndex]); } } Понимание рекурсии1) Вычисляет минимальный разряд числа х, в котором стоит 0 2) 2 3) Вычисляет НОД х и у по алгоритму Евклида Перебор паролейstatic void MakeSubsets(char[] subset, int position = 0) { if (position == subset.Length) { Console.WriteLine(new string(subset)); return; } subset[position] = 'a'; MakeSubsets(subset, position + 1); subset[position] = 'b'; MakeSubsets(subset, position + 1); subset[position] = 'c'; MakeSubsets(subset, position + 1); } Брошенный кодstatic void MakePermutations(int[] permutation, int position, List { if (position == permutation.Length) WritePermutation(permutation); for (int i = 0; i < permutation.Length; i++) { var index = Array.IndexOf(permutation, i, 0, position); if (index != -1) continue; permutation[position] = i; MakePermutations(permutation, position + 1, result); } } Поиск и сортировкаАнализ алгоритма1) Доказательство того, что алгоритм остановится; Доказательство того, что алгоритм вычисляет верный результат; Оценка сложности алгоритма 2) Θ(n), где n – сумма длин всех строк в массиве array Рекурсивный бинарный поискpublic static int BinSearchLeftBorder(long[] array, long value, int left, int right) { if (left == right - 1) return left; var m = (left + right) / 2; if (array[m] < value) return BinSearchLeftBorder(array, value, m, right); return BinSearchLeftBorder(array, value, left, m); } Сортировка диапазонаpublic static void BubbleSortRange(int[] array, int left, int right) { for (int i = left; i <= right; i++) for (int j = left; j < right; j++) if (array[j] > array[j + 1]) { var t = array[j + 1]; array[j + 1] = array[j]; array[j] = t; } } Сложность поиска и сортировки1) Θ(n) 2) Θ(log n) 3) Θ(n2) 4) Θ(n log n) 5) Θ(n2) 6) «Быстрая сортировка» в среднем работает быстрее; Использует меньше дополнительной памяти Основы ООПСоздание классовpublic class City { public string Name; public GeoLocation Location; } public class GeoLocation { public double Latitude; public double Longitude; } Сокращенный синтаксисpublic static MenuItem[] GenerateMenu() { return new[] { new MenuItem { Caption = "File", HotKey = "F", Items = new[] { new MenuItem { Caption = "New", HotKey = "N" }, new MenuItem { Caption = "Save", HotKey = "S" } } }, new MenuItem { Caption = "Edit", HotKey = "E", Items = new[] { new MenuItem { Caption = "Copy", HotKey = "C" }, new MenuItem { Caption = "Paste", HotKey = "V" } } } }; } Поля классов1) SomeClass.s = 42; new SomeClass().d = 42 2) 42 43 Методы классов1) Верно 2) Неверно 3) 1 1 2 1 3 2 4) Верно 5) Верно Создание методов расширенияstatic class StringExtensions { public static int ToInt(this string arg) { return int.Parse(arg); } } Список директорийpublic static List { var dirs = new List foreach(var file in files) if (file.Extension == ".mp3" || file.Extension == ".wav") dirs.Add(file.Directory); return dirs; } Рефакторинг статического классаpublic class SuperBeautyImageFilter { public string ImageName; public double GaussianParameter; public void Run() { Console.WriteLine("Processing {0} with parameter {1}", ImageName, GaussianParameter.ToString(CultureInfo.InvariantCulture)); //do something useful } } НаследованиеНаследование1) FieldA 2) FieldA; FieldB 3) FieldA; FieldC 4) FieldA; FieldC; FieldD Касты1) Upcast 2) Пройдет без ошибок 3) Downcast 4) Вызовет ошибку выполнения 5) ClassA; ClassB 6) Ни то, ни другое Всем печать!public static void Print(params object[] objects) { for(var i=0; i if (i > 0) Console.Write(", "); Console.Write(objects.GetValue(i)); } Console.WriteLine(); } Склейка массивовpublic static Array Combine(params Array[] arrays) { if (arrays.Length == 0) return null; var type = arrays[0].GetType().GetElementType(); int length = 0; foreach (var array in arrays) { if (array.GetType().GetElementType() != type) return null; length += array.Length; } var result = Array.CreateInstance(type, length); var index = 0; foreach (var array in arrays) foreach (var elem in array) result.SetValue(elem, index++); return result; } Снова среднее трехstatic object MiddleOfThree(IComparable a, IComparable b, IComparable c) { if (a.CompareTo(b) >= 0) { if (b.CompareTo(c) > 0) return b; else if (a.CompareTo(c) > 0) return c; else return a; } else if (b.CompareTo(c) < 0) return b; else if (a.CompareTo(c) < 0) return c; else return a; } Поиск минимумаpublic static object Min(Array array) { Array.Sort(array); return array.GetValue(0); } Сравнение книгclass Book : IComparable { public string Title; public int Theme; public int CompareTo(object obj) { var book = (Book)obj; if (Theme.CompareTo(book.Theme) > 0) return 1; else if (Theme.CompareTo(book.Theme) < 0) return -1; else if (Title.CompareTo(book.Title) > 0) return 1; else if (Title.CompareTo(book.Title) < 0) return -1; else return 0; } } По часовой стрелкеpublic class ClockwiseComparer : IComparer { public int Compare(object x, object y) { var p1 = (Point)x; var p2 = (Point)y; return Math.Atan2(-p1.Y, -p1.X).CompareTo(Math.Atan2(-p2.Y, -p2.X)); } } Метод ToStringclass Triangle { public Point A; public Point B; public Point C; public override string ToString() { return String.Format("({0} {1}) ({2} {3}) ({4} {5})", A.X, A.Y, B.X, B.Y, C.X, C.Y); } } Целостность данныхИспользование private1) Строка: 1; 2; 3; 4; 7; 8; 9; 10 Не откладывать ошибкиpublic class Student { private string name; public string Name { get { return name; } set { if (value == null) throw new ArgumentException(); else name = value; } } } Свойство вместо поляpublic class Book { public string Title { get; set; } } Векторpublic class Vector { public double X; public double Y; public double Length { get { return Math.Sqrt(X * X + Y * Y); } } public Vector(double x, double y) { X = x; Y = y; } public override string ToString() { return string.Format("({0}, {1}) with length: {2}", X, Y, Length); } } Дробьpublic class Ratio { public Ratio(int num, int den) { Numerator = num; Denominator = (den > 0) ? den : throw new ArgumentException(); Value = (double)num / (double)den; } public readonly int Numerator; public readonly int Denominator; public readonly double Value; } СтруктурыСтруктура или класс?1) X может быть структурой 2) X может быть структурой; X может быть классом 3) X может быть структурой; X может быть классом 4) X может быть структурой Применение refpublic static void WriteAllNumbersFromText(string text) { int pos = 0; while (true) { SkipSpaces(text, ref pos); var num = ReadNumber(text, ref pos); if (num == "") break; Console.Write(num + " "); } Console.WriteLine(); } Последствия boxing1) False 2) True |