static void Main(string[] args) { // 协变 Func <string> func1 = () => "KKKK"; Func <object> func2 = func1; // 逆变 Action <object> fun3 = t => { }; Action <string> fun4 = fun3; // 协变 MyFunc <string> str1 = () => "TTTT"; MyFunc <object> str2 = str1; // 逆变 MyFunc2 <object> str3 = t => { }; MyFunc2 <string> str4 = str3; MyFunc3 <object, string> str11 = t => "loud"; MyFunc3 <string, string> str22 = str11; //第一个泛型的逆变(object->string) MyFunc3 <object, object> str33 = str11; //第二个泛型的协变(string->object) MyFunc3 <string, string> str44 = str11; //第一个泛型的逆变和第二个泛型的协变 // 协变 IEnumerable <string> list = new List <string>(); IEnumerable <object> list2 = list; // 逆变 IComparable <object> list3 = null; IComparable <string> list4 = list3; IMotion <Teacher> x = new Run <Teacher>(); IMotion <People> y = x; Console.WriteLine("Hello World!"); }
public static void Table(MyFunc2 func, double x, double a, double b, double c) { Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("----- X ----- Y -----"); while (x <= b) { Console.WriteLine("| {0,8:0.000} | {1,8:0.000} |", x, func(x, a)); x += c; } Console.WriteLine("-----------------------"); }
/// <summary> /// Метод записи результатов функции на заданном отрезке с заданным шагом в файл /// </summary> /// <param name="fileName">имя создаваемого файла</param> /// <param name="f">функция для расчётов</param> /// <param name="c">начальное значение независимого параметра</param> /// <param name="a">множитель функции</param> /// <param name="b">максимальное значение независимого параметра</param> /// <param name="h">шаг значений независимого параметра</param> public static void SaveMyFunc(string fileName, MyFunc2 f, double c, double a, double b, double h) { double x = c; using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { BinaryWriter writer = new BinaryWriter(fs); while (x <= b) { writer.Write(f(x, a)); x += h; } writer.Close(); } }
/// <summary> /// Метод получения переменных для функции и вывода минимальных значений /// </summary> /// <param name="f"></param> /// <param name="min"></param> /// <returns></returns> public static bool CheckAndRunUserFunction(MyFunc2 f, out double min) { min = Double.MaxValue; string fileName = AppDomain.CurrentDomain.BaseDirectory + "mytestfunc.txt"; do { Console.Write("Введите множитель/основание функции.(П.С. Для выхода нажмите 0)=> "); if (Double.TryParse(Console.ReadLine(), out double a) && a != 0) { do { Console.Write("Введите начальное значение диапазона.(П.С. Для выхода нажмите 0)=> "); if (Double.TryParse(Console.ReadLine(), out double x) && x != 0) { do { Console.Write("Введите макимальное значение диапазона.(П.С. Для выхода нажмите 0)=> "); if (Double.TryParse(Console.ReadLine(), out double b) && b != 0) { do { Console.Write("Введите шаг значений функции.(П.С. Для выхода нажмите 0)=> "); if (Double.TryParse(Console.ReadLine(), out double h) && h != 0) { Table(f, x, a, b, h); SaveMyFunc(fileName, f, x, a, b, h); double[] results = LoadMin(fileName, out min); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Минимальным значением функции на отрезке от{1,8:000}до{2,8:000}с шагом значений{3,8:000}\n будет => {0,8:000}", min, x, b, h); Pause(); return(true); } else if (h == 0) { return(false); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Введён не корректный шаг значений. Повторите ввод!"); Pause(); } } while (true); } else if (b == 0) { return(false); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Введено не корректное максимальное значение диапазона. Повторите ввод!"); Pause(); } } while (true); } else if (x == 0) { return(false); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Введено не корректное минимальное значение диапазона. Повторите ввод!"); Pause(); } } while (true); } else if (a == 0) { return(false); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Введен не корректный множитель/основание функции. Повторите ввод!"); Pause(); } } while (true); }