|
Вопрос # 3 182/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Дана матрица А(n,m), найти ее наибольший элемент(первый по порядку если их несколько)
написал код..но как то странно выводит наиб элемент, рандомом как то( помогите пожалуйста.
Приложение: Переключить в обычный режим- uses
- SysUtils;
-
- CONST n=5;m=5;
- TYPE TMas=ARRAY[1..n,1..m] of integer;
- var i,j,max:integer; a:TMas;
-
-
- PROCEDURE INPUT(var a:TMas);
- var i,j:integer;
- BegiN
- Randomize;
- for i:=1 to n do
- for j:=1 to m do
- a[i,j]:=Random(25)-10;
- WRITELN('pervonachalnyi massiv:')
- EnD;
-
-
- PROCEDURE OUTPUT{output(1,n,1,m)}(i1,i2,j3,j4:integer);
- var i,j:integer;
-
- for i:=i1 to i2 do
- bEGIN
- writeln;
- for j:=j3 to j4 do
- write(a[i,j]:4,' ');
- eND;
- EnD;
-
- PROCEDURE MAXIMUM( var a:TMas);
- var i,max:integer;
- BEGIN
- for i:=1 to n do
- if a[i,j]>0 then max:=a[i,j];
- for i:=1 to n do
- if a[i,j]>max then
- max:=a[i,j];
- writeln;
- WRITELN('max(a[i])=',max);
- END;
-
-
- begin
- input(a);
- output(1,n,1,m);
- maximum(a);
-
- readln;
- end.
 |
Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 13 сентября 2009, 08:45
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
function Maximum(const a: TMas): Integer;
var
i, j: Integer;
begin
Result:= -2147483648;
for i:= 1 to n do
for j:= 1 to m do
if a[i, j] > Result
then Result:= a[i, j];
WRITELN('max(a[i])=', Result);
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 13 сентября 2009, 09:23
Оценка за ответ: 5
Комментарий к оценке: спасибо!!!=) работает) но, а что это за цифры? как их объяснить училке Result:= -2147483648;???
|
Мини-форум вопроса
Всего сообщений: 100; последнее сообщение — 13 сентября 2009, 14:37; участников в обсуждении: 7.
Страницы: [« Предыдущая] [1] [2] [3] [4] [5] [Следующая »]
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 11:23 [#42]:
Цитата (Вадим К):
Возможен ведь вариант, что по какой то ошибке функция была вызвана с параметрами (...,0,0). Тогда будет не очень красиво.
Эта функция не может быть вызвана с такими параметрами.
Цитата:
maximum; сама функция...пишет что не актуальный параметр
Это не функция пишет, а компилятор. И пишет он не "не актуальный параметр", а "Not enough actual parameters", что в переводе означает "Не хватает актуальных параметров", которых в вызове должно быть 3 штуки: Сама матрица и два индекса найденного максимального элемента.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 13 сентября 2009, 11:23 [#43]:
то I{ () T
не актуальный параметр - так надо передать актуальный параметр. На этом этапе и процедуры, и функции одинаковы, так что ...
В функцию нужно передать ТРИ параметра
function Maximum(const a: TMas; var MaxI, MaxJ: Integer): Integer;
то есть вызов будет такой
function Maximum(a, maxi,maxj);
Но у этой фунции есть ещё одна беда - n И m должно быть обявленно выше нее...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Егор (статус: 10-ый класс), 13 сентября 2009, 11:24 [#44]:
по функциям - писать надо так:
var x integer;
...
begin
..
x:=maximum(a);
writeln('maximum=',x);
...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:28 [#45]:
по функциям - писать надо так:
var x integer;
...
begin
..
x:=maximum(a);
writeln('maximum=',x);
... [Pascal Error] ProCEdurES_DVUMERNYI_MAS.dpr(54): E2035 Not enough actual parameters
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Егор (статус: 10-ый класс), 13 сентября 2009, 11:31 [#46]:
to man@yTM: Вай, блин, зачем ещё два параметра ввёл?
to I{ () T:
var x, i, j : integer;
begin
..
i:=1;
j:=1;
x:=maximum(a,i,j);
writeln('maximum=',x, ' str=',i,' col=',j);
...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:37 [#48]:
АААА!!!! ЗАРАБОТАЛО!! ВСЕМ ОГРОМНОЕ СПАСИБО!!! ))))))
to man@yTM: Вай, блин, зачем ещё два параметра ввёл?
там просто получается что благодаря этим параметрам координаты выводятся в a[....]
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:38 [#49]:
program ProCEdurES_DVUMERNYI_MAS;
{$APPTYPE CONSOLE}
uses
SysUtils;
CONST n=5;m=5;
TYPE TMas=ARRAY[1..n,1..m] of integer;
var i,j:integer; a:TMas;
//------ВВОД массива-----
PROCEDURE INPUT(var a:TMas);
var i,j:integer;
BegiN
Randomize;
for i:=1 to n do
for j:=1 to m do
a[i,j]:=Random(25)-10;
WRITELN('pervonachalnyi massiv:')
EnD;
//------ВЫВОД массива-----------
PROCEDURE OUTPUT{output(1,n,1,m)}(i1,i2,j3,j4:integer);
var i,j:integer;
BegiN {вывод TMas с возможностью менять длину}
for i:=i1 to i2 do
bEGIN
writeln;
for j:=j3 to j4 do
write(a[i,j]:4,' ');
eND;
EnD;
Function Maximum(const a:TMas; var MaxI,MaxJ:integer):integer;
var i,j:integer;
begin
Result:=a[1,1];
for i:=1 to n do
for j:=1 to m do
if a[i,j]>Result
then begin
Result:= a[i, j];
MaxI:= i;
MaxJ:= j;
end;
writeln('Maximum: a[',MaxI,', ',MaxJ,'] = ',Result);
end;
begin
input(a);
output(1,n,1,m);
writeln;
i:=1;
j:=1;
Maximum(a,i,j);
readln;
end.
вот окончательная программа) может кому пригодится=)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:48 [#50]:
то Вадим К
не актуальный параметр - так надо передать актуальный параметр. На этом этапе и процедуры, и функции одинаковы, так что ...
В функцию нужно передать ТРИ параметра
function Maximum(const a: TMas; var MaxI, MaxJ: Integer): Integer;
то есть вызов будет такой
function Maximum(a, maxi,maxj);
Но у этой фунции есть ещё одна беда - n И m должно быть обявленно выше нее...
а вот CONST можно как то заменить? или это неотъемлемая часть функций? а n и m объявил выше))))
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 11:51 [#51]:
Найди 10 отличий.
program p3182;
{$APPTYPE CONSOLE}
{$B-} // Так надо!
uses
SysUtils;
type
// Тип - двумерный динамический массив 32-битных целых со знаком
TMatrix = array of array of Integer;
// Установка развера массива равным m x n,
// заполнение массива псевдослучайными числами в диапазоне -10...+14.
procedure Input(var X: TMatrix; const n, m: Cardinal);
var
i, j: Cardinal;
begin
if m + n = 0 // при m или n, равными 0 выход по ошибке
then begin
WriteLn('Incorrect array dimensions!');
Exit; // выход по ошибке
end;
SetLength(X, n, m); // Установка размеров (выделение памяти)
for i:= 0 to High(X) do
for j:= 0 to High(X[0]) do
X[i, j]:= Random(25) - 10; // Присвоение значений элементам
end;
// Вывод массива на экран
procedure Output(const X: TMatrix);
var
i, j: Cardinal;
begin
for i:= 0 to High(X) do
begin
for j:= 0 to High(X[0]) do
Write(X[i, j]: 4);
WriteLn;
end;
end;
// Поиск индексов и значения первого максимального элемента массива.
function Maximum(const X: TMatrix; var MaxI, MaxJ: Cardinal): Integer;
var
i, j: Cardinal;
begin
Result:= -MaxInt - 1; // Инициализация результата
MaxI:= 0; // Инициализация
MaxJ:= 0; // результатов
if (Length(X) = 0) or (Length(X[0]) = 0)
then begin
WriteLn('Incorrect array dimensions!');
Exit; // Выход по ошибке
end;
// Поиск максимального элемента
for i:= 0 to High(X) do
for j:= 0 to High(X[0]) do
if X[i, j] > Result
then begin
Result:= X[i, j]; // Запоминание максимума
MaxI:= i; // Запоминание индексов
MaxJ:= j; // максимального элемента
end;
end;
// Вычисление среднего арифметического от элементов матрицы
function Average(const X: TMatrix): Extended;
var
i, j: Cardinal;
begin
Result:= 0.0;
if (Length(X) = 0) or (Length(X[0]) = 0)
then begin
WriteLn('Incorrect array dimensions!');
Exit; // Выход по ошибке
end;
// Подсчёт среднего арифметического
for i:= 0 to High(X) do
for j:= 0 to High(X[0]) do
Result:= Result + X[i, j];
Result:= Result / (Length(X) * Length(X[0])); // Конечный результат
end;
// Подсчёт количества элементов, значения которых больше среднего арифметического
function Quantity(const X: TMatrix; const Aver: Extended): Cardinal;
var
i, j: Cardinal;
begin
Result:= 0; // Инициализация
if (Length(X) = 0) or (Length(X[0]) = 0)
then begin
WriteLn('Incorrect array dimensions!');
Exit; // Выход по ошибке
end;
// Подсчёт среднего арифметического
for i:= 0 to High(X) do
for j:= 0 to High(X[0]) do
if X[i, j] > Aver
then Inc(Result);
end;
var
X: TMatrix; // Наша матрица
MaxI: Cardinal = 0; // Индексы максимального
MaxJ: Cardinal = 0; // элемента для передачи в функцию Maximum()
Max: Integer; // Значение максимального элемента.
Aver: Extended; // Среднее для матрицы
Q: Cardinal; // Количество элементов, значения которых больше среднего арифметического
const
M = 6;
N = 9;
begin
Randomize(); // Инициализация ГПСЧ
Input(X, M, N); // Заполнение массива из 54 элементов
Output(X); // Вывод массива на экран.
Max:= Maximum(X, MaxI, MaxJ); // Поиск максимума
WriteLn(' Max = X[', MaxI, ', ', MaxJ, '] = ', Max); // Вывод значения и индексов максимума
Aver:= Average(X); // Вычисление среднего
WriteLn(' Average = ', Aver: 3: 10); // Вывод среднего
// Вычисление и вывод количества элементов, значения которых больше среднего арифметического
Q:= Quantity(X, Aver);
WriteLn(' Quantity = ', Q, ' (', (100 * Q / (N * M)): 2: 2, '%)');
Write(#13#10' Press ENTER to exit...');
ReadLn;
end.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 13 сентября 2009, 11:53 [#52]:
можно const выкинуть вообще (хотя в данном случае и не рекомендуется).
это слово говорит о том, что внутри функции или процедуры вы не будете менять значение массива, т.е. строчки типа
a[i,j]:=...
будут пресекаться компилятором как неверные (попытка записи в константный массив). а если const убрать. то такая строчка скомпилируется нормально.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:55 [#53]:
to min@y ДА У МОЕЙ УЧИЛЫ ИНФАРКТ СЛУЧИТСЯ ПОКАЖИ Я ЕЙ ЭТОТ КОД XDDDDDDD тут процентов 75 операций, которые в школе еще не прошли XDDD
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:56 [#54]:
я наконец начал разбираться в функциях=) спасибо вам=)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 11:57 [#55]:
Цитата (I{ () T):
тут процентов 75 операций, которые в школе еще не прошли
Это какие операции?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 13 сентября 2009, 11:59 [#56]:
to min@y™:
тут я придраться могу работал я преподавателем в школе. и если бы мне ученик ТАКОЕ принёс - фиг бы сдал. ибо для ученика вот это - слишком 
написано же было - ученик. проще надо быть, проще.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 12:05 [#57]:
Цитата (Егор):
если бы мне ученик ТАКОЕ принёс - фиг бы сдал.
Если ученик шарит, то завалить его не получится.
Ничего экстраординарного там нету.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 12:06 [#58]:
to Егор
вот вот=))))
to min@y
например даже тот же exit.
но из вашего кода почерпнул много полезного)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 12:11 [#59]:
Exit - это 75%?
На каком калькуляторе считал?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 12:17 [#60]:
to min@y
это просто пример=) а калькулятор- голова родимая=))))
или вот
Cardinal
to High(X) do
SetLength(X, n, m)
Result:= -MaxInt - 1; // Чтоб Вадим К не придирался.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
Страницы: [« Предыдущая] [1] [2] [3] [4] [5] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|