Главная страница

Урфу. Задачи. Первое знакомство с C#


Скачать 23.6 Kb.
НазваниеПервое знакомство с C#
Дата01.10.2022
Размер23.6 Kb.
Формат файлаdocx
Имя файлаЗадачи.docx
ТипРешение
#708182

Первое знакомство с 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);

}
Использование var

static 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> OptimizeContacts(List contacts)

{

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 непонятно, что тестируется; Этот тест не содержит проверок корректности работы алгоритма. Это как минимум подозрительно.
Модульные тесты 2

1) Долю строк кода программы, выполнившихся при тесте 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)
О-символика 2

1) 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 result)
{
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 GetAlbums(List files)

{

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));

}

}
Метод ToString

class 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);

}

}

Целостность данных

Использование private

1) Строка: 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 может быть структурой
Применение ref

public 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();

}
Последствия boxing

1) False 2) True


написать администратору сайта