|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе |
|
Разное - Обработка массивов данных, программа на паскале. Не могу найти ошибку в программе
|
Новый участник Сообщения: 1 |
Профиль | Отправить PM | Цитировать
Помогите пожалуйста глупой студентке-блондинке. не понимаю, где ошибка, не понимаю. ничего не пашет, ни-че-го.
Обработка массивов данных Входной массив А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 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать yulia_hoi, оформи пожалуйста тегом кода, расставь табуляцию и комментарии. А тож не видать ни чего.
|
------- Отправлено: 22:06, 05-01-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Misanthrope Сообщения: 474
|
Профиль | Отправить 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. |
------- Отправлено: 19:50, 07-01-2010 | #3 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить 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; Вот этого я не понял. Все остальное должно работать. Ну можно конечно красоты и порядку ради вывод массивов в процедуру оформить. Опять же у e-Hector, это наглядно сделано. Зачем нужен random(10)-1 ? это даст разброс от -1 до 9. Дело хозяйское, я просто интересуюсь. Ошибки тут нет. Общее для всех замечание. Что называется главной диагональю в квадратной матрице? Зачем перебирать весь квадрат совершая n^2-n ненужных операций сравнений? Легко заменяется на P.S. т.ч. e-Hector, прикуси язычок ;-) |
------- Отправлено: 03:05, 08-01-2010 | #4 |
Misanthrope Сообщения: 474
|
Профиль | Отправить 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. Главную диагональ квадратной матрицы образуют элементы с одинаковым индексом строки и столбца |
|
------- Отправлено: 13:46, 08-01-2010 | #5 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить 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 (парабола). А можем анализировать все точки плоскости с точностью отклонения до Е(эпсилон) от заданной кривой. Соотв. порядки трудозатрат будут существенно различны. |
|
------- Отправлено: 14:32, 08-01-2010 | #6 |
Misanthrope Сообщения: 474
|
Профиль | Отправить 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. |
------- Последний раз редактировалось Hector, 08-01-2010 в 16:26. Отправлено: 14:50, 08-01-2010 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|