Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе

Ответить
Настройки темы
Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 05-01-2010
Описание: [code]...[/code] - Тег код - #
Помогите пожалуйста глупой студентке-блондинке. не понимаю, где ошибка, не понимаю. ничего не пашет, ни-че-го.

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

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

А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.

Отправлено: 19:35, 05-01-2010

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 22:06, 05-01-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Hector

Misanthrope


Сообщения: 474
Благодарности: 38

Профиль | Отправить PM | Цитировать


Разобраться с кодом не смог , может потому, что писала блондинка ))), поэтому написал свое решение
Код: Выделить весь код
 
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.

-------
Information must be free!
Нет границ, есть только препятствия


Отправлено: 19:50, 07-01-2010 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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, прикуси язычок ;-)

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 03:05, 08-01-2010 | #4


Аватара для Hector

Misanthrope


Сообщения: 474
Благодарности: 38

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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. Главную диагональ квадратной матрицы образуют элементы с одинаковым индексом строки и столбца

-------
Information must be free!
Нет границ, есть только препятствия


Отправлено: 13:46, 08-01-2010 | #5


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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 (парабола). А можем анализировать все точки плоскости с точностью отклонения до Е(эпсилон) от заданной кривой.
Соотв. порядки трудозатрат будут существенно различны.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:32, 08-01-2010 | #6


Аватара для Hector

Misanthrope


Сообщения: 474
Благодарности: 38

Профиль | Отправить PM | Цитировать


Отлично, тогда нужно исправить процедуру
Код: Выделить весь код
 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.

-------
Information must be free!
Нет границ, есть только препятствия


Последний раз редактировалось Hector, 08-01-2010 в 16:26.


Отправлено: 14:50, 08-01-2010 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MySQL - Битовая обработка данных pralev Программирование и базы данных 2 03-12-2007 11:59
Проблема: редактирование данных о своей программе K.A.V. О сайте и форуме 4 19-08-2007 12:29
Прошу помочь найти ошибку в программе. Sox Программирование в *nix 15 05-12-2005 08:47
*Решено* | Обработка массивов в С++ Shad0VV Программирование и базы данных 7 15-10-2005 19:59
JavaScript, не могу найти ошибку modem Вебмастеру 3 01-03-2005 15:08




 
Переход