Помощь - Поиск - Пользователи - Календарь
Полная версия: Матрица
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
fly
Помогите с задачкой
Вводится массив чисел 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
Цитата
Но этот код находит только максимальное значение из всего массива.
Этот код в Турбо-Паскале даже не откомпилируется...
Tan
Вопрос, который вытекает из коммента volvo : fly, что у тебя за компилятор ? Так как судя по твоему посту ты выражаешься так, как - будто программа у тебя запустилась.
volvo
Цитата
что у тебя за компилятор
А это без разницы... Нарушена структура программы - описание процедуры внутри основного блока (после слова begin) не позволяет ни один компилятор Паскаля...
Tan
Цитата
Вот коешто написал.Но этот код находит только максимальное значение из всего массива.
Из этой фразы я сделал вывод, что автор запустил программу. Вопрос к fly : а как ты мог не запустив программу заключить, что она считает ?
fly
Да,вы правы,прога даже не компилится.Ступил я немного выложив прогу непроверевши.
Давайте вначале научимся находить максимальное значение из всего массива и правильно строить структуру программы с функциями.
Насколько я понял описание функции должно находится после обявления переменных.Правильно?
Тогда почему компилятор ругается на это слово?
function max(A:array of array of integer):pair;
Tan
Типа pair изначально не существует (если ты его не создал сам). Если ты подразумевал логический результат функции, для для тебя тип boolean. Ты также не указал границы массива А. В общем виде A : array [1..X,1..Y] of твой тип - для двумерного массива.
volvo
Цитата
почему компилятор ругается на это слово?
Потому что конструировать тип ВНУТРИ описания заголовка нельзя... Все типы, которые используются в описании, уже должны существовать... Исключение - только открытые массивы (open arrays).

Кроме этого, динамических массивов в Турбо Паскале тоже нет...
fly
Цитата(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
Для начала тебе надо понять, какое результирующую значение будет у твоей функции? Судя по всему это максимальный элемент, зачем использовать свой тип если можно взять стандартный (real или integer). Переменные объявляешь либо в основной программе (тогда они видны во всех подпрограммах) либо в подпрограмме (тогда будут видны только в определённой подпрограмме). Подпрограммы - это функции и процедуры. У функции есть результирующее значение, у процедуры нет.
fly
Я так понял шапка программы будет выглядеть следующим образом.Правильно?
Код

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
смотри пост вольво, создай свой тип MyMas = array [1..X,1..y] of integer , и объявляй переменную с этим типом.
function max(A: MyMas):integer;
fly

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
Потому что ты не выполнил указание, надо создать свой тип, для этого тебе надо в разделе 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
#86 - не из-за этого... Из-за того, что нет слова fInction, а есть только fUnction ...
fly
Можешь объяснить для чего ты добавил вот эту строку.


ms : MyMas;



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

Добавлено через 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
Ясно.
С шапкой разобрались...Програмим дальше...
Я так понимаю что после шапки мы должны указать размер массива и вводить значения его элементов.Делаем это следующем образом.Верно?
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
fly, эта программа у тебя в TP откомпилируется, на при запуске ты получишь Stack Overflow... Смотри:

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

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

Кроме этого, есть еще как минимум одна ошибка - я уже говорил неоднократно, но эта ошибка возвращается вновь и вновь: никогда не описывай счетчики циклов где-то снаружи, как глобальные переменные... Описание счетчиков цикла должно быть КАК МОЖНО ближе к месту использования этого счетчика... Если это функция - то локально, в функции, если вложенная функция - то именно во вложенной, а не в материнской функции... Этим ты сильно облегчишь себе работу при отладке...
fly
Ты имеешь ввиду счётчики циклов maxi,maxj" ?
Я так понял у нас обычная функция а не вложенная,значит мы должны объявить переменные циклов локально.
Как локально объявить переменные цикла?
После end; добавить строчку maxi,maxj:integer;?Но в таком случае компилятор говорит что maxi и maxj неизвестные идентификаторы.
Где я ошибаюсь?
volvo
Я говорил не про maxi и maxj, а про i и j... У тебя же циклы - For i := ... и For j := ...

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

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


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
С задачей разобрался)
Спасибо всем за помощь)
Особенное спасибо Tan за предоставленный исходник.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.