Экспертная система 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] [Следующая »]

min@y™

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

Цитата (I{ () T):


в то время как процедура- сколько душа пожелает

Неправда! Функция тоже может принимать var-параметры.

Цитата (I{ () T):


заменяю в коде это на max:=random(25)-10 это. и постоянно вылазит ответ 15. почему это так?

Ни хрена не понял, что за хрень?

Цитата (I{ () T):


а заменить хочу Result:= -2147483648

Ну замени на Result:= a[1, 1];

Цитата (I{ () T):


эксперты при сдаче егэ не смогут придраться к ней?

Хотел бы послушать формулировку такой придирки, ога!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
hx - Саня

hx - Саня (статус: 1-ый класс), 13 сентября 2009, 10:32 [#22]:

> понятно что функция может только одно значение вывести, в то время как процедура- сколько душа пожелает

функция тоже может значений выводить сколько угодно, только у неё есть одно "основное"
I{ () T

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

“Цитата” (I{ () T)

заменяю в коде это на max:=random(25)-10 это. и постоянно вылазит ответ 15. почему это так?

Ни хрена не понял, что за хрень?
Егор (статус: 2-ой класс), 13 сентября 2009, 09:34:

-2147483648 - это наименьшее число, которое может принимать тип integer;
на самом деле можно было бы в вашем случае написать Result:=25-10; - это минимальный элемент, который есть у вас в массиве.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

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

Конструкция random(25)-10 не может вернуть число 15. Значения результата варьируется в пределах -10...14. Поэтому, напиши Result:= -10;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
I{ () T

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

эм. извиняюсь за наглость. хочу вывести номер строки и столбца максимума....у мя n=5 m=5, а он выводит 6,6
то бишь координаты несуществующего элемента
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
hx - Саня

hx - Саня (статус: 1-ый класс), 13 сентября 2009, 10:41 [#26]:

Попробуй прибавить 1 и посмотри
I{ () T

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

i=7 j=7 стало после того как n=6 m=6
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

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

function Maximum(const a: TMas; var MaxI, MaxJ: Integer): 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 begin
               Result:= a[i, j];
               MaxI:= i;
               MaxJ:= j;
             end;
 
   WRITELN('Maximum: a[', MaxI, ', ', MaxJ, '] = ', Result);
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
I{ () T

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

ох Ё....тупо присвоить надо было. thanks a lot.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

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

последний вопрос. а как объявлять фнкцию в гл проге?
begin
input(a);
output(1,n,1,m);
writeln;
maximum(a);{!!!!}
readln;
end.
ругается то что типа не актуальный параметр...
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Вадим К

Вадим К (статус: Академик), 13 сентября 2009, 10:54 [#31]:

По поводу Result - это абсолютно нормально при использовании в Delphi, но учитывая, что многие учителя не отошли от турбопаскаля (а там это не работает), лучше использовать имя процедуры (именно имя, без скобок, в левой части выражения).

по поводу выражения
Result:= -2147483648;
а вот за такое можно ставить большой минус. Потому что этот код не будет работать в турбопаскале и в первой делфи. И только не надо говорить, что не знали. Тип Integer 32битный только начиная с второй делфи, а до этого он был 16 битный (1 делфи и турбопаскаль). И правильным (и рекомендованным по алгоритмам) является использование первого элемента, хотя можно любой использовать, хоть последний - решение от этого не поменяется.

то min@y™
решение, представлено в последнем ответе - неверное. представим себе, что в массиве есть элементы, которые равны -2147483648... функция будет выводить мусор.
Галочка "подтверждения прочтения" - вселенское зло.
Валя

Валя (статус: 1-ый класс), 13 сентября 2009, 10:56 [#32]:

примерно вот так

maximum(a);{!!!!}
begin
input(a);
output(1,n,1,m);
writeln;
readln;
end.
I{ () T

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

то есть вместо выражения Result желательнописать просто Maximum? а в че тут ошибка?? function Maximum(const a:TMas; var MaxI, MaxJ: Integer): 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 begin
Result:= a[i, j];
MaxI:= i;
MaxJ:= j;
end;

WRITELN('Maximum: a[',MaxI,', ',MaxJ,'] = ',Result);
end;
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

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

Цитата (Вадим К):


а вот за такое можно ставить большой минус. Потому что этот код не будет работать в турбопаскале и в первой делфи.

А я и не говорил, что этот код БУДЕТ там работать. Но учитывая uses SysUtils, это уж точно не турбопаскаль. И не думаю, что кто-то щас юзает Delphi 1. Мой кусок кода - это ПРОСТО ПРИМЕР в данном контексте.

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

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

to Вадим К
если в массиве буду элементы, равные -2147483648, работать будет корректно. в остальном согласен
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

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

Цитата:


то есть вместо выражения Result желательнописать просто Maximum? а в че тут ошибка??

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

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

извините. сбился с толку
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Вадим К

Вадим К (статус: Академик), 13 сентября 2009, 11:17 [#38]:

то min@y™
Есть такие преподаватели, что .... поэтому лучше изначально писать "правильно" с поправкой на то, как дает преподаватель.
по поводу "нам известен закон". А вот это вторая бяка, которую допускают программисты. Представим себе, что в следующей лабораторной вновь понадобилось найти минимум... А закон распределения там другой. И всё, приплыли. Функция/процедура должна быть максимально "реюзабельной" - то есть не зависеть от входных данных, от положения Луны...

то Егор
написали же - когда все элементы равны -2147483648.
Но инициализировать переменные - рекомендованная правильная практика.

Возможен ведь вариант, что по какой то ошибке функция была вызвана с параметрами (...,0,0). Тогда будет не очень красиво.
Галочка "подтверждения прочтения" - вселенское зло.
I{ () T

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

begin
input(a);
output(1,n,1,m);
writeln;
maximum; сама функция...пишет что не актуальный параметр
readln;
end.

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

Вадим К (статус: Академик), 13 сентября 2009, 11:19 [#40]:

то min@y™

Цитата:

НЕжелательно писать имя функции

Будучи написано в правой части, оно не всегда вызывает рекурсию. В данном случае - никак не вызовет.
Галочка "подтверждения прочтения" - вселенское зло.

Страницы: [« Предыдущая] [1] [2] [3] [4] [5] [Следующая »]

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

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