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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Матрица
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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


Профи
****

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

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


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


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


Гость






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


Профи
****

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

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


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

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


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


Новичок
*

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

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


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


Профи
****

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

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


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


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


Гость






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

Кроме этого, динамических массивов в Турбо Паскале тоже нет...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

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

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


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

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

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


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


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -


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


Гость






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


Новичок
*

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

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


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


ms : MyMas;



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


Гость






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

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

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

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


Новичок
*

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

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


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

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

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

 





- Текстовая версия 28.03.2024 19:32
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name