Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 182

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Дана матрица А(n,m), найти ее наибольший элемент(первый по порядку если их несколько)
написал код..но как то странно выводит наиб элемент, рандомом как то( помогите пожалуйста.

Приложение:
  1. uses
  2. SysUtils;
  3.  
  4. CONST n=5;m=5;
  5. TYPE TMas=ARRAY[1..n,1..m] of integer;
  6. var i,j,max:integer; a:TMas;
  7.  
  8.  
  9. PROCEDURE INPUT(var a:TMas);
  10. var i,j:integer;
  11. BegiN
  12. Randomize;
  13. for i:=1 to n do
  14. for j:=1 to m do
  15. a[i,j]:=Random(25)-10;
  16. WRITELN('pervonachalnyi massiv:')
  17. EnD;
  18.  
  19.  
  20. PROCEDURE OUTPUT{output(1,n,1,m)}(i1,i2,j3,j4:integer);
  21. var i,j:integer;
  22.  
  23. for i:=i1 to i2 do
  24. bEGIN
  25. writeln;
  26. for j:=j3 to j4 do
  27. write(a[i,j]:4,' ');
  28. eND;
  29. EnD;
  30.  
  31. PROCEDURE MAXIMUM( var a:TMas);
  32. var i,max:integer;
  33. BEGIN
  34. for i:=1 to n do
  35. if a[i,j]>0 then max:=a[i,j];
  36. for i:=1 to n do
  37. if a[i,j]>max then
  38. max:=a[i,j];
  39. writeln;
  40. WRITELN('max(a[i])=',max);
  41. END;
  42.  
  43.  
  44. begin
  45. input(a);
  46. output(1,n,1,m);
  47. maximum(a);
  48.  
  49. readln;
  50. end.


I{ () T Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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] [Следующая »]

Егор

Егор (статус: 10-ый класс), 13 сентября 2009, 11:23 [#41]:

кстати, насчёт "-2147483648" - а вот году так в 2015-ом, когда выйдет дельфи-2015, и в ней (возможно) будет тип integer не 32-битный, а 64-х (а то и все 128...), это число будет неверно...
:D :D :D
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

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

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.
Егор

Егор (статус: 10-ый класс), 13 сентября 2009, 11:35 [#47]:

лучший вопрос месяца! адназначна! :D
сошлись три гиганта мысли, три лучших эксперта, Вадим К, min@y™, Егор, а также группа присоединившихся :)
кто победит?

:D :D :D
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
I{ () T

I{ () T (статус: Посетитель), 13 сентября 2009, 11:37 [#48]:

АААА!!!! ЗАРАБОТАЛО!! ВСЕМ ОГРОМНОЕ СПАСИБО!!!:)))))))

to man@yTM: Вай, блин, зачем ещё два параметра ввёл?
там просто получается что благодаря этим параметрам координаты выводятся в a[....]
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

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

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™

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

I{ () T (статус: Посетитель), 13 сентября 2009, 11:55 [#53]:

to min@y ДА У МОЕЙ УЧИЛЫ ИНФАРКТ СЛУЧИТСЯ ПОКАЖИ Я ЕЙ ЭТОТ КОД XDDDDDDD тут процентов 75 операций, которые в школе еще не прошли XDDD
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 13 сентября 2009, 11:56 [#54]:

я наконец начал разбираться в функциях=) спасибо вам=)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

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™

min@y™ (статус: Доктор наук), 13 сентября 2009, 12:05 [#57]:

Цитата (Егор):


если бы мне ученик ТАКОЕ принёс - фиг бы сдал.

Если ученик шарит, то завалить его не получится.
Ничего экстраординарного там нету.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
I{ () T

I{ () T (статус: Посетитель), 13 сентября 2009, 12:06 [#58]:

to Егор
вот вот=))))
to min@y
например даже тот же exit.
но из вашего кода почерпнул много полезного)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

min@y™ (статус: Доктор наук), 13 сентября 2009, 12:11 [#59]:

Exit - это 75%?
На каком калькуляторе считал?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
I{ () T

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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 03:25
Выполнено за 0.04 сек.