1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Добрый вечер, у меня возник вот какой вопрос. Нужно написать процедуру, которая среди чисел заданной строки таблицы находит такое, которое принадлежит наибольшему количеству столбцов таблицы. Все это делается с помощью двухмерного массива. Так как я в программировании полный профан, удалось мне написать только чтобы одно число из заданой строки принадлежало наибольшему кол-ву столбцов но и там у меня есть какая то ошибка, либо там написан бред. Другая половина процедуры, где из заданной строки будет более одного числа встречаться одинаковое кол-во раз у меня не выполнена. Рассчитываю на чью-нибудь помощь.
procedure processing(var p,v,t: single; q:PMatr); var n,m,k,i,j,x,y: single; begin for k:=1 to y do begin p:q^[t]^[1]; for j:=1 to y do while i<=x do begin if p=q^[i]^[j] then begin v:=v+1; i:=x; i:=i+1; end; for j:=1 to y do while i<=x do begin if n:=q^[i]^[j] then begin n:=q^[i]^[j]; m:=m+1; i:=x i:=i+1; end; end; end;
и там у меня есть какая то ошибка, либо там написан бред
Даже не зная описания PMatr - да, там написан бред. Уже потому, что индексироваться типом Single массив не может (нужен перечислимый тип), а тебе, видно, очень хочется:
Цитата
procedure processing(var p,v,t: single; q:PMatr); { ... } p:q^[t]^[1]; { <--- А как же t: single ??? }
(далее по тексту - то же самое)
Цитата
Все это делается с помощью двухмерного массива.
Неправда. У тебя это делается с помощью структуры данных, которая имитирует динамический двумерный массив, скорее всего (еще раз - описания PMatr я не вижу, поэтому утверждать что-либо не могу).
Переписать, чтоб не было бреда, наверное? Я по крайней мере другого способа не знаю.
Для начала - уточним задание: процедура получает на вход матрицу и номер строки. Она должна вернуть максимально часто встречающееся в одном столбце число из этой строки? То есть, если у меня матрица 1, 6, 3, 4, 5 6, 3, 4, 0, 9 6, 5, 1, 3, 5 3, 8, 6, 4, 2 , и номер строки = 1, то на выходе я должен получить "3"? (поскольку 3 встречается в четырех столбцах, первом, втором, третьем и четвертом, а больше ни одно число из первой строки в четырех и более столбцах не встречается) Я правильно понял задание?
Я все понимаю, что это не рационально, однако в универе стоит именно такая задача. им требуется не рациональность, а просто насилование мозга студентам.
Для обычной статической матрицы решение может быть таким:
type tmatrix = array[1 .. 4, 1 .. 5] of real;
procedure processing(numrow: integer; q:tmatrix; rows, cols: integer; var number: real);
function Exists(row: integer; value: real): Boolean; const Eps = 0.0001; // Чтобы правильно сравнивать вещественные числа var i: Integer; begin Exists := True; for i := 1 to rows do if Abs(value - q[i, row]) < Eps then exit; Exists := False; end;
var i, j, Cnt, maxCnt: integer; maxVal: Real; begin maxCnt := 0; for i := 1 to cols do begin Cnt := 0; for j := 1 to cols do if Exists(j, q[1, i]) then Inc(Cnt);
if Cnt > maxCnt then begin number := q[1, i]; maxCnt := Cnt; end; end; end;
var value: real; begin processing(1, a, 4, 5, value); writeln(value:0 :0); end.
, для динамической - попробуй реализовать самостоятельно (только разберись в коде, а не просто копируй его). Что не получится - пиши, подскажем...
P.S. Всем супероптимизаторам: не надо супероптимизировать. Оптимизировать будете СВОЙ код у себя на машине для своих личных нужд. Чужой оставьте в покое. Это понятно? Ибо все ваши супероптимизации - пшик, в лучшем случае не вредящий, в худшем - замедляющий программу. Компилятор без вас разберется, что и как делать для конкретного процессора, указанного в настройках.
В общем написал вот так. Но тут нужно процедуру сделать функцией, булевской. Ниче не могу придумать. Помогите плиз.
Код
type Treal=real; Tmas=array [1..1] of TReal; PMas=^Tmas; TMatr=array [1..1] of PMas; PMatr=^Tmatr;
Procedure Zadanie(var mass1:PMatr;Realstr1,Realstl1,strin:integer); var m,n,q,qm:integer; mm:TReal; b:boolean; i1,j1,k1:integer; begin qm:=-5; b:=true; massmax:=mass1^[strin]^[1]; for k1:=1 to realstr do begin q:=0; b:=false; for i1:=1 to Realstl1 do begin for j1:=1 to Realstr1 do begin if (mass1^[i1]^[j1]=mass1^[strin]^[k1]) and (b=false) then begin q:=q+1; mm:=mass1^[i1]^[j1]; b:=true; end; end; b:=false; if(q>qm) then begin massmax:=mm; qm:=q; end; end; end; end;