Помогите с задачкой
Вводится массив чисел 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
Вот коешто написал.Но этот код находит только максимальное значение из всего массива.
Вопрос, который вытекает из коммента volvo : fly, что у тебя за компилятор ? Так как судя по твоему посту ты выражаешься так, как - будто программа у тебя запустилась.
Да,вы правы,прога даже не компилится.Ступил я немного выложив прогу непроверевши.
Давайте вначале научимся находить максимальное значение из всего массива и правильно строить структуру программы с функциями.
Насколько я понял описание функции должно находится после обявления переменных.Правильно?
Тогда почему компилятор ругается на это слово?
function max(A:array of array of integer):pair;
Типа pair изначально не существует (если ты его не создал сам). Если ты подразумевал логический результат функции, для для тебя тип boolean. Ты также не указал границы массива А. В общем виде A : array [1..X,1..Y] of твой тип - для двумерного массива.
Для начала тебе надо понять, какое результирующую значение будет у твоей функции? Судя по всему это максимальный элемент, зачем использовать свой тип если можно взять стандартный (real или integer). Переменные объявляешь либо в основной программе (тогда они видны во всех подпрограммах) либо в подпрограмме (тогда будут видны только в определённой подпрограмме). Подпрограммы - это функции и процедуры. У функции есть результирующее значение, у процедуры нет.
Я так понял шапка программы будет выглядеть следующим образом.Правильно?
смотри пост вольво, создай свой тип MyMas = array [1..X,1..y] of integer , и объявляй переменную с этим типом.
function max(A: MyMas):integer;
var
MyMas:array[1..100,1..100] of integer;
n,i,j,maxi,maxj,result:integer;
finction max(A:MyMas):integer;
Потому что ты не выполнил указание, надо создать свой тип, для этого тебе надо в разделе 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;
#86 - не из-за этого... Из-за того, что нет слова fInction, а есть только fUnction ...
Можешь объяснить для чего ты добавил вот эту строку.
ms : MyMas;
Просто объявил массив со своим типом.
Добавлено через 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.
Ясно.
С шапкой разобрались...Програмим дальше...
Я так понимаю что после шапки мы должны указать размер массива и вводить значения его элементов.Делаем это следующем образом.Верно?
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;
fly, эта программа у тебя в TP откомпилируется, на при запуске ты получишь Stack Overflow... Смотри:
function max(A:MyMas):integer;- здесь ты пытаешься передать массив размером 100*100*2 байта (каждый Integer) = 20000 байт... Размер стека по умолчанию - 16К... Получаешь переполнение... Так что либо уменьшай размерности массива, либо передавай массив не по значению (как ты его передаешь сейчас), а по ссылке:
function max(var A:MyMas):integer;Вот так все содержимое массива в стек не копируется, вместо этого в функцию передается указатель на массив (4 байта), с которым она и работает...
Ты имеешь ввиду счётчики циклов maxi,maxj" ?
Я так понял у нас обычная функция а не вложенная,значит мы должны объявить переменные циклов локально.
Как локально объявить переменные цикла?
После end; добавить строчку maxi,maxj:integer;?Но в таком случае компилятор говорит что maxi и maxj неизвестные идентификаторы.
Где я ошибаюсь?
Я говорил не про maxi и maxj, а про i и j... У тебя же циклы - For i := ... и For j := ...
Насчет того, как описать локально:
function max(A:MyMas):integer;
var i, j: integer; { <--- Это - описание ВНУТРИ функции, следовательно - локальное }
begin
...
от что у меня получилось.Ошибки есть?
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;
С задачей разобрался)
Спасибо всем за помощь)
Особенное спасибо Tan за предоставленный исходник.