Решить уравнение - 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
- Вычисляются факториалы от элементов матриц
- Выводится уравнение и производится вычисление корней
- Программа завершается после ввода данных пользователем. Этот код выполняет функции работы с большими числами и матрицами, а также вычисление корней уравнения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д