Страница 1 из 2

Паскаль. Массивы. Сортировка столбцов

Добавлено: 07 мар 2009, 15:16
VovaNsGZ
Здравствуйте, не мог бы кто нибудь помоч с программный кодом? - Для матрицы отсортировать столбцы в порядке возрастания их максимальных элементов.

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 11 мар 2009, 02:35
Naeel Maqsudov
[syntax=pascal]
const
m=5;
n=6;
var
a:array[1..m,1..n] of integer;
max:array[1..n] of integer;
i,j,t:integer;
noswaps:boolean;
begin
{заполнение}
for i:=1 to m do for j:=1 to n do a[i,j]:=random(100);
writeln('Исходный массив');
for i:=1 to m do begin
for j:=1 to n do write(a[i,j]:5);
writeln;
end;
{поиск максимумов}
writeln('Максимумы');
for j:=1 to n do begin
max[j]:=a[1,j];
for i:=2 to m do if a[i,j]>max[j] then max[j]:=a[i,j];
write(max[j]:5);
end;
writeln;
{сортировка}
repeat
noswaps:=true;
for j:=1 to n-1 do begin
if max[j]>max[j+1] then begin
noswaps:=false;
t:=max[j];max[j]:=max[j+1];max[j+1]:=t;
for i:=1 to m do begin
t:=a[i,j];a[i,j]:=a[i,j+1];a[i,j+1]:=t;
end;
end;
end;
until noswaps;
writeln('Результат');
for i:=1 to m do begin
for j:=1 to n do write(a[i,j]:5);
writeln;
end;
end.
[/syntax]

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 13 мар 2009, 12:31
VovaNsGZ
Спасибо большое)))правда я уже нашел код)у меня еще вопрос собрал два кода вместе не могли бы посмотреть что за ошибка у меня :

Код: Выделить всё

{$S+}
program mmmm22;
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;  { Тип представления меню: вертикальное (Vertical)
                        или горизонтальное (Horizontal) }


{ Отрисовка всех элементов меню с выделением цветом одного из них - выбранного на данный момент }
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}

     {
       Если мы пришли сюда - значит, пользователь нажал Enter,
       и в переменной selected находится индекс выбранного им
       элемента меню
     }
     MenuOption := Selected + 1;

     {
       Восстанавливаем нормальный цвет вывода,
       и для вертикального меню очищаем экран
     }
     TextColor (optNormal);
     If _style = Vertical Then
        clrscr;
end;

{
  Процедуры, запускаемые при выборе пользователем определенных пунктов меню ...
  Собственно, эти процедуры и являются "рабочими лошадками", и именно в них нужно
  программировать те действия, которые требуются по алгоритму решения задачи.
}
type
atype : array [1..90,1..90] of integer;
procedure Proc_1;
var a:atype;
i,j,n,max:integer;
begin

procedure Proc_2;

begin
writeln('Vvedite Matrisu A:');
for i:=1 to n do
for j:=1 to n do
begin
Write('Vvedite element Matristy a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:3);
writeln;
end;
end;

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

var
  Option: byte; { Эта переменная будет хранить номер пункта, выбранного пользователем }

begin
     { Проверяем с вертикальным меню (_style := Horizontal для горизонтального) }
     _style := Vertical;
     repeat

       clrscr;
       Option := MenuOption (optText1, nItems);

       case option of
         1: Proc_1;
         2: Proc_2;
         3: Proc_3;
       end;

     {
       Здесь я исходил из предположения, что завершающим пунктом меню всегда идет "Выход".
       Если это не так - надо просто подставить вместо nItems номер пункта для выхода из программы
     }
     until Option = nItems;

end.

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 15 мар 2009, 19:08
Хыиуду
У вас внутри тела процедуры Proc_1 (т.е. после бегин) стоит объявление процедуры Proc_2. В этом и ошибка. Надо прописать нормальный код первой процедуры

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 16 мар 2009, 10:44
VovaNsGZ

Код: Выделить всё

type
atype= array [1..90,1..90] of integer;
procedure Proc_1;
var a:atype;
i,j,n,max:integer;
begin

writeln('Vvedite Matrisu A:');
for i:=1 to n do
for j:=1 to n do
begin
Write('Vvedite element Matristy a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:3);
writeln;
end;
end;

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

procedure Proc_3;
begin
  ClrScr;
  WriteLn('Other selected ...');
  ReadLn;
end;
вот вроде бы исправил, но все равно ошибка( плиз помогите попробуйте у себя код...что то не получается(

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 16 мар 2009, 19:12
dr.Jekill
Помимо того что ты написал процедуры, используй их в основной программе и учи Pascal!

Код: Выделить всё

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

procedure Proc_1;
var a:atype;
    i,j,n,max:integer;
 begin
  writeln('Vvedite Matrisu A:');
  for i:=1 to n do
  for j:=1 to n do
   begin
    Write('Vvedite element Matristy a[',i,',',j,']=');
    readln(a[i,j]);
   end;
   for i:=1 to n do
    begin
     for j:=1 to n do
      write(a[i,j]:3);
      writeln;
    end;
 end;

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

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

begin
readln;
end.

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 16 мар 2009, 22:01
VovaNsGZ
Блин....я учу паскаль....последний код это обрывок всей программы) посмотри выше код)просто на этом участе программы была ошибка, да и после исправления все равно ошибка...

Код: Выделить всё

{$S+}
program mmmm22;
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;  { Тип представления меню: вертикальное (Vertical)
                        или горизонтальное (Horizontal) }


{ Отрисовка всех элементов меню с выделением цветом одного из них - выбранного на данный момент }
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}

     {
       Если мы пришли сюда - значит, пользователь нажал Enter,
       и в переменной selected находится индекс выбранного им
       элемента меню
     }
     MenuOption := Selected + 1;

     {
       Восстанавливаем нормальный цвет вывода,
       и для вертикального меню очищаем экран
     }
     TextColor (optNormal);
     If _style = Vertical Then
        clrscr;
end;

{
  Процедуры, запускаемые при выборе пользователем определенных пунктов меню ...
  Собственно, эти процедуры и являются "рабочими лошадками", и именно в них нужно
  программировать те действия, которые требуются по алгоритму решения задачи.
}
type
atype : array [1..90,1..90] of integer;
procedure Proc_1;
var a:atype;
i,j,n,max:integer;
begin

writeln('Vvedite Matrisu A:');
for i:=1 to n do
for j:=1 to n do
begin
Write('Vvedite element Matristy a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:3);
writeln;
end;
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 := Horizontal для горизонтального) }
     _style := Vertical;
     repeat

       clrscr;
       Option := MenuOption (optText1, nItems);

       case option of
         1: Proc_1;
         2: Proc_2;
         3: Proc_3;
       end;

     {
       Здесь я исходил из предположения, что завершающим пунктом меню всегда идет "Выход".
       Если это не так - надо просто подставить вместо nItems номер пункта для выхода из программы
     }
     until Option = nItems;

end. 
вот вся программа...

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 16 мар 2009, 22:08
VovaNsGZ
Ошибку выдает в первой процедуре на начале(begin)- error 202:stack overflow error. как ее исправить(

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 16 мар 2009, 22:55
dr.Jekill
VovaNsGZ писал(а):Ошибку выдает в первой процедуре на начале(begin)- error 202:stack overflow error. как ее исправить(
. Немного исправил и уменя компиллируется:

Код: Выделить всё

{$S+}
program mmmm22;
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;  { Тип представления меню: вертикальное (Vertical)
                        или горизонтальное (Horizontal) }


{ Отрисовка всех элементов меню с выделением цветом одного из них - выбранного на данный момент }
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}

     {
       Если мы пришли сюда - значит, пользователь нажал Enter,
       и в переменной selected находится индекс выбранного им
       элемента меню
     }
     MenuOption := Selected + 1;

     {
       Восстанавливаем нормальный цвет вывода,
       и для вертикального меню очищаем экран
     }
     TextColor (optNormal);
     If _style = Vertical Then
        clrscr;
end;

{
  Процедуры, запускаемые при выборе пользователем определенных пунктов меню ...
  Собственно, эти процедуры и являются "рабочими лошадками", и именно в них нужно
  программировать те действия, которые требуются по алгоритму решения задачи.
}
type
atype=array [1..90,1..90] of integer;
procedure Proc_1;
var a:atype;
i,j,n,max:integer;
begin

writeln('Vvedite Matrisu A:');
for i:=1 to n do
for j:=1 to n do
begin
Write('Vvedite element Matristy a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:3);
writeln;
end;
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 := Horizontal для горизонтального) }
     _style := Vertical;
     repeat

       clrscr;
       Option := MenuOption (optText1, nItems);

       case option of
         1: Proc_1;
         2: Proc_2;
         3: Proc_3;
       end;

     {
       Здесь я исходил из предположения, что завершающим пунктом меню всегда идет "Выход".
       Если это не так - надо просто подставить вместо nItems номер пункта для выхода из программы
     }
     until Option = nItems;

end. 
stack overflow - переполнение стека. Используй динамичекие выделение пямяти.

Re: Паскаль. Массивы. Сортировка столбцов

Добавлено: 16 мар 2009, 22:56
dr.Jekill
З.Ы.:Используй тэги при выводе кода