Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача по матрицам

Автор: Eskel 25.12.2008 3:54

Заполняется с клавиатуры верхняя часть. Потом с помощью операторов присваивания, надо сделать матрицу симметричной... Помогите, плиз, написать саму часть где матрица делается симметричной...

Автор: volvo 25.12.2008 4:01

Цитата
надо сделать матрицу симметричной...
Относительно чего? Какая верхняя часть заполняется?

Автор: Eskel 25.12.2008 4:05

"Заполнить с клавиатуры симметричную квадратную действительную матрицу N-го порядка (вводить только верхнюю треугольную матрицу, нижний треугольник заполнить программно, при помощи операторов присваивания)." - Задание выглядит так... Я тож думаю... Про какой треугольник они говорят...

Автор: volvo 25.12.2008 4:12

По определению: http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B5%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0 - вводить надо то, что над главной диагональю (включая ее). А потом:

  for i := 1 to n do
for j := i + 1 to n do
a[j, i] := a[i, j];


Автор: Eskel 25.12.2008 4:25

а главная диагональ как заполнится?

Автор: volvo 25.12.2008 4:28

А главную ты должен заполнять, потому что верхнетреугольная матрица включает ее.

Автор: Eskel 25.12.2008 4:59

Спасибо. Вот еще, помогите ошибку из проги убрать. Препод сказал, что я неправильно открытый массив использовал:

Program art2;
uses crt;
Const m=15;
Var
a,b:array[1..m] of real;
c:array[1..m+5] of real;
x:real; k1,k2,k3:integer;
procedure zap(k:integer; var f:array of real);
Var
i:integer;
begin
for i:=1 to k do
f[i]:=200*random-100 end;
procedure vivod(k:integer; var f:array of real);
Var
i:integer;
begin
for i:=1 to k do
write(f[i]3.gif1,' ') end;
procedure nax(k:integer; f:array of real; var r:integer);
Var
i:integer;
Begin
r:=0;
for i:=1 to k do
if f[i]<0 then r:=r+1 end;
procedure umnog(k:integer; r:real; var f:array of real);
var
i:integer;
Begin
for i:=1 to k do
f[i]:=f[i]*r end;
Begin clrscr;
Randomize;
write('vvedite x '); readln(x);
zap(m,a); writeln('massiv A'); vivod(m,a); writeln;
zap(m,b); writeln('massiv B'); vivod(m,b); writeln;
zap(m+5,c); writeln('massiv C'); vivod(m+5,c); writeln;
nax(m,a,k1); nax(m,b,k2); nax(m+5,c,k3);
writeln('kol-vo otriz v masA= ',k1);
writeln('kol-vo otriz v masB= ',k2);
writeln('kol-vo otriz v masC= ',k3);
if (k1<k2) and (k1<k3) then begin umnog(m,x,a); vivod(m,a) end else
if (k2<k1) and (k2<k3) then begin umnog(m,sqr(x),b); vivod(m,b) end else
if (k3<k1) and (k3<k2) then begin umnog(m+5,x/10,c); vivod(m+5,c) end else
writeln('kol-va ravni');
readln
End.


Задание: Дано целое число М, вещественное число Х, вещественные кортежи А,В[1..М], C[1..M+5]. Кортеж, имеющий наименьшее кол-во отриц элементов(в предположении, что такой кортеж один), домножить на R, где R=X для кортежа А, R=sqr(x) для кортежа В и R=X/10 для кортежа С

Автор: volvo 25.12.2008 5:18

Цитата(Eskel @ 24.12.2008 23:59) *
Препод сказал, что я неправильно открытый массив использовал:
Правильно сказал: открытые массивы всегда индексируются с 0, а не с 1-цы, так что либо меняй границы циклов (что предпочтительно), либо f[ i ] меняй на f[i - 1] там, где работаешь с открытым массивом.

Автор: Eskel 25.12.2008 5:26

я так понимаю i:=0 to k-1

Автор: volvo 25.12.2008 5:55

Я б на твоем месте вообще вот так сделал:

Program art2;
uses crt;

procedure zap(var f: array of real);
var
i:integer;
begin
for i := low(f) to high(f) do
f[i] := 200 * random - 100
end;

procedure vivod(const f: array of real);
var
i: integer;
begin
for i := low(f) to high(f) do
write(f[i] :3 :1, '':1);
writeln;
end;

procedure nax(const f: array of real; var r:integer);
var
i: integer;
begin
r := 0;
for i := low(f) to high(f) do
if f[i] < 0 then inc®
end;

procedure umnog(r: real; var f:array of real);
var
i: integer;
begin
for i := low(f) to high(f) do
f[i] := f[i] * r
end;

const m=15;
var
a, b: array[1..m] of real;
c: array[1..m+5] of real;
x: real; k1,k2,k3: integer;


begin
clrscr;
randomize;
write('vvedite x '); readln(x);
zap(a); writeln('massiv A'); vivod(a);
zap(b); writeln('massiv B'); vivod(b);
zap©; writeln('massiv C'); vivod©;

nax(a, k1); nax(b, k2); nax(c, k3);
writeln('kol-vo otriz v masA= ',k1);
writeln('kol-vo otriz v masB= ',k2);
writeln('kol-vo otriz v masC= ',k3);

if (k1<k2) and (k1<k3) then begin umnog(x,a); vivod(a) end
else
if (k2<k1) and (k2<k3) then begin umnog(sqr(x),b); vivod(b) end
else
if (k3<k1) and (k3<k2) then begin umnog(x/10,c); vivod© end
else writeln('kol-va ravni');
readln
end.