|
Вопрос # 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]
|
I{ () T (статус: Посетитель), 13 сентября 2009, 13:18 [#81]:
to min@y теперь все НАМНОГО понятнее а что такое ГПЧС?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 13:23 [#82]:
Цитата (I{ () T):
а что такое ГПЧС?
ГПСЧ - генератор псевдослучайных чисел.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 13 сентября 2009, 13:24 [#83]:
ГПЧС - группа помощи в чрезвычайных ситуациях.
ГПСЧ - генератор последовательности случайных чисел.
где то так
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 13 сентября 2009, 13:49 [#87]:
ой.....извиняюсь))) real конечно же должен быть....а как можно объединить две функции? в главной программе?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 13 сентября 2009, 14:33 [#99]:
да я пробую, ошибки выскакиват. спасибо за все. итак тему лишними вопросами засорил)
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
min@y™ (статус: Доктор наук), 13 сентября 2009, 14:37 [#100]:
Цитата (Вадим К):
я думаю, код должен выглядеть где то так
sr = FindAVG(massiv)
count = FindCount(massiv, sr)
Дополнительные параметры, запятые и точки с запятыми добавить по вкусу.
Ну я так и написал. Но, видать, топикстартер на мой пример внимания не обратил.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [« Предыдущая] [1] [2] [3] [4] [5]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|