Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Матрица

Автор: fly 6.05.2007 3:02

Помогите с задачкой
Вводится массив чисел MxM.Найти максимальные элементы по солбцам и выевсти на экран их значения и местоположение.

Пример:
Вводим массив размером 4x4

3 4 6 4
6 2 5 3
5 6 2 7
9 1 8 5

Ответ:
Столбец 1
max 9 в строке 4
Столбец 2
max 6 в строке 3
Столбец 3
max 8 в строке 4
Столбец 4
max 7 в строке 3

Вот коешто написал.Но этот код находит только максимальное значение из всего массива.

Код

var
   A:array[1..100,1..100] of integer;
   n,i,j:integer;
begin
  writeln('vv razmer massiva');
  readln(n);
  for i:=1 to n do
    writeln('vvodite',n,'chisel');
    for i:=1 to n do begin
      for j:=1 to n do begin
        Write('...');
        Readln(a[i,j]);
      end;
    end;
function max(A:array of array of integer):pair;
i,j:byte; maxi,maxj:byte; result:pair;
begin
  maxi:=1;
  maxj:=1;
  for i:=2 to N do
  for j:=2 to N do
    if A[i,j]>A[maxi,maxj] then begin maxi:=i; maxj:=j; end;
  result.i:=maxi;
  result.j:=maxj;
  max:=result;
  writeln(result)
end;
end.


Как находить максимальный элемент по каждому столбцу?И как опеределить местоположение элемента?

Автор: volvo 6.05.2007 3:25

Цитата
Но этот код находит только максимальное значение из всего массива.
Этот код в Турбо-Паскале даже не откомпилируется...

Автор: Tan 6.05.2007 3:31

Вопрос, который вытекает из коммента volvo : fly, что у тебя за компилятор ? Так как судя по твоему посту ты выражаешься так, как - будто программа у тебя запустилась.

Автор: volvo 6.05.2007 3:37

Цитата
что у тебя за компилятор
А это без разницы... Нарушена структура программы - описание процедуры внутри основного блока (после слова begin) не позволяет ни один компилятор Паскаля...

Автор: Tan 6.05.2007 3:44

Цитата
Вот коешто написал.Но этот код находит только максимальное значение из всего массива.
Из этой фразы я сделал вывод, что автор запустил программу. Вопрос к fly : а как ты мог не запустив программу заключить, что она считает ?

Автор: fly 6.05.2007 20:39

Да,вы правы,прога даже не компилится.Ступил я немного выложив прогу непроверевши.
Давайте вначале научимся находить максимальное значение из всего массива и правильно строить структуру программы с функциями.
Насколько я понял описание функции должно находится после обявления переменных.Правильно?
Тогда почему компилятор ругается на это слово?
function max(A:array of array of integer):pair;

Автор: Tan 6.05.2007 20:52

Типа pair изначально не существует (если ты его не создал сам). Если ты подразумевал логический результат функции, для для тебя тип boolean. Ты также не указал границы массива А. В общем виде A : array [1..X,1..Y] of твой тип - для двумерного массива.

Автор: volvo 6.05.2007 21:03

Цитата
почему компилятор ругается на это слово?
Потому что конструировать тип ВНУТРИ описания заголовка нельзя... Все типы, которые используются в описании, уже должны существовать... Исключение - только открытые массивы (open arrays).

Кроме этого, динамических массивов в Турбо Паскале тоже нет...

Автор: fly 6.05.2007 21:19

Цитата(Tan @ 6.05.2007 16:52) *

Типа pair изначально не существует (если ты его не создал сам). Если ты подразумевал логический результат функции, для для тебя тип boolean. Ты также не указал границы массива А. В общем виде A : array [1..X,1..Y] of твой тип - для двумерного массива.

А где нужно создавать тип pair?Просто указать после объявления перменных,напимер так:k:pair?Правильно?
И ещё один вопрос:
Переменные функции (i,j:byte; maxi,maxj:byte) должны указываться после обявления переменных или после описания функции?

Автор: Tan 6.05.2007 21:28

Для начала тебе надо понять, какое результирующую значение будет у твоей функции? Судя по всему это максимальный элемент, зачем использовать свой тип если можно взять стандартный (real или integer). Переменные объявляешь либо в основной программе (тогда они видны во всех подпрограммах) либо в подпрограмме (тогда будут видны только в определённой подпрограмме). Подпрограммы - это функции и процедуры. У функции есть результирующее значение, у процедуры нет.

Автор: fly 6.05.2007 22:05

Я так понял шапка программы будет выглядеть следующим образом.Правильно?

Код

var
    A:array[1..100,1..100] of integer;
    n,i,j,maxi,maxj,result:integer;
    function max(A:array[1..100,1..100] of integer ):integer
    begin


Но почему компилятор ругается на эту квадратную скобку?Пишет error 54.

function max(A:array[1..100,1..100] of integer )

Автор: Tan 6.05.2007 22:12

смотри пост вольво, создай свой тип MyMas = array [1..X,1..y] of integer , и объявляй переменную с этим типом.

function max(A: MyMas):integer;

Автор: fly 6.05.2007 23:27


var
MyMas:array[1..100,1..100] of integer;
n,i,j,maxi,maxj,result:integer;
finction max(A:MyMas):integer;




Никак не пойму почему компилятор ругается на слово "max" в строке finction max(A:MyMas):integer; .Пишет 86 ошибку.В хелпе посмотрел что это пропущен знак двоеточие.Если добовляешь знак двоеточие то компилятор говорит что идентефикатор "max" не был объявлен.Объявляю идентефекатор "max" в переменных.Компилятор выдаёт ошибку номер 21.

Автор: Tan 6.05.2007 23:30

Потому что ты не выполнил указание, надо создать свой тип, для этого тебе надо в разделе Type его зарегестрировать

Type MyMas = array [1..100,1..100] of integer;
var
ms : MyMas;
n,i,j,maxi,maxj,result:integer;
finction max(A:MyMas):integer;

Автор: volvo 6.05.2007 23:37

#86 - не из-за этого... Из-за того, что нет слова fInction, а есть только fUnction ...

Автор: fly 6.05.2007 23:37

Можешь объяснить для чего ты добавил вот эту строку.


ms : MyMas;




Автор: Tan 6.05.2007 23:40

Просто объявил массив со своим типом.

Добавлено через 12 мин.

uses crt;
Const N = 10;
M = 10;
Type MyMas = array [1..N,1..M] of integer;
var ms : MyMas;
i,j : Integer;
procedure Max (A : MyMas; stolbec : integer);
var max : integer;
begin
max := a[1,stolbec];
for i := 1 to N do
if ms[i, stolbec] > max then max := ms[i, stolbec];
writeln ('V stolbike ', stolbec, ' max element ', max);
end;
begin
Clrscr;
randomize;
for i := 1 to N do
begin
for j := 1 to M do
begin
ms[i,j] := random(20)-5;
write (ms[i,j]:4);
end;
writeln;
end;
for j:= 1 to M do max (ms, j);
readkey;
end.


Посмотри, если это то, что тебе надо. Я специально не указал в какой строке этот максимальный элемент, если мой наброски удовлетворяют остальным условиям, допиши сам.

Автор: fly 6.05.2007 23:59

Ясно.
С шапкой разобрались...Програмим дальше...
Я так понимаю что после шапки мы должны указать размер массива и вводить значения его элементов.Делаем это следующем образом.Верно?

Type MyMas = array [1..100,1..100] of integer;
var
ms : MyMas;
n,i,j,maxi,maxj,result:integer;
function max(A:MyMas):integer;
begin
writeln('vvodite razmer massiva');
readln(n);
for i:=1 to n do
writeln('vvodite',n,'chisel');
for i:=1 to n do begin
for j:=1 to n do begin
Write('...');
Read(a[i,j]);
end;
end;



Может кто нибуть объяснить в каком случае мы должны использовать команду ввода Read а в каком readLN?Читал в какомто учебнике по Паскалю что эти команды отличаются только тем что команда Readln пропускает строку а read нет.Они насамом деле только этим отличаются?

Автор: volvo 7.05.2007 0:25

fly, эта программа у тебя в TP откомпилируется, на при запуске ты получишь Stack Overflow... Смотри:

function max(A:MyMas):integer;
- здесь ты пытаешься передать массив размером 100*100*2 байта (каждый Integer) = 20000 байт... Размер стека по умолчанию - 16К... Получаешь переполнение... Так что либо уменьшай размерности массива, либо передавай массив не по значению (как ты его передаешь сейчас), а по ссылке:

function max(var A:MyMas):integer;
Вот так все содержимое массива в стек не копируется, вместо этого в функцию передается указатель на массив (4 байта), с которым она и работает...

Кроме этого, есть еще как минимум одна ошибка - я уже говорил неоднократно, но эта ошибка возвращается вновь и вновь: никогда не описывай счетчики циклов где-то снаружи, как глобальные переменные... Описание счетчиков цикла должно быть КАК МОЖНО ближе к месту использования этого счетчика... Если это функция - то локально, в функции, если вложенная функция - то именно во вложенной, а не в материнской функции... Этим ты сильно облегчишь себе работу при отладке...

Автор: fly 7.05.2007 16:01

Ты имеешь ввиду счётчики циклов maxi,maxj" ?
Я так понял у нас обычная функция а не вложенная,значит мы должны объявить переменные циклов локально.
Как локально объявить переменные цикла?
После end; добавить строчку maxi,maxj:integer;?Но в таком случае компилятор говорит что maxi и maxj неизвестные идентификаторы.
Где я ошибаюсь?

Автор: volvo 7.05.2007 16:23

Я говорил не про maxi и maxj, а про i и j... У тебя же циклы - For i := ... и For j := ...

Насчет того, как описать локально:

function max(A:MyMas):integer;
var i, j: integer; { <--- Это - описание ВНУТРИ функции, следовательно - локальное }
begin
...

Автор: fly 7.05.2007 16:59

от что у меня получилось.Ошибки есть?


Type MyMas = array [1..100,1..100] of integer;
var
ms : MyMas;
n,maxi,maxj,result:integer;
function max(var A:MyMas):integer;
var i,j:integer;
begin
writeln('vvodite razmer massiva');
readln(n);
for i:=1 to n do
writeln('vvodite',n,'chisel');
for i:=1 to n do begin
for j:=1 to n do begin
Write('...');
Read(a[i,j]);
end;
end;


Автор: fly 7.05.2007 21:01

С задачей разобрался)
Спасибо всем за помощь)
Особенное спасибо Tan за предоставленный исходник.