Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Двумерные массивы (http://www.tehnari.ru/f41/t249853/)

АсяЯ 05.11.2016 18:09

Двумерные массивы
 
Помогите пожалуйста решить 3 задачи
Модифицировать программу так, чтобы она осуществляла поиск подматрицы n,в которой сумма элементов главной диагонали наибольшая
writeln('Введите размер подматрицы:');readln(m);
randomize;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=trunc(random*50) ;
writeln('Сформированная матрица');
for i:= 1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
for i:=1 to m do
for j:=1 to m do
if i=j then s:=s+a[i,j];
for l:=1 to n-m+1 do
for k:=1 to n-m+1 do
begin
for i:=1 to m do
for j:=1 to m do
b[i,j]:=a[l+i-1,k+j-1];
s:=0;
for i:=1 to m do
for j:=1 to m do
if i=j then s:=s+b[i,j];
if s>max then
begin
end;
end;
writeln('Сумма элементов=',s);
end.
Модифицировать программу так, чтобы она находила решение системы алгебраических уравнений 4 порядка с любыми вещественными коэффициентами
program zadazna_5;
const
a:array[1..3,1..3] of integer=((2,1,1),(1,2,1),(1,1,2));
b:array[1..3] of integer=(7,8,9);
var
i,j:integer;
delta,delta1,delta2,delta3,x1,x2,x3:real;
begin
delta:=a[1,1]*a[2,2]*a[3,3]+a[1,2]*a[2,3]*a[3,1]+a[1,3]*a[2,1]*a[3,2]-a[3,1]*a[2,2]*a[1,3]-a[3,2]*a[2,3]*a[1,1]-a[3,3]*a[2,1]*a[1,2];
delta1:=b[1]*a[2,2]*a[3,3]+a[1,2]*a[2,3]*b[3]+a[1,3]*b[2]*a[3,2]-b[3]*a[2,2]*a[1,3]-a[3,2]*a[2,3]*b[1]-a[3,3]*b[2]*a[1,2];
delta2:=a[1,1]*b[2]*a[3,3]+b[1]*a[2,3]*a[3,1]+a[1,3]*a[2,1]*b[3]-a[3,1]*b[2]*a[1,3]-b[3]*a[2,3]*a[1,1]-a[3,3]*a[2,1]*b[1];
delta3:=a[1,1]*a[2,2]*b[3]+a[1,2]*b[2]*a[3,1]+b[1]*a[2,1]*a[3,2]-a[3,1]*a[2,2]*b[1]-a[3,2]*b[2]*a[1,1]-b[3]*a[2,1]*a[1,2];
x1:=delta1/delta;
x2:=delta2/delta;
x3:=delta3/delta;
writeln('Найденное решение:');
writeln('x1=',x1,'x2=',x2,'x3=',x3);
end.
program zadazna_3;
label vozvrat;
var
i,j,k,n,m,s:integer;
c:array[1..100,1..100] of integer;
begin
vozvrat:
write('Введите размер матрицы:'); read(n);
if(n<10)or (n>-10) then
begin
writeln
randomize;
k:=0;
m:=0;
for i:=1 to n do
for j:=1 to n do
begin
c[i,j]:=random(10);
if c[i,j]>0 then
if j0 then inc(s);
m:=s*k;
end;
end;
for i:=1 to n do
begin
for j:=1 to n do
writeln('***************************************** ');
end;
writeln('Количество нулевых=',k);
writeln('Произведение положительных чисел=',m);
end;
end.

Модифицировать программу так, чтобы она находила произведение положительных и количество нулевых элементов матрицы, расположенных под главной диагональю. Все элементы матрицы должны принадлежать диапозону [-10;`10]

Vladimir_S 05.11.2016 19:00

Цитата:

Сообщение от АсяЯ (Сообщение 2431075)
Модифицировать программу так, чтобы она осуществляла поиск подматрицы n,в которой сумма элементов главной диагонали наибольшая

Простите, но модифицировать Ваши программы я не буду - проще написать свою. Например, так:
Код:

Const
 n=10;

Var
 m,i,j,p,q,r,Pmax,Qmax:byte;
 S,Smax:Word;
 a,b:Array[1..n,1..n] of Byte;

Begin
 Smax:=0;
 writeln('Enter the submatrix dimention (<',n,'):');
 readln(m);
 randomize;
 for i:=1 to n do
  for j:=1 to n do
  a[i,j]:=random(50);

 writeln('Formed matrix:');
 for i:=1 to n do
  begin
  for j:=1 to n do
    write(a[i,j]:4);
  writeln;
  end;
 Writeln('Press "Enter" to continue');
 Readln;

 for p:=0 to n-m do
  for q:=0 to n-m do
  begin
    for i:=1 to m do
    for j:=1 to m do
      b[i,j]:=a[p+i,q+j];
    S:=0;
    for r:=1 to m do
    S:=S+b[r,r];
    if S>Smax then
    begin
      Pmax:=p;
      Qmax:=q;
      Smax:=S;
    end;
  end;

 writeln('Submatrix with largest sum of diagonal elements:');
 for i:=1 to m do
  begin
  for j:=1 to m do
    write(a[Pmax+i,Qmax+j]:4);
  writeln;
  end;

 Readln
End.

Парочка ремарок общего плана.
1. Если Вам нужно получать ЦЕЛЫЕ случайные числа, то это делается с помощью оператора Random(N), т.е. С АРГУМЕНТОМ. Например, Random(50) возвращает ЦЕЛЫЕ числа в диапазоне от 0 до 49 включительно. Действительные числа от 0 до 1 возвращает оператор Random БЕЗ АРГУМЕНТА. Здесь его использовать не надо.
2. При поиске суммы диагональных элементов квадратной матрицы двойной цикл с отбором по i=j НЕ НУЖЕН. Гораздо проще так:
for i:=1 to n do S:=S+a[i,i];

Vladimir_S 05.11.2016 19:21

Цитата:

Сообщение от АсяЯ (Сообщение 2431075)
Модифицировать программу так, чтобы она находила решение системы алгебраических уравнений 4 порядка с любыми вещественными коэффициентами

Свою программу решения систем линейных уравнений методом Гаусса я уже несколько раз выкладывал. Например, здесь: http://www.tehnari.ru/f41/t93745/#post991548

Vladimir_S 05.11.2016 19:30

Цитата:

Сообщение от АсяЯ (Сообщение 2431075)
write('Введите размер матрицы:'); read(n);
if(n<10)or (n>-10) then

АсяЯ, ну что, ей Богу, за бредятина?! Где Вы видели матрицу ОТРИЦАТЕЛЬНОЙ размерности?! Ну не бывает такого! Не бывает, да и всё тут! Совсем. Абсолютно. И потом, АБСОЛЮТНО ЛЮБОЕ число либо меньше 10, либо больше -10. Так что условный оператор бессмыслен.
По всей вероятности, речь в задаче идёт о диапазоне значений элементов матрицы.
Кроме того, ну что это за метка vozvrat? Зачем? К чему? Вообще я настоятельно рекомендую Вам ЗАБЫТЬ об этих гнусных Label и Goto: они должны применяться в абсолютно исключительных случаях, к каковым Ваш не относится.
Вообще же последняя задачка столь проста, что Вы, я уверен, сможете грамотно написать программу самостоятельно.
Конечно, поможем, если что.

АсяЯ 05.11.2016 23:57

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

АсяЯ 06.11.2016 00:02

id377261884
можете вк написать мне

Vladimir_S 06.11.2016 08:33

Цитата:

Сообщение от АсяЯ (Сообщение 2431226)
но это паскаль..((((

А у меня что - Фортран что ли? Паскаль и есть.
Цитата:

Сообщение от АсяЯ (Сообщение 2431226)
и задание именно модифицировать.

Всё, что можно было сохранить из Вашей программы, я сохранил. Так что считайте, что "модифицировал".
Цитата:

Сообщение от АсяЯ (Сообщение 2431229)
можете вк написать мне

Не... давайте здесь.

Vladimir_S 06.11.2016 08:44

Ух, только что рассмотрел: Вам решение системы линейных уравнений нужно ЧЕРЕЗ ОПРЕДЕЛИТЕЛИ? Четвертого порядка?!! Ну уж нет, увольте: тут надо либо выписывать на целую страницу компоненты-произведения, причем ни разу не наврать, что почти невозможно, либо клепать процедуру, лучше рекурсивную, позволяющую вычислить определитель любого порядка через разложение по минорам с учётом алгебраических дополнений.
И то, и другое - дурная, муторная и тяжелая работа. А главное, ненужная: метод Гаусса гораздо проще и эффективней. Хотя, конечно, исследовать систему на совместимость с определителями легче. Но вот считать их...

Vladimir_S 06.11.2016 11:29

Ладно, нарисовал всё-таки решение последней задачи. Обратите внимание на тип произведения: это очень большое число, поэтому никакое Integer тут не годится.
Код:

Const
 Nmax=12;

var
 i,j,k,n:integer;
 m:Extended;
 c:array[1..Nmax,1..Nmax] of integer;

begin
 write('Enter the matrix dimension (n<=',Nmax,'): ');
 readln(n);
 randomize;
 for i:=1 to n do
  begin
  for j:=1 to n do
    begin
    c[i,j]:=-10+random(21);
    Write(c[i,j]:5);
    end;
  writeln;
  end;

 k:=0;
 m:=1;
 for i:=2 to n do
  for j:=1 to i-1 do
  begin
    if c[i,j]=0 then Inc(k);
    if c[i,j]>0 then m:=m*c[i,j];
  end;

 writeln('***************************************** ');
 writeln('Number of zero elements = ',k);
 writeln('Product of positive elements = ',m:0:0);
 Readln
end.


АсяЯ 06.11.2016 12:49

Спасибо огромное.


Часовой пояс GMT +4, время: 13:45.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.