Решить уравнение - Pascal (80478)
Формулировка задачи:
Ребят, не могли бы помочь? Очень нужно доделать, либо переделать программу. В общем, есть задание:
Решить уравнение (ba)!x^2+2*(dc)!x+(mk)!=0, где b,a-сумма модулей и количество элементов, расположенных в матрице z(6,6) ниже побочной диагонали; d,c-сумма модулей и количество элементов, расположенных в матрице w(11,11) ниже побочной диагонали; m,k-сумма модулей и количество элементов, расположенных в матрице v(12,12) ниже побочной диагонали. Знакопеременные массивы сформировать случайным образом.
Вот программа:
В общем, ребят, помогите пожалуйста её изменить.Очень вас прошу. Я что-то не пойму, что с ней не так. Заранее, спасибо большое!
// (ba)!x^2+2*dc)!x+(mk)!=0
// z 6-6 w 11-11 v 12-12
program lab6zachas;
uses
crt;
const
ZA = 6;
WA = 11;
VA = 12;
Y = 1;
var
z: array [1..ZA, 1..ZA] of integer;
w: array [1..WA, 1..WA] of integer;
v: array [1..VA, 1..VA] of integer;
a, b, c, d, k, m, x1, x2: integer;
rez, factba, factdc, factmk: LongInt;
i, j: byte;
//
function fact(n: integer): LongInt;
var
r: LongInt;
i: integer;
begin
r := 1;
if n = 1 then fact := 1
else
for i := 2 to n do
begin
r := r * i;
end;
fact := r;
end;
//
procedure xnadva(g, h, j: LongInt; var res: LongInt);
var
D: LongInt;
begin
if (g = 0) then
begin
writeln('Не квадратное уравнение.');
halt;
end;
D := h * h - 4 * g * j;
if (D = 0) then
begin
writeln('x = ', -h / 2.0 / g);
halt;
end;
if (D > 0) then
begin
writeln('x1 = ', (-h + Sqrt(D)) / 2.0 / g);
writeln('x2 = ', (-h - Sqrt(D)) / 2.0 / g);
end
else
begin
writeln('x1 = (', -h / 2.0 / g, ',', Sqrt(-D) / 2.0 / g, ')');
writeln('x2 = (', -h / 2.0 / g, ',', -Sqrt(-D) / 2.0 / g, ')');
end;
end;
begin
randomize;
a := 0;
b := 0;
//Z
for i := 1 to ZA do
begin
for j := 1 to ZA do
begin
z[i, j] := random(Y) - random(Y);
write(z[i, j]:5);
end;
writeln;
end;
writeln;
writeln;
//W
for i := 1 to WA do
begin
for j := 1 to WA do
begin
w[i, j] := random(Y) - random(Y);
write(w[i, j]:5);
end;
writeln;
end;
writeln;
writeln;
//V
for i := 1 to VA do
begin
for j := 1 to VA do
begin
v[i, j] := random(Y) - random(Y);
write(v[i, j]:5);
end;
writeln;
end;
writeln;
writeln;
//Zmod
for i := 1 to ZA do
begin
write(' ':5 * (ZA - i + 1));
for j := ZA - i + 2 to ZA do
begin
write(z[i, j]:5);
a := a + 1;
b := b + abs(z[i, j]);
end;
writeln();
end;
writeln(a); // Вывод кол-ва
writeln(b); // Вывод суммы модулей
//Wmod
for i := 1 to WA do
begin
write(' ':5 * (WA - i + 1));
for j := WA - i + 2 to WA do
begin
write(w[i, j]:5);
c := c + 1;
d := d + abs(w[i, j]);
end;
writeln();
end;
writeln(c); // Вывод кол-ва
writeln(d); // Вывод суммы модулей
//Vmod
for i := 1 to VA do
begin
write(' ':5 * (VA - i + 1));
for j := VA - i + 2 to VA do
begin
write(v[i, j]:5);
m := m + 1;
k := k + abs(v[i, j]);
end;
writeln();
end;
writeln(m); // Вывод кол-ва
writeln(k); // Вывод суммы модулей
// (ba)! x^2 + 2(dc)! x + (mk)! = 0
// (ba)! = factba
// (dc)! = factdc
// (mk)! = factmk
factba := fact(a * b);
factdc := fact(d * c);
factmk := fact(m * k);
writeln(factba);
writeln;
writeln(factdc);
writeln;
writeln(factmk);
xnadva(factba, factdc, factmk, rez);
readln;
end.Решение задачи: «Решить уравнение»
textual
Листинг программы
uses crt;
type BigReal = record mant: extended; expt: int64 end;
Matrix = array of array of longint;
rt = array [1..2] of BigReal;
procedure WriteBigReal(a: BigReal);
begin
if a.mant >= 0
then write('+')
else write('-');
write(abs(a.mant):0:17, 'e');
if a.expt >= 0 then write('+');
write(a.expt)
end;
procedure Normalize(var a: BigReal);
begin
if a.mant = 0
then a.expt := 0
else begin
while abs(a.mant) >= 10 do
begin
inc(a.expt);
a.mant /= 10
end;
while abs(a.mant) < 1 do
begin
dec(a.expt);
a.mant *= 10
end
end
end;
procedure Scale(var a: BigReal; n: int64);
var i: int64;
begin
i := 1;
while i <= n do
begin
inc(i);
inc(a.expt);
a.mant /= 10
end
end;
function IntToBigReal(n: longint): BigReal;
begin
Result.mant := n;
Normalize(Result)
end;
procedure align(var a, b: BigReal);
var diff: int64;
begin
diff := a.expt - b.expt;
if diff > 20
then begin
b.mant := 0;
b.expt := a.expt
end
else if diff < -20
then begin
a.mant := 0;
a.expt := b.expt
end
else if diff > 0
then Scale(b, diff)
else if diff < 0
then Scale(a, -diff)
end;
operator *(a, b: BigReal)c: BigReal;
begin
c.mant := a.mant * b.mant;
c.expt := a.expt + b.expt;
normalize(c)
end;
operator /(a, b: BigReal)c: BigReal;
begin
if b.mant = 0
then begin
write('Ошибка: попытка деления на ноль.');
readln;
halt
end;
c.mant := a.mant / b.mant;
c.expt := a.expt - b.expt;
normalize(c)
end;
operator +(a, b: BigReal)c: BigReal;
begin
align(a, b);
c.mant := a.mant + b.mant;
c.expt := a.expt;
normalize(c)
end;
operator -(a, b: BigReal)c: BigReal;
begin
align(a, b);
c.mant := a.mant - b.mant;
c.expt := a.expt;
normalize(c)
end;
function SqrtBigReal(a: BigReal): BigReal;
begin
if a.mant < 0
then begin
write('Ошибка: попытка вычисления квадратного корня из отрицательного числа.');
readln;
halt
end;
if odd(a.expt)
then begin
dec(a.expt);
a.mant *= 10
end;
Result.mant := sqrt(a.mant);
Result.expt := a.expt div 2;
end;
function Factorial(n: longint): BigReal;
const one: BigReal = (mant: 1; expt: 0);
var i: integer;
begin
if n < 0
then begin
write('Ошибка: попытка вычисления факториала от отрицательного числа.');
readln;
halt
end;
Result := one;
for i := 2 to n do
begin
Result.mant := Result.mant * i;
Normalize(Result)
end;
end;
const q = 1; //количество значащих цифр в элементах массива
r = round(exp(q * ln(10))) - 1;
procedure Generate(var x: Matrix);
var i, j: longint;
begin
for i := low(x) to high(x) do
for j := low(x[low(x)]) to high(x[low(x)]) do
x[i, j] := -r + random(2 * r + 1)
end;
procedure WriteMatrix(s: string; var x: Matrix);
var i, j: longint;
begin
writeln('Матрица ', s, ':');
textcolor(LightGray);
for i := 0 to high(x) do
begin
for j := 0 to high(x[0]) do
begin
write(x[i, j]:q + 2);
if j = high(x) - i then textcolor(Yellow)
end;
textcolor(LightGray);
writeln
end
end;
procedure Preprocessing(s: string; var x: Matrix; x_r: integer; var quantity, sum_abs: longint);
var c: char;
i, j: integer;
begin
setlength(x, x_r, x_r);
generate(x);
WriteMatrix(s, x);
quantity := x_r * (x_r - 1) div 2;
writeln('Количество элементов матрицы ниже побочной диагонали: ', quantity);
sum_abs := 0;
for i := 1 to high(x) do
for j := high(x) - i + 1 to high(x) do
sum_abs += abs(x[i, j]);
writeln('Сумма их модулей: ', sum_abs);
write('Нажмите <Enter> для продолжения работы', #13);
{c := }readkey;
writeln(' ')
end;
procedure CompileRoots(a, b, c: BigReal; var x: rt; var n: integer);
const mone: BigReal = (mant: -1; expt: 0);
two: BigReal = (mant: 2; expt: 0);
mtwo: BigReal = (mant: -2; expt: 0);
four: BigReal = (mant: 4; expt: 0);
var d, d1: BigReal;
begin
if (b.mant = 0) and (c.mant <> 0)
then n := 4
else if (a.mant = 0) and (b.mant = 0) and (c.mant = 0)
then n := 3
else if (a.mant = 0) and (b.mant <> 0)
then begin
n := 1;
c.mant *= -1;
x[1] := c / b
end
else begin
d := b * b - four * a * c;
if d.mant < 0
then n := 0
else if d.mant = 0
then begin
n := 1;
x[1] := (b / a) / mtwo
end
else begin
n := 2;
d := SqrtBigReal(d);
x[1] := ((b - d) / a) / mtwo;
x[2] := ((b + d) / a) / mtwo;
end
end
end;
const z_r = 6;
w_r = 11;
v_r = 12;
var z, w, v: Matrix;
a, b, c, d, k, m: longint;
p2, p1, p0: BigReal;
roots: rt;
n, i: integer;
begin
randomize;
Preprocessing('Z', z, z_r, a, b);
Preprocessing('W', w, w_r, c, d);
Preprocessing('V', v, v_r, k, m);
p2 := Factorial(a * b);
p1 := Factorial(c * d);
p0 := Factorial(k * m);
writeln('Уравнение:');
WriteBigReal(p2);
writeln(' * x^2');
WriteBigReal(p1);
writeln(' * x');
WriteBigReal(p0);
writeln(' = 0');
CompileRoots(p2, p1, p0, roots, n);
case n of
1: begin
writeln('Уравнение имеет один корень:');
write('x[1] = ');
WriteBigReal(roots[1]);
writeln
end;
2: begin
writeln('Уравнение имеет два корня:');
for i := 1 to 2 do
begin
write('x[', i, '] = ');
WriteBigReal(roots[i]);
writeln
end
end;
3: writeln('Уравнение имеет бесконечное множество корней')
else writeln('уравнение не имеет корней')
end;
write('Нажмите <Enter> для выхода');
readln
end.
Объяснение кода листинга программы
- Объявляются пользовательские типы данных:
BigReal- запись, представляющая большие числаmant- вещественное число большой точностиexpt- целочисленное число
Matrix- массив массивов целых чиселrt- массив из двух переменных типа BigReal
- Описываются процедуры и функции для работы с большими числами:
WriteBigReal- процедура для вывода большого числа в виде экспонентыNormalize- процедура для нормализации большого числаScale- процедура для масштабирования большого числаIntToBigReal- функция для преобразования целого числа в большое числоalign- процедура для выравнивания двух больших чисел- Перегруженные операторы для умножения, деления, сложения и вычитания больших чисел
SqrtBigReal- функция для нахождения квадратного корня из большого числаFactorial- функция для вычисления факториала
- Объявляются константы и процедуры для работы с матрицей:
q- количество значащих цифр в элементах массиваr- округленное значение для матрицыGenerate- процедура для генерации матрицыWriteMatrix- процедура для вывода матрицы в консольPreprocessing- процедура для предварительной обработки матрицыCompileRoots- процедура для вычисления корней уравнения
- Основная часть программы:
- Объявляются переменные и константы типа Matrix и longint
- Генерируется три матрицы Z, W, V
- Вычисляются факториалы от элементов матриц
- Выводится уравнение и производится вычисление корней
- Программа завершается после ввода данных пользователем. Этот код выполняет функции работы с большими числами и матрицами, а также вычисление корней уравнения.