Помощь - Поиск - Пользователи - Календарь
Полная версия: Пожалуйста, помогите решить задачу с Динам-и массивами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
VovaNs
Даны три матрицы целого типа произвольной размерности(размер вводится пользователем). Для каждой матрицы отсортировать столбцы в порядке возрастания их максимальных элементов(модерницированным методом пузырька). Предусмотреть обработку ошибок и удобный интерфейс. Прошу помогите....

Добавлено через 4 мин.
Программу нужно написать на языке Паскаль
Ozzя
Смотрел?
Динамические массивы и матрицы
VovaNs
Да я уже вбивал различные готовые коды, но везде какие нибудь ошибки...
volvo
Цитата
везде какие нибудь ошибки...
Это где ошибки? В FAQ-е??? Покажи пальцем, где именно, в каком коде и какая ошибка у тебя возникает. А то, что ты
Цитата
уже вбивал различные готовые коды
меня как-то мало интересует. Я не телепат, чтобы знать, какие коды ты вбивал...
VovaNs
Цитата(volvo @ 14.02.2009 12:08) *

Это где ошибки? В FAQ-е??? Покажи пальцем, где именно, в каком коде и какая ошибка у тебя возникает. А то, что ты меня как-то мало интересует. Я не телепат, чтобы знать, какие коды ты вбивал...

Вписываю программу, у меня куча цифр на черном экране причем не в виде матрицы а просто срокой и много а в конце еррор написано....
Ozzя
Вписываю программу


Тебе же ответили уже -
Покажи пальцем, где именно, в каком коде и какая ошибка у тебя возникает.


Приложи сюда свой код и данные.
VovaNs
ВОТ ГОТОВАЯ ПРОГРАММА VOLVO ПО МАТРИЦАМ-
{
  Обязательно отключить проверку индексов,
  иначе возникнет ошибка времени исполнения
}
{$R-}
Type
  TType = Word; { Или любой другой тип }
Type
  PVector = ^TVector;
  { Это - одна "строка" динамической матрицы }
  TVector = Array[1 .. 1] of TType;

  PDynMatrix = ^TDynMatrix;
  { Сама матрица - представляется как массив указателей на "строки" }
  TDynMatrix = Array[1 .. 1] of PVector;

Var
  { Через эту переменную будет осуществляться вся работа с матрицей }
  mxDynamic: PDynMatrix;
  n, i, j: Word; - 1АЯ ОШИБКА( при присвоении Word происходит косяк с циклами....)
Begin
  Write('n = '); ReadLn(n);

  { Выделяем память под указатели на "строки" }
  GetMem(mxDynamic, n * SizeOf(PVector));
  { И для каждой "строки" - выделяем память для хранения данных } 
  For i := 1 To n Do
    GetMem(mxDynamic^[i], n * SizeOf(TType));

  (*** Работаем с матрицей ***)
  {
    Динамическая матрица представлена немного иначе,
    чем динамический массив, поэтому для того, чтобы обратиться
    к ее элементу, необходимы 2 операции разыменования указателей.
    Пример:
  }
  For i := 1 To n Do { Строки }
    For j := 1 To n Do { Столбцы (элементы строки) }
      mxDynamic^[I]^[J]:=I*J;

  For i := 1 To n Do Begin
    WriteLn;
    For j := 1 To n Do
       Write(mxDynamic^[I]^[J]:4) - 2АЯ ОШИБКА ТУТ (не знаю что изменить....);
  End;

  (*** Закончили работу с матрицей - уничтожаем ее ***)

  { Освобождаем память в обратном порядке: }
  { Сначала - удаляем все "строки" }
  For i := 1 To n Do
    FreeMem(mxDynamic^[i], n * SizeOf(TType));
  { А теперь и указатели на них ... }
  FreeMem(mxDynamic, n * SizeOf(PVector));
End.

И я не знаю как написать сортировку матрицы - чтобы поменять местами столбцы. Кто нибудь может показать код?
VovaNs
Мне кто - нибудь поможет????
volvo
Поможет. Поиск по форуму. Я специально выкладывал пример описания типов для быстрого перемещения столбцов. Второй раз я то же самое делать не буду. А за те полмесяца, что ты ждешь ответа, можно было уже и самому давно разобраться, придумать свой алгоритм с нуля и написать...
Гость
Не можете алгоритм вставить в эту темку а то я найти ничего не могу,или хотя бы ссылку на ту страницу где он приведен, лазию нигде ничего найти не могу( а с планом самому разобраться не могу, так как препод за весь курс объяснил только как работать с динамической памятью и все( приходится просто искать хоть что то работоспособное(помогите прошу оч....(
VovaNs
program lab_9;

const
  n = 10;
  m = 9;

  k = 5;

var
  a: array[1 .. n*m] of integer;
  b, j, t, i: integer;

begin
  randomize;
  for i := 1 to n*m do begin
    a[i]:=random(20)-10;
    write(a[i]:4);
    if i mod n = 0 then writeln;
  end;
  writeln;

  for i:=1 to m do begin
    b:=a[(i-1)*n+1];
    a[(i-1)*n+1]:=a[(i-1)*n+k];
    a[(i-1)*n+k]:=b;
  end;

  for i:=1 to n*m do begin
    write(a[i]:4);
    if i mod n = 0 then writeln;
  end;
  readln;
end.

Вот что нашел не знаю про это вы говорили или нет? но в код я малость не понимаю...(
maksimla
а про код забыл чтобы в коде надо всю программу обозначить
VovaNs
Так выше прведенный код меняет столбцы или я что то не понимаю? киньте ссылку страницы на которой приведен пример перемещения столбцов динамической матрицы
VovaNs
Кто- нибудь подскажет?((((((
VovaNs
Ну можете скинуть ссылку на код, где меняются столбцы местами или программный код скопировать? я никак не могу найти...
VovaNs
Вообщем своими усилиями сделал программу....никто так и не помог( но у меня еще вопрос, нашел готовый код внешнего интерфейса от Volvo , в процедуру вбиваю свой код программы...но...выдает ошибку...не пойму почему вот код:
{$S+}
program Prog4;
uses crt;
Type
   MenuType = (Vertical, Horizontal);

const
   width = 12;    nItems = 4; 

   optText1: array[0 .. pred(nItems)] of string = (
     'Option #1', 'Option #2', 'Option #3', 'Exit'
   );

   optNormal = LightGray; 
   optSelected = Yellow;  

var
   X, Y,
   selected, 
   row: integer;
   _style: menuType;  


procedure MakeMenu (optText: array of string; MaxItems: integer);
var
   i, _X: byte;
begin
     Y := row;
     _X := X;
     for i := 0 to MaxItems-1 do
     begin
          GoToXY (_X, Y);
          if i = selected then
             TextColor (optSelected)
          else
             TextColor (optNormal);
          write (optText[ i ]);

          If _style = Horizontal Then
            inc (_X, width + 1)
          Else
            inc (Y, 2);
     end;
end;

function MenuOption (optText: array of string; MaxItems: integer): byte;
var
   ch: char;
begin
   selected := 0;

   If _style = Vertical Then Begin
     X := (80 - width) div 2;
     row := (25 - MaxItems) div 2;
   End
   Else Begin
     X := (80 - MaxItems * width) div 2;
     row := 2; 
     GotoXY(1, row); ClrEol;
     End;

     repeat
           MakeMenu (optText, MaxItems);

           ch := readkey;
           if ch = #0 then
              ch := readkey;

           case ch of
           #80, #77: {Down/Right}
           begin
                inc (Selected);
                if Selected = MaxItems then
                   Selected := 0;
                MakeMenu (optText, MaxItems);
           end;

           #72, #75: {Up/Left}
           begin
                dec (Selected);
                if Selected < 0 then
                   Selected := MaxItems-1;
                MakeMenu (optText, MaxItems);
           end;
           end;
     until ch = #13; {Enter}
     MenuOption := Selected + 1;
     TextColor (optNormal);
     If _style = Vertical Then
        clrscr;
end;

type
  atype = array [1..90,1..90] of integer;
  btype = array [1..90] of integer;

procedure Proc_1;
var 
  a22:atype;
  b22:btype;
  i22,j22,i1,j1,n22,max,n2,min,c22,k22,q22,o22:integer;
begin {Proc_1}
  ClrScr;
  Write('Vvedite razmernost (n>0). n=');
  Readln(n22);
  writeln('Vvedite Matrisu A:');
  for i22:=1 to n22 do
    for j22:=1 to n22 do begin
      Write('Vvedite element Matristy a[',i22,',',j22,']=');
      readln(a22[i22,j22]);
    end;
  for i22:=1 to n22 do begin
    for j22:=1 to n22 do
      write(a22[i22,j22]:3);
    writeln;
  end;
  Writeln;

  for j22:=1 to n22 do begin
    max:=a22[1,j22];
    for i22:=1 to n22 do
      if a22[i22,j22]>max then
        max:=a22[i22,j22];
    writeln('Maximalnuj element ',j22,' stolbtsa = ',max) ;
    b22[j22]:=max;
  end;

  for k22:=1 to n22-1 do
    for j22:=1 to n22-k22 do
      if (b22[j22]>b22[j22+1]) then
  begin
    for i22:=1 to n22 do
    begin
      c22:=a22[i22,j22];
      a22[i22,j22]:=a22[i22,j22+1];
      a22[i22,j22+1]:=c22;
    end;
    c22:=b22[j22];
    b22[j22]:=b22[j22+1];
    b22[j22+1]:=c22;
  end;
  Writeln;
  Writeln('Otsortirovannya Matrista A: ');
  for i22:=1 to n22 do begin
    for j22:=1 to n22 do write(a22[i22,j22]:3);
    writeln;
  end; 
  ReadLn;
end;

procedure Proc_2;
begin
  ClrScr;
  WriteLn('#2 selected ...');
  ReadLn;
end;

procedure Proc_3;
begin
  ClrScr;
  WriteLn('Other selected ...');
  ReadLn;
end;

var
  Option: byte; 

begin
     _style := Vertical;
     repeat
       clrscr;
       Option := MenuOption (optText1, nItems);
       case option of
         1: Proc_1;
         2: Proc_2;
         3: Proc_3;
       end;
     until Option = nItems;
end.

Посмотрите плиз( (другие процедуры не удалял, решил оставить пока что все как есть)
VovaNs
тут никого нету? удаляйте тему, если никто не может помочь....(
Lapp
Цитата(VovaNs @ 16.03.2009 12:03) *
тут никого нету? удаляйте тему, если никто не может помочь....(
А знаешь, почему никто не жаждет тебе помогать? Ты пишешь: "выдает ошибку". А какую именно - это тебе уже лень написать. И лень поставить тэги (хотя это сказано в Правилах). Ну, хорошо, я потратил свое время, расставил тэги (заметь, нормальный пользователь не смог бы это сделать, так что никаких отступов, если он будет пытаться запускать твои творения). Запустил твою прогу - отработала нормально, никаких ошибок. И что мне теперь делать? Встать перед тобой на колени и выпрашивать, чтоб твоя царственная особа соизволила добавить пару слов про то, какая ошибка, при каких условиях возникает?

Почему нельзя избавить тех, у кого просишь помощи, от лишней работы?
VovaNs
Ошибку выдает в первой процедуре на начале(begin)- error 202:stack overflow error. (при запуске программы, а не при компиляции)
amega
Цитата
error 202:stack overflow error.


error 202:stack overflow error. (Переполнения стека). Эта ошибка генерируется на входе в процедуру или функцию, скомпилированую в режиме {$S+} , если нет достаточной области для размещения локальных переменных подпограммы. Слудует увеличить размер стека , используя директиву компилятора $M. Данная ошибка может также вызиватся циклической рекурсией или процедурой на ассемблере, которая не подреживаетстек.
volvo
Цитата
Ошибку выдает в первой процедуре на начале(begin)- error 202:stack overflow error.
Зайди в меню Options -> Memory Sizes, и посмотри, какой у тебя выставлен размер стека (по умолчанию - 16384)... А теперь посмотри, каков общий размер всех локальных переменных в Proc1: 1 массив типа btype, 1 матрица типа atype и 12 integer-ов = 90*90*sizeof(integer) + 90*sizeof(integer) + 12*sizeof(integer) = 16200 + 180 + 24 = 16404... Перебор. Или увеличивай размер стека, или работай с динамической памятью (можно еще описать матрицу глобально, а не локально, но это совсем не наш метод).
VovaNs
все сделал...сделал динамические матрицы все заработало))))у меня еще вопросик- а как указать разрешение своей программы? и еще) есть ли ссылка или код чтобы в программе появлялась мышь)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.