IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Вопрос по процедуре
imouto
сообщение 21.12.2010 12:47
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Добрый вечер, у меня возник вот какой вопрос. Нужно написать процедуру, которая среди чисел заданной строки таблицы находит такое, которое принадлежит наибольшему количеству столбцов таблицы. Все это делается с помощью двухмерного массива. Так как я в программировании полный профан, удалось мне написать только чтобы одно число из заданой строки принадлежало наибольшему кол-ву столбцов но и там у меня есть какая то ошибка, либо там написан бред. Другая половина процедуры, где из заданной строки будет более одного числа встречаться одинаковое кол-во раз у меня не выполнена. Рассчитываю на чью-нибудь помощь.

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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
volvo
сообщение 21.12.2010 12:55
Сообщение #2


Гость






Цитата
и там у меня есть какая то ошибка, либо там написан бред
Даже не зная описания PMatr - да, там написан бред. Уже потому, что индексироваться типом Single массив не может (нужен перечислимый тип), а тебе, видно, очень хочется:
Цитата
procedure processing(var p,v,t: single; q:PMatr);
{ ... }
p:q^[t]^[1]; { <--- А как же t: single ??? }
(далее по тексту - то же самое)

Цитата
Все это делается с помощью двухмерного массива.
Неправда. У тебя это делается с помощью структуры данных, которая имитирует динамический двумерный массив, скорее всего (еще раз - описания PMatr я не вижу, поэтому утверждать что-либо не могу).
 К началу страницы 
+ Ответить 
imouto
сообщение 21.12.2010 13:18
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Tint=integer;
Treal=real;
TrealFile= file of Treal;
Tmas=array [1..1] of TReal;
PMas=^Tmas;
TMatr=array [1..1] of PMas;
PMatr=^Tmatr;


что делать тогда, если там бред написан?

Сообщение отредактировано: imouto - 21.12.2010 13:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 21.12.2010 14:14
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Tmas=array [1..1] of TReal;
> PMas=^Tmas;

Не лучший способ объявлять динмассив (я про 1..1). Где-то про это в ЧАВО написано...


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.12.2010 14:15
Сообщение #5


Гость






Цитата
что делать тогда, если там бред написан?
Переписать, чтоб не было бреда, наверное? Я по крайней мере другого способа не знаю.

Для начала - уточним задание: процедура получает на вход матрицу и номер строки. Она должна вернуть максимально часто встречающееся в одном столбце число из этой строки? То есть, если у меня матрица
1, 6, 3, 4, 5
6, 3, 4, 0, 9
6, 5, 1, 3, 5
3, 8, 6, 4, 2
, и номер строки = 1, то на выходе я должен получить "3"? (поскольку 3 встречается в четырех столбцах, первом, втором, третьем и четвертом, а больше ни одно число из первой строки в четырех и более столбцах не встречается) Я правильно понял задание?

Добавлено через 1 мин.
Цитата
Где-то про это в ЧАВО написано...

Как не надо писать программы, пункт 2 в этом посте...
 К началу страницы 
+ Ответить 
imouto
сообщение 21.12.2010 18:12
Сообщение #6





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Я все понимаю, что это не рационально, однако в универе стоит именно такая задача. им требуется не рациональность, а просто насилование мозга студентам.
Цитата
Я правильно понял задание?

Да, так.
Цитата
Переписать, чтоб не было бреда, наверное?

Если б я мог mega_chok.gif

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.12.2010 19:37
Сообщение #7


Гость






Для обычной статической матрицы решение может быть таким:
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;

const
a: tmatrix = (
(1, 6, 3, 4, 5),
(6, 3, 4, 0, 9),
(6, 5, 1, 3, 5),
(3, 8, 6, 4, 2)
);

var value: real;
begin
processing(1, a, 4, 5, value);
writeln(value:0 :0);
end.

, для динамической - попробуй реализовать самостоятельно (только разберись в коде, а не просто копируй его). Что не получится - пиши, подскажем...

P.S. Всем супероптимизаторам: не надо супероптимизировать. Оптимизировать будете СВОЙ код у себя на машине для своих личных нужд. Чужой оставьте в покое. Это понятно? Ибо все ваши супероптимизации - пшик, в лучшем случае не вредящий, в худшем - замедляющий программу. Компилятор без вас разберется, что и как делать для конкретного процессора, указанного в настройках.
 К началу страницы 
+ Ответить 
imouto
сообщение 28.12.2010 21:58
Сообщение #8





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


В общем написал вот так. Но тут нужно процедуру сделать функцией, булевской. Ниче не могу придумать. Помогите плиз.

Код
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;


Сообщение отредактировано: imouto - 28.12.2010 22:00
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:51
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"