Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе (http://forum.oszone.net/showthread.php?t=162483)

yulia_hoi 05-01-2010 19:35 1311690

Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе
 
Помогите пожалуйста глупой студентке-блондинке. не понимаю, где ошибка, не понимаю. ничего не пашет, ни-че-го.

Обработка массивов данных

Входной массив

А4х4

Формируемый массив

В4х4, где

b= 2i+j,если i>j
i+2j, иначе

i=1,…,4 j=1,…,4

Условие задачи

Выделить главные диагонали матриц А и В в одномерные массивы (А1 И В1 соответственно). Упорядочить массивы А1 И В1 в порядке убывания значений элементов (массивы А2 и В2 соответственно). Найти среднее арифметическое значение элементов массива А2 (SrB2)
Вывести: В, А1, В1, А2, В2, SrA1, SrB2)

сама программа:
Код:

Program Variant24;
 Uses CRT;
 Const m=4;
  Var a,b:array [1..m,1..m] of integer;
      a1,b1,a2,b2:array[1..m] of integer;
      sra2,srb2:real;
      i,j:integer;
Procedure uprmass(c:array of integer);
 var i,j,r:integer;
    flag:boolean;
 begin
  for i:=2 to m do
    begin
    flag:=true;
      for j:=m downto i do
      if c[j-1]>c[j] then begin
                            r:=c[j-1];
                            c[j-1]:=c[j];
                            c[j]:=r;
                            flag:=false;
                          end;
      if flag then break;
    end;
 end;
Begin
 clrscr;
 randomize;
  for i:=1 to m do
  for j:=1 to m do
    a[i,j]:=random(10)-1;
  Writeln(' Massiv A:');
  for i:=1 to m do
    begin
    for j:=1 to m do
      write(' ',a[i,j],' ');
    writeln;
    end;
  for i:=1 to m do
  for j:=1 to m do
    if i>j then b[i,j]:=2*i+j
            else b[i,j]:=i+2*j;
  Writeln(' Massiv B:');
  for i:=1 to m do
  begin
    for j:=1 to m do
      write(' ',b[i,j],' ');
    writeln;
  end;
  for i:=1 to m do
    for j:=1 to m do
    if i=j then begin
                  a1[i]:=a[i,j];
                  b1[i]:=b[i,j];
                end;
  Writeln(' Massiv A1:');
  for i:=1 to m do
    write(' ',a1[i]);
  writeln;
  Writeln(' Massiv B1:');
  for i:=1 to m do
    write(' ',b1[i]);
  uprmass(a1);
  uprmass(b1);
  for i:=1 to m do
    begin
    a2[i]:=a1[m-i+1];
    b2[i]:=b1[m-i+1];
    end;
  Writeln;
  Writeln(' Massiv A2:');
  for i:=1 to m do
    Write(' ',a2[i]);
  writeln;
  Writeln(' Massiv B2:');
  for i:=1 to m do
    write(' ',b2[i]);
  sra2:=0;
  srb2:=0;
 for i:=1 to m do
  begin
  sra2:=sra2+a2[i];
  srb2:=srb2+b2[i];
  end;
  sra2:=sra2/m;
  srb2:=srb2/m;
 Writeln;
 writeln(' Srednee arifmeticheskoe znachenie elementov massiva A2: ',sra2);
 writeln(' Srednee arifmeticheskoe znachenie elementov massiva B2: ',srb2);
 readln;
End.


lxa85 05-01-2010 22:06 1311863

yulia_hoi, оформи пожалуйста тегом кода, расставь табуляцию и комментарии. А тож не видать ни чего. :(

Hector 07-01-2010 19:50 1313467

Разобраться с кодом не смог :), может потому, что писала блондинка ))), поэтому написал свое решение
Код:


program OSZone;
{This program created by e-Hector}
uses crt;
type
mt=array[1..10,1..10] of integer;
ms=array[1..10] of integer;
var
A, B:mt;
A1, B1, A2, B2:ms;
i, j:integer;
const
h=4;

procedure gl_diag (var m:mt; var r:ms); {Выделение главной диагонали в массив}
var
k:integer;
begin
k:=1;
for i:=1 to h do
  for j:=1 to h do
    if i=j then
    begin
    r[k]:=m[i,j];
    k:=k+1;
    end;
end;

procedure sort(var r, g:ms); {Создание сортированного массива}
var
buf:integer;
begin
for i:=1 to h do
  g[i]:=r[i];
for i:=1 to h-1 do
  for j:=i to h do
  if g[i]<g[j] then
    begin
    buf:=g[i];
    g[i]:=g[j];
    g[j]:=buf;
    end;
end;

function srz(g:ms):real; {Вычисление средне арифметического}
var
s:integer;
begin
s:=0;
for i:=1 to h do
s:=s+g[i];
srz:=s/h;
end;

procedure out_mass (g:ms); {Вывод массива}
begin
write('[ ');
for i:=1 to h do
  write(g[i],' ');
writeln(']');
end;

begin                        {Основная программа}
clrscr;
randomize;
for i:=1 to h do              {Заполнение матрицы А}
  for j:=1 to h do
  A[i,j]:=random(10);
for i:=1 to h do              {Формирование матрицы В}
  for j:=1 to h do
  if i>j then B[i,j]:=2*i+j
          else B[i,j]:=i+2*j;
gl_diag(A,A1);
gl_diag(B,B1);
sort(A1,A2);
sort(B1,B2);
writeln('Matrica B');
for i:=1 to h do
  begin
  for j:=1 to h do
  write(B[i,j],' ');
  writeln;
  end;
write('Massiv A1 ');
out_mass(A1);
write('Massiv B1 ');
out_mass(B1);
write('Massiv A2 ');
out_mass(A2);
write('Massiv B2 ');
out_mass(B2);
writeln('Srednee A2: ',srz(A2):2:2);
writeln('Srednee B2: ',srz(B2):2:2);
readln;
end.


lxa85 08-01-2010 03:05 1313845

yulia_hoi, e-Hector, насочиняли вы тут конечно ...
e-Hector, обрати внимание как девушка задает массивы. Использование одной константы более правильный подход.
yulia_hoi,
Ты что-то перемудрила с сортировкой. Зачем-то вписать downto т.е. сравниваешь элементы двигаясь на встречу друг другу.
Возьми процедуру e-Hector`а. (Доработав "под себя")
Код:

procedure sort(var r, g:ms); {Создание сортированного массива}
var
buf:integer;
begin
for i:=1 to h do
  g[i]:=r[i];
for i:=1 to h-1 do
  for j:=i to h do
  if g[i]<g[j] then
    begin
    buf:=g[i];
    g[i]:=g[j];
    g[j]:=buf;
    end;
end;

Это простейшая сортировка пузырьком.
Вот этого я не понял.
Код:

  for i:=1 to m do
    begin
    a2[i]:=a1[m-i+1];
    b2[i]:=b1[m-i+1];
    end;

Все остальное должно работать. Ну можно конечно красоты и порядку ради вывод массивов в процедуру оформить.
Опять же у e-Hector, это наглядно сделано.
Зачем нужен random(10)-1 ? это даст разброс от -1 до 9. Дело хозяйское, я просто интересуюсь. Ошибки тут нет.

Общее для всех замечание.
Что называется главной диагональю в квадратной матрице?
Зачем перебирать весь квадрат совершая n^2-n ненужных операций сравнений?
Код:

  for i:=1 to m do
    for j:=1 to m do
    if i=j then begin
                  a1[i]:=a[i,j];
                  b1[i]:=b[i,j];
                end;

Легко заменяется на
Код:

  for i:=1 to m do
                  a1[i]:=a[i,i];
                  b1[i]:=b[i,i];
                end;

P.S. т.ч. e-Hector, прикуси язычок ;-)

Hector 08-01-2010 13:46 1314093

Код:

procedure sort(var r, g:ms); {Создание сортированного массива}
var
buf:integer;
begin
for i:=1 to h do
  g[i]:=r[i];
for i:=1 to h-1 do
  for j:=i to h do
  if g[i]<g[j] then
    begin
    buf:=g[i];
    g[i]:=g[j];
    g[j]:=buf;
    end;
end;

Вообще-то это сортировка методом исключения, но это непринципиально
lxa85, а можно подробнее насчет последнего замечания? Объясни саму логику.
P. S. Главную диагональ квадратной матрицы образуют элементы с одинаковым индексом строки и столбца

lxa85 08-01-2010 14:32 1314147

e-Hector, Смотри, когда в твоем алгоритме перебирается вся матрица.
for i:=1 to m do
for j:=1 to m do
Потом производится сравнение индексов столбца и строки.
if i=j then
Если это так, то i = j т.е. при адресация элемента массива a[ I , J ] и a [ I, I ] не имеет различий в силу выполнения означенного условия.
Из всего массива размерностью N, содержащего N^2 элементов, выберется только диагональ, т.е. N элементов.
N^2 - N сравнений будет проделано впустую. Условие не выполнится.
Конечно для современных ПК на малых размерностях это тьфу. Но если мы возьмем куб размерность в пару миллионов, то будет швах!

Берем определение главной диагонали.
Цитата:

Цитата e-Hector
Главную диагональ квадратной матрицы образуют элементы с одинаковым индексом строки и столбца »

образуют элементы с одинаковым индексом строки и столбца.
Диагональю мы можем назвать линию начинающуюся с элемента 1;1 и заканчивающуюся элементом N;N. При условии равенства индексов.
Если рисовать на листе бумаги, то при стандартном расположении (осей X вправо Y вверх) (заметь матрица будет перевернута) это будет прямая f(y)=x
Так может ее проще нарисовать, чем сравнивать все точки плоскости на принадлежность к линии?

Наглядный пример:
Мы можем нарисовать кривую y=ax^2+bx+c (парабола). А можем анализировать все точки плоскости с точностью отклонения до Е(эпсилон) от заданной кривой.
Соотв. порядки трудозатрат будут существенно различны.

Hector 08-01-2010 14:50 1314160

Отлично, тогда нужно исправить процедуру
Код:

procedure gl_diag (var m:mt; var r:ms); {Выделение главной диагонали в массив}
var
k:integer;
begin
k:=1;
for i:=1 to h do
  for j:=1 to h do
    if i=j then
    begin
    r[k]:=m[i,j];
    k:=k+1;
    end;
end;

на
Код:

procedure gl_diag (var m:mt; var r:ms); {Выделение главной диагонали в массив}
begin
for i:=1 to h do
r[i]:=m[i,i];
end;

Оптимизация :)

Итого, с учетом замечаний
Код:

program OSZone;
{This program created by e-Hector}

uses crt;

const
h=4;

type
mt=array[1..h,1..h] of integer;
ms=array[1..h] of integer;

var
A, B:mt;
A1, B1, A2, B2:ms;
i, j:integer;

procedure gl_diag (var m:mt; var r:ms); {Выделение главной диагонали в массив}
begin
for i:=1 to h do
  r[i]:=m[i,i];
end;

procedure sort(var r, g:ms); {Создание сортированного массива}
var
buf:integer;
begin
for i:=1 to h do
  g[i]:=r[i];
for i:=1 to h-1 do
  for j:=i to h do
  if g[i]<g[j] then
    begin
      buf:=g[i];
      g[i]:=g[j];
      g[j]:=buf;
    end;
end;

function srz(g:ms):real; {Вычисление средне арифметического}
var
s:integer;
begin
s:=0;
for i:=1 to h do
  s:=s+g[i];
srz:=s/h;
end;

procedure out_mass (g:ms); {Вывод массива}
begin
write('[ ');
for i:=1 to h do
  write(g[i],' ');
writeln(']');
end;

begin                        {Основная программа}
clrscr;
randomize;
for i:=1 to h do              {Заполнение матрицы А}
  for j:=1 to h do
  A[i,j]:=random(10);
for i:=1 to h do              {Формирование матрицы В}
  for j:=1 to h do
  if i>j then B[i,j]:=2*i+j
          else B[i,j]:=i+2*j;
gl_diag(A,A1);
gl_diag(B,B1);
sort(A1,A2);
sort(B1,B2);
writeln('Matrica B');
for i:=1 to h do
  begin
  for j:=1 to h do
    write(B[i,j],' ');
  writeln;
  end;
write('Massiv A1 ');
out_mass(A1);
write('Massiv B1 ');
out_mass(B1);
write('Massiv A2 ');
out_mass(A2);
write('Massiv B2 ');
out_mass(B2);
writeln('Srednee A2: ',srz(A2):2:2);
writeln('Srednee B2: ',srz(B2):2:2);
readln;
end.



Время: 21:27.

Время: 21:27.
© OSzone.net 2001-