Экспертная система 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]

I{ () T

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

to min@y теперь все НАМНОГО понятнее:) а что такое ГПЧС?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
min@y™

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

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


а что такое ГПЧС?

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

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

ГПЧС - группа помощи в чрезвычайных ситуациях.
ГПСЧ - генератор последовательности случайных чисел.
где то так:)
Галочка "подтверждения прочтения" - вселенское зло.
I{ () T

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

вопрос. вот нашел сумму всех эл. хочу среднее арифметич найти sr:=sum/(n*m) но пишет типа n(число строк) и m(столбцов) другого типа поэтому никак
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Вадим К

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

а какого типа sr? случайно не integer?
Галочка "подтверждения прочтения" - вселенское зло.
Егор

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

начнём по-порядку :)

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

CONST n=5;m=5;
TYPE TMas=ARRAY[1..n,1..m] of integer;

// было: var i,j:integer; a:TMas;
// стало так:
var a:TMas; // нам не нужны глобальные переменные i и j

//------ВВОД массива-----
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(begStr,endStr,begCol,endCol : integer); // зачем там комментарий прямо в центре строчки? мешает. да и имена переменным лучше давать более осмысленные
var i,j:integer;
BegiN {вывод TMas с возможностью менять длину}
writeln('massiv:'); // вот здесь эта строчка к месту будет
for i:=begStr to endStr do
begin
writeln;
for j:=begCol to endCol do
write(a[i,j]:4,' ');
eND;
EnD;

function arifm(const a:tmas):real; // sr - лучше убрать, не нужно оно и потом, среднее арифметическое - это дробное число, а не integer
var i,j:integer;
begin
Result:=0;
for i:=1 to n do
for j:=1 to m do
Result:=Result+a[i,j];
Result:=Result/(m*n);
// writeln('sr=',sr); - а вот вывод в функции - это не есть хорошо. обычно что-то выводят процедуры, не функции
end;

function kolvo(const a:tmas; sr:real ):integer; // убираем k и sr делаем дробным - real
var i,j, k:integer;
begin
k:=0; // - инициализировать-то кто будет?
for i:=1 to n do
for j:=1 to m do
if a[i,j]>sr then inc(k);
Result:=k;
//writeln('kol-vo=',k); - это - функция, вывод делать не будем
end;

var
sredn : real;

begin
input(a);
output(1,n,1,m);
sredn:=arifm(a);
writeln;
writeln('srednee: ',sredn);
writeln('kol-vo: ',kolvo(a,sredn));
readln;
end.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
I{ () T

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

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

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

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

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

первое - в функции вывод (write/writeln) не делаем. никогда. даже под пытками. ибо не есть гуд.
второе - функция вообще-то, должна возвращать один параметр (на то она и функция), и ей НЕ передаются значения как параметры-переменные - f(var x:integer) - а передаются параметры-значения - f(x:integer). ибо - ФУНКЦИЯ. допускается, но хорошим правилом будет передавать только параметры как значения (без var), либо с модификатором const.
третье - при делении целого на целое (integer) обязательно получится дробное (real), поэтому нужно пользоваться дробной переменной:
...
x: real;
a, b: integer;
...
x:=a/b;
...
если нужно разделить целое на целое и получить целое (округлённое!), то пользуемся div:
...
x, a, b: integer;
...
x:=a div b;
...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

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

функцию в функции можно вызвать так:
...
writeln('col-vo: ', kolvo(a,arifm(a)));
...
вот она, ещё одна прелесть функций - их можно вкладывать одну в другую :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
I{ () T

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

to Егор
а для чего вкладывать? я просмотрел ваш исходник. выдается ошибку на счет kolvo if a[i,j]>sr then inc(kolvo);
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Егор

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

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

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

теперь работает=) я еще подкорректировал вывод среднего значения :5:3 ибо выдает ошеломляющие цифры)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Егор

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

вкладывать удобно, когда в выражении нужно много функций:

x:=abs(sin(sqrt(x*x-r*r)+cos(y-b)))

примерно вот так
представь, что это надо было бы записать в виде процедур...

или же вопрос был именно в том, как вместо двух функций (нахождения среднего и количества элементов), сделать одну?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

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

упс, ещё вот что - была пропущена строчка

Result:=Result/(m*n);

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

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

да, действительно функции намного проще!) представил сколько процедурами писать.... вопрос был, как объдинить две функции? а вот допустим есть funk1 и в ней параметр A, можно ли использовать этот параметр в funk2? то есть так прямо в наглуу вызвать в funk2
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Егор

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

если я правильно понял :)

x:=funk1(funk2(a)); // один параметр
или
x:=funk1(a,funk2(a)); // два параметра
или
x:=funk1( funk2(a)+funk(b),c,d ); // три параметра

а лучше подобные вопросы не задавать здесь, а сразу попробовать сделать самому. и если заработает, и притом так, как надо, то, возможно, так делать можно :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

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

я думаю, код должен выглядеть где то так
sr = FindAVG(massiv)
count = FindCount(massiv, sr)
Дополнительные параметры, запятые и точки с запятыми добавить по вкусу.
Галочка "подтверждения прочтения" - вселенское зло.
I{ () T

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

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

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

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


я думаю, код должен выглядеть где то так
sr = FindAVG(massiv)
count = FindCount(massiv, sr)
Дополнительные параметры, запятые и точки с запятыми добавить по вкусу.


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

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

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

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