Объяснить код - C# (191236)
Формулировка задачи:
Пожалуйста, объясните код, а то я ничего не понимаю. Если не трудно, то прям каждую строчку. За раннее благодарю!
Могу предоставить только само задание:
Описать базовый класс Строка в соответствии с вариантом 3.
Описать производный от Строка класс Десятичная_строка.
Строки данного класса могут содержать только символы десятичных цифр и символы
- и +, задающие знак числа. Символы - или + могут находиться только
в первой позиции числа, причем символ + может отсутствовать, в этом случае
число считается положительным. Если в составе инициализирующей строки будут
встречены любые символы, отличные от допустимых, класс Десятичнаястрока
принимает нулевое значение. Содержимое данных строк рассматривается как
десятичное число.
Для класса определить следующие методы:
• конструктор, принимающий в качестве параметра число;
• арифметическая разность строк;
• проверка на больше (по значению);
• проверка на меньше (по значению).
А вот сам код:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Строка { protected string s; protected int n; protected int nb; public Строка() { this.s = ""; this.n = 0; this.nb = 0; } public Строка(string s1) { this.s = s1; this.n = s1.Length; this.nb = s1.Length; } public Строка(char s1) { this.s = Convert.ToString(s1); this.n = 1; this.nb = 2; } public int Длина() { return this.n; } public int ДлинаБ() { return this.n * 2; } public void Отчистить() { this.s = ""; this.n = 0; this.nb = 0; } } class ДесятичСтр : Строка { public ДесятичСтр(String s1) { for (int i = 0; i < s1.Length; ++i) { if (((Convert.ToInt32(s1[i]) >= 49) && (Convert.ToInt32(s1[i]) <= 57)) || (Convert.ToInt32(s1[i]) == 45) || (Convert.ToInt32(s1[i]) == 43)) { this.s = this.s + s1[i]; this.n++; } else { this.s = "0"; this.n = 1; break; } } } public double Значение() { double asum = 0; int z = 0, n_ = 0; if (this.s[0] == '-') { z = 1; n_ = 1; } else if (this.s[0] == '+') n_ = 1; for (int i = n_; i < this.n; ++i) { asum = asum + Char.GetNumericValue(s[i]) * (Math.Pow(10, n - i - 1)); } if (z == 1) asum = asum * (-1); return asum; } public static void Измзнак(ДесятичСтр a) { if (a.Значение() > 0) { if (Convert.ToInt32(a.s[0]) == 43) { a.s = '-' + a.s.Remove(0, 1); } else { a.s = '-' + a.s; } } else { a.s = '+' + a.s.Remove(0, 1); } } public void Присвоить(ДесятичСтр s1) { this.s = s1.s; this.n = s1.s.Length; } public static ДесятичСтр operator -(ДесятичСтр s1, ДесятичСтр s2) { return new ДесятичСтр(Convert.ToString(s1.Значение() - s2.Значение())); } public static bool operator ==(ДесятичСтр a, ДесятичСтр b) { return a.Значение() == b.Значение(); } public static bool operator !=(ДесятичСтр a, ДесятичСтр b) { return !(a.Значение() == b.Значение()); } public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) return false; ДесятичСтр temp = (ДесятичСтр)obj; return this.s == temp.s; } public override int GetHashCode() { return s.GetHashCode(); } public static bool operator >(ДесятичСтр s1, ДесятичСтр s2) { if (s1.Значение() > s2.Значение()) return true; else return false; } public static bool operator <(ДесятичСтр s1, ДесятичСтр s2) { if (s1.Значение() < s2.Значение()) return true; else return false; } public string Содержимое { get { return this.s; } } } class Program { static void Main(string[] args) { Console.Write("Введите 3 строки:"); string w = Console.ReadLine(); string w1 = Console.ReadLine(); string w2 = Console.ReadLine(); ДесятичСтр s = new ДесятичСтр(w); ДесятичСтр s1 = new ДесятичСтр(w1); ДесятичСтр s2 = new ДесятичСтр(w2); ДесятичСтр s3 = new ДесятичСтр("s"); Console.WriteLine(s.Значение()); Console.WriteLine(s2.Значение()); Console.WriteLine(s1.Значение()); Console.WriteLine(s3.Значение()); if (s1 == s) Console.WriteLine("{0}={1}", s1.Значение(), s.Значение()); else Console.WriteLine("{0}!={1}", s1.Значение(), s.Значение()); if (s1 > s) Console.WriteLine("{0} > {1}", s1.Значение(), s.Значение()); else Console.WriteLine("{0} > {1}", s.Значение(), s1.Значение()); ДесятичСтр.Измзнак(s); Console.WriteLine(s.Содержимое); s.Присвоить(s2); Console.WriteLine(s.Содержимое); Console.WriteLine("{0} - ({1}) = {2}", s.Значение(), s1.Значение(), (s - s1).Значение()); Console.ReadLine(); } } }
Решение задачи: «Объяснить код»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Строка { //==============объявление полей класа ==================== protected string s;.. protected int n; protected int nb; //================================== public Строка()// rКонструктор по умолчанию { this.s = ""; // инициализация полей класса this.n = 0; this.nb = 0; } public Строка(string s1) //параметризированый конструктор(с параметром строкового типа) { this.s = s1; //инициализация строкового поля класса передаваемой строкой this.n = s1.Length; //инициализация переменных длиной передаваемой строки this.nb = s1.Length; } public Строка(char s1) //параметризированый конструктор(с параметром символьного типа) { this.s = Convert.ToString(s1); // преобразование символьной переменной в строкою this.n = 1; this.nb = 2; } public int Длина() //геттер(возвращает значение свойства класса) Длины { return this.n; } public int ДлинаБ() //геттер длиныБ { return this.n * 2; } public void Отчистить() //метод очищения полей класса { this.s = ""; this.n = 0; this.nb = 0; } } class ДесятичСтр : Строка { public ДесятичСтр(String s1)//параметризированый конструктор (принимающий строку) { //================вот эта интересная конструкция фильтрует символы строки оставляя только числа от 1 до 9 и -,+ но конструкция странная после первого несовпадения строка равна "0" ============================================= for (int i = 0; i < s1.Length; ++i)//цикл { if (((Convert.ToInt32(s1[i]) >= 49) && (Convert.ToInt32(s1[i]) <= 57)) || (Convert.ToInt32(s1[i]) == 45) || (Convert.ToInt32(s1[i]) == 43)) { this.s = this.s + s1[i]; this.n++; } else { this.s = "0"; this.n = 1; break; } //============================================================= } } public double Значение()//эту эресь я не понял) { double asum = 0; int z = 0, n_ = 0; if (this.s[0] == '-') { z = 1; n_ = 1; } else if (this.s[0] == '+') n_ = 1; for (int i = n_; i < this.n; ++i) { asum = asum + Char.GetNumericValue(s[i]) * (Math.Pow(10, n - i - 1)); } if (z == 1) asum = asum * (-1); return asum; } public static void Измзнак(ДесятичСтр a)//меняет первый знак в строке если он - или+ { if (a.Значение() > 0) { if (Convert.ToInt32(a.s[0]) == 43) { a.s = '-' + a.s.Remove(0, 1); } else { a.s = '-' + a.s; } } else { a.s = '+' + a.s.Remove(0, 1); } } public void Присвоить(ДесятичСтр s1)//присваивает значение полей класса полями другого такогоже { this.s = s1.s; this.n = s1.s.Length; } public static ДесятичСтр operator -(ДесятичСтр s1, ДесятичСтр s2) // перегрузка оператора "-" для двух объектов класа { return new ДесятичСтр(Convert.ToString(s1.Значение() - s2.Значение())); } public static bool operator ==(ДесятичСтр a, ДесятичСтр b) // перегрузка оператора "==" для двух объектов класа { return a.Значение() == b.Значение(); } public static bool operator !=(ДесятичСтр a, ДесятичСтр b)// перегрузка оператора "1!=" для двух объектов класа { return !(a.Значение() == b.Значение()); } public override bool Equals(object obj)//Перегрузка метода Equals { if (obj == null || GetType() != obj.GetType()) return false; ДесятичСтр temp = (ДесятичСтр)obj; return this.s == temp.s; } public override int GetHashCode() //перегрузка метода GetHashCode() { return s.GetHashCode(); } public static bool operator >(ДесятичСтр s1, ДесятичСтр s2) //перегрузка оператор > { if (s1.Значение() > s2.Значение()) return true; else return false; } public static bool operator <(ДесятичСтр s1, ДесятичСтр s2) //перегрузка оператор < { if (s1.Значение() < s2.Значение()) return true; else return false; } public string Содержимое // геттер для получения строки { get { return this.s; } } } class Program // сама програма { static void Main(string[] args) { //==============ввод трех строк======= Console.Write("Введите 3 строки:"); string w = Console.ReadLine(); string w1 = Console.ReadLine(); string w2 = Console.ReadLine(); //===================== //==============создание 4-х екземпляров класса десятичной строки======= ДесятичСтр s = new ДесятичСтр(w); ДесятичСтр s1 = new ДесятичСтр(w1); ДесятичСтр s2 = new ДесятичСтр(w2); ДесятичСтр s3 = new ДесятичСтр("s"); //============================= //==============вывод значений 4-х обьектов======= Console.WriteLine(s.Значение()); Console.WriteLine(s2.Значение()); Console.WriteLine(s1.Значение()); Console.WriteLine(s3.Значение()); //======================================== //==============ввод тут проверка на равенство неравенство s1 и s , и на больше меньше s1 и s с выводом результата======= if (s1 == s) Console.WriteLine("{0}={1}", s1.Значение(), s.Значение()); else Console.WriteLine("{0}!={1}", s1.Значение(), s.Значение()); if (s1 > s) Console.WriteLine("{0} > {1}", s1.Значение(), s.Значение()); else Console.WriteLine("{0} > {1}", s.Значение(), s1.Значение()); //изменение знака s ДесятичСтр.Измзнак(s); Console.WriteLine(s.Содержимое); // вывод s строки s.Присвоить(s2); // присвоение s содержимой строки s2 Console.WriteLine(s.Содержимое); // вывод s строки Console.WriteLine("{0} - ({1}) = {2}", s.Значение(), s1.Значение(), (s - s1).Значение()); // вычитание значений s и s1 Console.ReadLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д