На дом была дана задача. Условие задачи:
"Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы для вычисления значения многочлена для заданного аргумента, операции сложения, вычитания и умножения многочленов с получением нового объекта-многочлена, вывод на экран описания многочлена. Предусмотреть меню, позволяющее проверить все методы класса."
Решить я её решил. Но вот может можно еще как-нибудь её упростить или что-то в ней некрасиво. Мне это интересно больше для себя, нежели для преподавателя.
Код:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Polynomial
{
int max, min;
int[] OneMassClass;//имя массива для коэффициентов 1-го многочлена
int degreeClass;//указыкаваем максимальную степень
int[] coefficientClass;//кол-во ячеек для каждого необходимые для каждого многочлен
//конструктор для степени и кол-ва коэффициентов
public Polynomial(int _degreeClass)
{
degreeClass = _degreeClass;
//число коэффициентов(больше чем макс степень на 1, т.к. начинаются с 0)
coefficientClass = OneMassClass = new int[degreeClass + 1];
}
//вводим коэффициенты
public int[] ScanfPolynomial()
{
for (int i = 0; i <= degreeClass; i++)
{
Console.Write("Введите коэффициент {0}: ", i + 1);
coefficientClass[i] = Convert.ToInt32(Console.ReadLine());
}
return coefficientClass;
}
//выводим первый многочлен, степень x - индекс массива
public void PolynomialOne()
{
for (int i = 0; i < coefficientClass.Length; i++)
{
OneMassClass[i] = coefficientClass[i];
//преобразуем в строку числовое значение. Для корректного отображения знаков
Console.Write(OneMassClass[i].ToString("+#;-#;0") + "x^{0}", i);
}
Console.WriteLine();
}
//выводим второй многочлен используя за основу класс polynomaial, степерь х - индекс массива
public void PolynomialTwo(Polynomial CopyClass)
{
for (int i = 0; i < coefficientClass.Length; i++)
{
CopyClass.OneMassClass[i] = coefficientClass[i];
//для правильного отображения знаков на консоли преобразуем в строку.
Console.Write(CopyClass.OneMassClass[i].ToString("+#;-#;0") + "x^{0}", i);
}
Console.WriteLine();
}
//сумма многочленов
public void SummPolynomial(Polynomial CopyClass)
{
//вычисляем макс и мин многолчен по кол-ву коэффициентов
max = OneMassClass.Length >= CopyClass.OneMassClass.Length ? OneMassClass.Length : CopyClass.OneMassClass.Length;
min = OneMassClass.Length <= CopyClass.OneMassClass.Length ? OneMassClass.Length : CopyClass.OneMassClass.Length;
int[] summ = new int[max + min];
//складываем коэфф. у которых есть переменнные с одинаковыми степенями
for (int i = 0; i < min; i++)
{
summ[i] = OneMassClass[i] + CopyClass.OneMassClass[i];
Console.Write(summ[i].ToString("+#;-#;0") + "x^" + i);
}
//дописываем те коэфф. и переменные, у кот. нет пары в противоположном многочлене
if (min != max)
{
for (int i = min; i < max; i++)
{
if (OneMassClass.Length == min)
summ[i] = CopyClass.OneMassClass[i];
else if (CopyClass.OneMassClass.Length == min)
summ[i] = OneMassClass[i];
Console.Write(summ[i].ToString("+#;-#;0") + "x^" + i);
}
}
}
//вычитание многочленов и вывод
public void SubtractionPolynomial(Polynomial CopyClass)
{
//max и min берем из метода SummPolynomial
int[] subtract = new int[max + min];
//складываем коэфф. у которых есть переменнные с одинаковыми степенями
for (int i = 0; i < min; i++)
{
subtract[i] = OneMassClass[i] - CopyClass.OneMassClass[i];
Console.Write(subtract[i].ToString("+#;-#;0") + "x^" + i);
}
//дописываем те коэфф. и переменные, у кот. нет пары в противоположном многочлене
if (min != max)
{
for (int i = min; i < max; i++)
{
if (OneMassClass.Length == min)
//если у второго многочлена нет пар, то перед каждым коэфф. добавляем -
subtract[i] = -CopyClass.OneMassClass[i];
else if (CopyClass.OneMassClass.Length == min)
subtract[i] = OneMassClass[i];
Console.Write(subtract[i].ToString("+#;-#;0") + "x^" + i);
}
}
}
//перемножение многочленов
public void MultiplicationPolynomial(Polynomial CopyClass)
{
//массив для произведения
int[] Multiplication = new int[OneMassClass.Length + CopyClass.OneMassClass.Length - 1];
for (int i = 0; i < Multiplication.Length; i++)
{
for (int in1 = 0; in1 < OneMassClass.Length; in1++)
{
for (int in2 = 0; in2 < CopyClass.OneMassClass.Length; in2++)
{ //если индексы многочленов дают в сумме дают индекс нового массива, то происходит
//перемножение, а затем сложение для упрощения многочлена
if (in1 + in2 == i)
{
Multiplication[i] += OneMassClass[in1] * CopyClass.OneMassClass[in2];
}
}
}
Console.Write(Multiplication[i].ToString("+#;-#;+0") + "x^" + i);
}
}
}
class Program
{
static void Main(string[] args)
{
Console.Write("Степень для 1-го многочлена: ");
int degree1 = Convert.ToInt32(Console.ReadLine());
Polynomial first = new Polynomial(degree1);
first.ScanfPolynomial();
Console.Write("Многочлен 1: "); first.PolynomialOne();
Console.Write("Степень для 2-го многочлена: ");
int degree2 = Convert.ToInt32(Console.ReadLine());
Polynomial second = new Polynomial(degree2);
Console.WriteLine("коэффициенты 2-го многочлена: ");
second.ScanfPolynomial();
Console.Write("Многочлен 2: "); second.PolynomialTwo(second);
Console.WriteLine();
Console.Write("Сумма: "); first.SummPolynomial(second);
Console.WriteLine();
Console.Write("Разность: "); first.SubtractionPolynomial(second);
Console.WriteLine();
Console.Write("Произведение:"); first.MultiplicationPolynomial(second);
Console.ReadKey();
}
}
} |
|
Если знаете, как сделать код проще или красивее - киньте просто подсказки: что стоит прочитать для того, чтобы я сам осознал)))