IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Матрица
fly
сообщение 5.05.2007 23:02
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


Помогите с задачкой
Вводится массив чисел 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.


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

Сообщение отредактировано: fly - 5.05.2007 23:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.05.2007 23:25
Сообщение #2


Гость






Цитата
Но этот код находит только максимальное значение из всего массива.
Этот код в Турбо-Паскале даже не откомпилируется...
 К началу страницы 
+ Ответить 
Tan
сообщение 5.05.2007 23:31
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.05.2007 23:37
Сообщение #4


Гость






Цитата
что у тебя за компилятор
А это без разницы... Нарушена структура программы - описание процедуры внутри основного блока (после слова begin) не позволяет ни один компилятор Паскаля...
 К началу страницы 
+ Ответить 
Tan
сообщение 5.05.2007 23:44
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


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

Сообщение отредактировано: Tan - 5.05.2007 23:44


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
fly
сообщение 6.05.2007 16:39
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


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


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.05.2007 17:03
Сообщение #8


Гость






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

Кроме этого, динамических массивов в Турбо Паскале тоже нет...
 К началу страницы 
+ Ответить 
fly
сообщение 6.05.2007 17:19
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


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

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

А где нужно создавать тип pair?Просто указать после объявления перменных,напимер так:k:pair?Правильно?
И ещё один вопрос:
Переменные функции (i,j:byte; maxi,maxj:byte) должны указываться после обявления переменных или после описания функции?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tan
сообщение 6.05.2007 17:28
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
fly
сообщение 6.05.2007 18:05
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


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

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 )

Сообщение отредактировано: fly - 6.05.2007 18:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tan
сообщение 6.05.2007 18:12
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


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


Сообщение отредактировано: Tan - 6.05.2007 18:14


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
fly
сообщение 6.05.2007 19:27
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +



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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tan
сообщение 6.05.2007 19:30
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


Потому что ты не выполнил указание, надо создать свой тип, для этого тебе надо в разделе 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;


Сообщение отредактировано: Tan - 6.05.2007 19:30


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.05.2007 19:37
Сообщение #15


Гость






#86 - не из-за этого... Из-за того, что нет слова fInction, а есть только fUnction ...
 К началу страницы 
+ Ответить 
fly
сообщение 6.05.2007 19:37
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


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


ms : MyMas;



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tan
сообщение 6.05.2007 19:40
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


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

Добавлено через 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.


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
fly
сообщение 6.05.2007 19:59
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


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

Сообщение отредактировано: fly - 6.05.2007 20:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.05.2007 20:25
Сообщение #19


Гость






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 12:01
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Мужской

Репутация: -  0  +


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

Сообщение отредактировано: fly - 7.05.2007 12:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 10:54
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"