Объяснить код - 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();
}
}
}