Показать полную графическую версию : Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе
yulia_hoi
05-01-2010, 19:35
Помогите пожалуйста глупой студентке-блондинке. не понимаю, где ошибка, не понимаю. ничего не пашет, ни-че-го.
Обработка массивов данных
Входной массив
А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.
yulia_hoi, оформи пожалуйста тегом кода, расставь табуляцию и комментарии. А тож не видать ни чего. :(
Разобраться с кодом не смог :), может потому, что писала блондинка ))), поэтому написал свое решение
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.
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, прикуси язычок ;-)
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. Главную диагональ квадратной матрицы образуют элементы с одинаковым индексом строки и столбца
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 сравнений будет проделано впустую. Условие не выполнится.
Конечно для современных ПК на малых размерностях это тьфу. Но если мы возьмем куб размерность в пару миллионов, то будет швах!
Берем определение главной диагонали. Главную диагональ квадратной матрицы образуют элементы с одинаковым индексом строки и столбца »
образуют элементы с одинаковым индексом строки и столбца.
Диагональю мы можем назвать линию начинающуюся с элемента 1;1 и заканчивающуюся элементом N;N. При условии равенства индексов.
Если рисовать на листе бумаги, то при стандартном расположении (осей X вправо Y вверх) (заметь матрица будет перевернута) это будет прямая f(y)=x
Так может ее проще нарисовать, чем сравнивать все точки плоскости на принадлежность к линии?
Наглядный пример:
Мы можем нарисовать кривую y=ax^2+bx+c (парабола). А можем анализировать все точки плоскости с точностью отклонения до Е(эпсилон) от заданной кривой.
Соотв. порядки трудозатрат будут существенно различны.
Отлично, тогда нужно исправить процедуру
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.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.