• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Программирование матричных операций

  • Автор темы Автор темы turcia7
  • Дата начала Дата начала

turcia7

Новые
Регистрация
5 Ноя 2012
Сообщения
25
Реакции
0
Баллы
0
Программирование матричных операций

Помогите пожалуйста)
Разработать программу решения четырех взаимосвязанных задач частой работы:
1) расчета элементов квадратной матрицы A = (ai,j ), i,j = 1,2,...,n по заданной формуле;
2) вычисления элементов вектора X = (xi), i = 1,2,...,n по заданному правилу;
3) требуемого упорядочения элементов матрицы А или вектора Х;
4) вычисления значения y по заданной формуле.
Размерность задачи n назначается преподавателем.
ниже на скринах представленны задание и пример блок схему
есть образец программы

Program Lab5;
const n=5;
type matr=array[1..n, 1..n] of real;
vect=array[1..n] of real;
var
i, j : integer;
y:real;
a : matr;
x : vect;


Procedure _matrica(n:integer; A:matr);
var i, j : integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=Sin(i)/Cos(i)+Cos(j)/Sin(j);
write (A[i,j]:8:3);
end;
writeln;
end;
end;

Procedure Matrica(n:integer; var A:matr);
var i,j:integer;
Begin
for i:=1 to n do
for j:=1 to n do
a[i,j]:=Sin(i)/Cos(i)+Cos(j)/Sin(j);
End;

Procedure Vector(n:integer; A:matr; var x:vect);
var i,j,k:integer;
s:real;
Begin
Writeln;
Writeln;
writeln('********************************');
for j:=1 to n do
Begin
s:=A[1,1];
for i:=1 to n do
Begin
k:=j mod 2;
if (A[i,j]>s) and (k=0) then s:=A[i,j] else begin
if (A[i,j]<s) and (k<>0) then s:=A[i,j];
End;end;
x[j]:=s;
End;
End;

Procedure Porjdok(n:integer; var A:matr);
var i,j:integer;
c:real;
Begin
Writeln;
Writeln;
writeln('***************************');
for i:=1 to n do
for j:=i+1 to n do
Begin
if Abs(a[1,i])>Abs(a[1,j]) then
Begin
c:=a[1,i];
a[1,i]:=a[1,j];
a[1,j]:=c;
End;
End;
End;

Function Fyn(n:integer; X:vect):real;
Var i,k:integer;
s, y:real;
Begin
Writeln;
Writeln;
writeln('******************************************');
y:=0;
i:=2;
while i <= n do
Begin
s:=0;
y:=y + (x*x[n+1-i]);
i:=i+2;
End;
k := 1;
for i:=1 to n do k:=k*i;
y:=y/k;
Fyn:=y;
End;


begin
matrica(n, a);
Writeln(' ':20,'MATPICA A');
for i:=1 to n do
Begin
for j:=1 to n do Write(a[i,j]:8:3);
writeln;
End;

Vector(n,a,x);
Writeln(' ':20,'BEKTOP X');
for i:=1 to n do write(x:8:3);
writeln;
Porjdok(n,a);
Writeln(' ':5,'YPOR 1 CTROKI MATPICU A');
for i:=1 to n do
Begin
for j:=1 to n do Write(a[i,j]:8:3);
writeln;
End;
y:=Fyn(n,x);
Writeln('Rez y= ',y:10:3);

readln;
end.
 

Вложения

  • Безымянный.webp
    Безымянный.webp
    14.8 KB · Просмотры: 234
  • 1.webp
    1.webp
    9.4 KB · Просмотры: 195
  • 2.webp
    2.webp
    9.8 KB · Просмотры: 197
  • 3.webp
    3.webp
    10 KB · Просмотры: 139
  • 4.webp
    4.webp
    5.1 KB · Просмотры: 125
  • 5.webp
    5.webp
    5.3 KB · Просмотры: 193
Помогите кто-нибудь пожалуйста
 
Помочь, конечно, можно, но...
1. Правильно ли я понимаю, что выложенные листинги - это "пример", а само задание - на рисунке? Или наоборот?
2. Простите великодушно, но смысл пунктов 3 и 4 до меня не доходит напрочь. В чем состоит задание? Можно подробнее?
 
Задание которое написано это в общем. Само задание на скрине "Вариант 50"
Начал писать программу, но не знаю как среднеарифметическое значение положительных чисел i-ой строки написать
 
Среднее арифм. сумма всех элементов разделить на их кол-во.
 
да это то без проблем...как это в программе изобразить
 
Надо вывести, для начала матрицу, элементы которой рассчитываются по 1 формуле.
далее надо вывести на экран вектор Х, элементы которого определяются по 2 заданию.
далее необходимо вывести на экран, тоже можно сказать, вектор, элементами которого будут элементы матрицы но упорядоченные по возрастанию.ну и в конце необходимо вычислить значение функции У
 
Надо вывести, для начала матрицу, элементы которой рассчитываются по 1 формуле.
далее надо вывести на экран вектор Х, элементы которого определяются по 2 заданию.
далее необходимо вывести на экран, тоже можно сказать, вектор, элементами которого будут элементы матрицы но упорядоченные по возрастанию.ну и в конце необходимо вычислить значение функции У
Ах ты ж, а я третью снизу строку (у = ...) приписываю к третьему пункту, смотрю, как баран, и ничего понять не могу. Ладно, разобрался, сделаю.

Всё, получИте и распишитесь:

Код:
Program Lab5;
const
 N=5;
type
 matr=array[1..N, 1..N] of real;
 vect=array[1..N] of real;
var
 Y:real;
 A:matr;
 X:vect;


Procedure Matrica;
var i,j:integer;

function sign(q:integer):integer;
begin
 if (q mod 2)=0 then sign:=1 else sign:=-1;
end;

begin
 for i:=1 to N do
  begin
   for j:=1 to N do
    begin
     A[i,j]:=sign(i+j)*(4.3-i)/Abs(0.2-i*j)/N;
     write(A[i,j]:8:3);
    end;
   writeln;
  end;
 writeln;
end;

Procedure Vector;
var
 i,j,k:integer;
 s:real;
begin
 for i:=1 to N do
  begin
   k:=0;
   s:=0;
   for j:=1 to N do
    if A[i,j]>0 then
     begin
      s:=s+A[i,j];
      Inc(k);
     end;
   if k>0 then X[i]:=s/k else X[i]:=0;
   Writeln('X[',i,']= ',X[i]:0:3);
  end;
 Writeln;
end;

Procedure Porjadok;
var
 i,j,k:integer;
 c:real;
begin
 for j:=1 to N do
  for i:=1 to N-1 do
   for k:=1 to N-i do
    if A[k,j]>A[k+1,j] then
     begin
      c:=A[k,j];
      A[k,j]:=A[k+1,j];
      A[k+1,j]:=c;
     end;
 for i:=1 to N do
  begin
   for j:=1 to N do
    Write(A[i,j]:8:3);
   Writeln;
  end;
 Writeln;
end;

Procedure Fun;
var
 Max,Min:Real;
 i:Integer;
begin
 Max:=X[1];
 Min:=X[1];
 For i:=2 to N do
  begin
   if X[i]>Max then Max:=X[i];
   if X[i]<Min then Min:=X[i];
  end;
 Y:=(Max-Min)/2;
 Write('Y= ',Y:0:3);
end;

Begin
 Matrica;
 Vector;
 Porjadok;
 Fun;
 Readln
End.
 
Не могли бы сделать так чтобы размерность N не задавалась автоматически, а мы ее задавали. И если б немного пояснили Владимир, то было бы просто отлично
 
Не могли бы сделать так чтобы размерность N не задавалась автоматически, а мы ее задавали.
Что, настолько по нулям, что с таким пустяком не справиться самостоятельно? Ладно:
Код:
Program Lab5;

const
 Nmax=10;

type
 matr=array[1..Nmax, 1..Nmax] of real;
 vect=array[1..Nmax] of real;
var
 N:Integer;
 Y:real;
 A:matr;
 X:vect;


Procedure Matrica;
var i,j:integer;

function sign(q:integer):integer;
begin
 if (q mod 2)=0 then sign:=1 else sign:=-1;
end;

begin
 for i:=1 to N do
  begin
   for j:=1 to N do
    begin
     A[i,j]:=sign(i+j)*(4.3-i)/Abs(0.2-i*j)/N;
     write(A[i,j]:8:3);
    end;
   writeln;
  end;
 writeln;
end;

Procedure Vector;
var
 i,j,k:integer;
 s:real;
begin
 for i:=1 to N do
  begin
   k:=0;
   s:=0;
   for j:=1 to N do
    if A[i,j]>0 then
     begin
      s:=s+A[i,j];
      Inc(k);
     end;
   if k>0 then X[i]:=s/k else X[i]:=0;
   Writeln('X[',i,']= ',X[i]:0:3);
  end;
 Writeln;
end;

Procedure Porjadok;
var
 i,j,k:integer;
 c:real;
begin
 for j:=1 to N do
  for i:=1 to N-1 do
   for k:=1 to N-i do
    if A[k,j]>A[k+1,j] then
     begin
      c:=A[k,j];
      A[k,j]:=A[k+1,j];
      A[k+1,j]:=c;
     end;
 for i:=1 to N do
  begin
   for j:=1 to N do
    Write(A[i,j]:8:3);
   Writeln;
  end;
 Writeln;
end;

Procedure Fun;
var
 Max,Min:Real;
 i:Integer;
begin
 Max:=X[1];
 Min:=X[1];
 For i:=2 to N do
  begin
   if X[i]>Max then Max:=X[i];
   if X[i]<Min then Min:=X[i];
  end;
 Y:=(Max-Min)/2;
 Write('Y= ',Y:0:3);
end;

Begin
 Write('N= ');
 Readln(N);
 Matrica;
 Vector;
 Porjadok;
 Fun;
 Readln
End.
И если б немного пояснили Владимир, то было бы просто отлично
Боюсь, что в свете предыдущего пункта это будет бессмысленно. Впрочем, готов ответить на конкретные вопросы.
 
вот это для чего?
Код:
function sign(q:integer):integer;
begin
 if (q mod 2)=0 then sign:=1 else sign:=-1;
end;


второй пункт оказывается ничего сложного)
третий пункт не могу понять
 
вот это для чего?
Для того, чтобы сосчитать множитель (-1) в степени (i+j). В процедуру ведена вспомогательная функция, отдающая +1 при четном аргументе и -1 при нечетном.
третий пункт не могу понять
Там делается упорядочение столбцов матрицы методом "пузырька". Подробнее об этом см. http://www.tehnari.ru/f41/t72821/.
 
понятно) мне этот кусок не нужен значит) я его на функцию power заменил
сейчас по метод "пузырька" почитаю) спасибо большое вам Владимир
 
понятно) мне этот кусок не нужен значит) я его на функцию power заменил
Не торопитесь. Не знаю, как организована функция Power в Вашем Паскале, но если вычисление идет через логарифм (а подозреваю, что так), то ничего, кроме ошибки, Вы не получите, т.к. отрицательные основания логарифма (и, соответственно, степени) недопустимы.
 
Нет нет. Все работает.
 
Назад
Сверху