|
Вопрос # 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, 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 - Саня (статус: 1-ый класс), 13 сентября 2009, 10:32 [#22]:
> понятно что функция может только одно значение вывести, в то время как процедура- сколько душа пожелает
функция тоже может значений выводить сколько угодно, только у неё есть одно "основное"
|
|
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™ (статус: Доктор наук), 13 сентября 2009, 10:35 [#24]:
Конструкция random(25)-10 не может вернуть число 15. Значения результата варьируется в пределах -10...14. Поэтому, напиши Result:= -10;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 10:39 [#25]:
эм. извиняюсь за наглость. хочу вывести номер строки и столбца максимума....у мя n=5 m=5, а он выводит 6,6
то бишь координаты несуществующего элемента
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
hx - Саня (статус: 1-ый класс), 13 сентября 2009, 10:41 [#26]:
Попробуй прибавить 1 и посмотри
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 10:43 [#27]:
i=7 j=7 стало после того как n=6 m=6
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
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 (статус: Посетитель), 13 сентября 2009, 10:46 [#29]:
ох Ё....тупо присвоить надо было. thanks a lot.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
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 (статус: Посетитель), 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 13 сентября 2009, 11:08 [#36]:
Цитата:
то есть вместо выражения Result желательнописать просто Maximum? а в че тут ошибка??
Вместо Result НЕжелательно писать имя функции. ИМя функции можно использовать только в левой части оператора присваивания (:=), в то время как Result - где угодно.
Нет там никакой ошибки.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
I{ () T (статус: Посетитель), 13 сентября 2009, 11:10 [#37]:
извините. сбился с толку
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Вадим К (статус: Академик), 13 сентября 2009, 11:17 [#38]:
то min@y™
Есть такие преподаватели, что .... поэтому лучше изначально писать "правильно" с поправкой на то, как дает преподаватель.
по поводу "нам известен закон". А вот это вторая бяка, которую допускают программисты. Представим себе, что в следующей лабораторной вновь понадобилось найти минимум... А закон распределения там другой. И всё, приплыли. Функция/процедура должна быть максимально "реюзабельной" - то есть не зависеть от входных данных, от положения Луны...
то Егор
написали же - когда все элементы равны -2147483648.
Но инициализировать переменные - рекомендованная правильная практика.
Возможен ведь вариант, что по какой то ошибке функция была вызвана с параметрами (...,0,0). Тогда будет не очень красиво.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|