Паскаль. Массивы. Сортировка столбцов
Добавлено: 07 мар 2009, 15:16
Здравствуйте, не мог бы кто нибудь помоч с программный кодом? - Для матрицы отсортировать столбцы в порядке возрастания их максимальных элементов.
Код: Выделить всё
{$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.
Код: Выделить всё
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;
Код: Выделить всё
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.
Код: Выделить всё
{$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.
. Немного исправил и уменя компиллируется: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.