Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Программа с несколькими процедурами, нисходящий способ (http://www.tehnari.ru/f41/t95430/)

"Программист" 26.03.2014 01:33

Программа с несколькими процедурами, нисходящий способ
 
Вложений: 1
Помогите с программой... началась новая тема, ничего не понял совершенно tehno015

вот задание:
Если сумма элементов последнего столбца матрицы A положительна, присвоить каждому из элементов X1,X2,...,X5 значение среднего арифметического соответствующей по номеру строки матрицы.

можете пожалуйста объяснить для чего нужна процедура? и что такое нисходящий способ?

Vladimir_S 26.03.2014 10:06

Цитата:

Сообщение от "Программист" (Сообщение 1019192)
Помогите с программой... началась новая тема, ничего не понял совершенно

К сожалению, помочь не можем. По крайней мере до тех пор, пока Вы будете хранить тайну языка программирования, как величайшую из святынь. Извините.

Madara 26.03.2014 18:39

Ты случайно не из МЭИ ?

А то я сначала подумал что это я написал, у меня почти такая же программа, только сложнее.

На паскале надо написать?

Madara 26.03.2014 18:51

Вложений: 1
Вот теория.
Может поможет.

Это для языка "Паскаль" !

"Программист" 26.03.2014 22:46

Да, это Паскаль, помогите пожалуйста.

Vladimir_S 27.03.2014 11:03

Цитата:

Сообщение от "Программист" (Сообщение 1019192)
можете пожалуйста объяснить для чего нужна процедура?

Знаете, тут я Вас адресую к многочисленным учебникам и пособиям по программированию, где этот вопрос расписан детально и подробно (вот хоть по ссылке из #4). Здесь всё-таки форум, а не курсы. Если кратко - подпрограммы (в Паскале - процедуры и функции) это практически самостоятельные программы, решающие конкретные задачи, предоставляющие возможность при необходимости обратиться к ним из тела основной программы, подставив нужные параметры и аргументы. Например, функции очень удобны для создания библиотек недостающих в Паскале математических операторов, таких, как Tan, ArcSin, ArcCos, Lg и т.п. Один раз описав эти операции, в дальнейшем Вы можете обращаться с ними так же, как со стандартными операциями типа Sin, Cos, Ln и т.п. Процедуры в принципе решают те же задачи, но, в отличие от функций, результатом может быть не одна, а сразу много величин.
К сожалению, есть такие "милые" люди, именующие себя "преподавателями информатики - составителями методичек", которые, знакомя студентов с аппаратом подпрограмм, не утруждают себя подбором таких примеров и заданий, где бы обучаемый почувствовал, что этот аппарат - колоссальное удобство, а не обуза, а просто берут линейные задачи, где подпрограммы нужны, как седло бизону, и требуют, чтобы куски программ были "оформлены в виде процедур". Вот как и в вашем случае. Хотя, пожалуй, не совсем - здесь всё-таки есть многократное обращение.
Цитата:

Сообщение от "Программист" (Сообщение 1019192)
и что такое нисходящий способ?

А, не берите в голову. Дело в том, что те же "милые" преподаватели просто обожают изъясняться ну жуть до чего "высокопарным штилем". На самом деле нисходящий способ это, по сути, модульное построение программы, когда каждый чих задается в виде подпрограммы а тело программы представляет собой, по сути, цепочку обращений к этим процедурам да функциям. В нижеприведенном варианте решения задачи это не очень соблюдено (всё-таки я старался придерживаться здравого смысла), но если будут сильно приставать - сообщите, доведём.
Цитата:

Сообщение от "Программист" (Сообщение 1019192)
вот задание: Если сумма элементов последнего столбца матрицы A положительна, присвоить каждому из элементов X1,X2,...,X5 значение среднего арифметического соответствующей по номеру строки матрицы.

Задание малость "недосказано". А если сумма отрицательная либо нулевая, то каким должен быть массив Х? Ладно, будем считать, что в этом случае он будет нулевым. Тогда так:
Код:

Type
 Vect=Array[1..5] of Real;

Var
 A:Array[1..5] of Vect;
 X,Y:Vect;
 p,q:Byte;
 Sum5Col:Real;

Function V_med(R:Vect):Real;
var
 i:byte;
 M:Real;
begin
 M:=0;
 for i:=1 to 5 do M:=M+R[i];
 V_med:=M/5;
end;

Begin
 for p:=1 to 5 do X[p]:=0;
 Randomize;
 for p:=1 to 5 do
  begin
  for q:=1 to 5 do
    begin
    A[p,q]:=Random*100-40;
    write(A[p,q]:8:3);
    end;
  writeln;
  Y[p]:=A[p,5];
  end;
 writeln;
 Sum5Col:=V_med(Y)*5;
 writeln( 'Sum = ',Sum5Col:0:3);
 writeln;
 if Sum5Col>0 then
  for p:=1 to 5 do X[p]:=V_med(A[p]);
 writeln('Array X:');
 for p:=1 to 5 do write(X[p]:8:3);
 readln
End.

Ничего, что вместо процедуры использована функция? Но если надо, можно и в процедуру переделать, это легко.

"Программист" 27.03.2014 23:55

Спасибо)
Напишите пожалуйста Процедурой.
Чем процедура отличается от функции? что лучше?

"Программист" 28.03.2014 00:00

Я прочитал но такое ощущение как будто это одно и то жеtehno036

Vladimir_S 28.03.2014 10:01

Цитата:

Сообщение от "Программист" (Сообщение 1019819)
Чем процедура отличается от функции? что лучше?

Цитата:

Сообщение от "Программист" (Сообщение 1019822)
Я прочитал но такое ощущение как будто это одно и то же

Как говорится, "похоже, да не то же".
Попробую показать наглядно.
Код:

Var
 T,x1,x2:Real;
 n:byte;
 ...
Function QQQ(z1,z2:real; m:byte):Real;
begin
 ...
end;

Begin
 T:=QQQ(x1,x2,n);
End.

В данной "программе" описана функция QQQ от трёх переменных: двух вещественных и одной целой. Значением функции является вещественная величина (одна!) QQQ, с которой следует обращаться также, как и со стандартными функциями:
Код:

Y1:=Sin(0.74);
Y2:=QQQ(x1,0.25,7);

Теперь рассмотрим процедуру:
Код:

Var
 T,x1,x2:Real;
 n:byte;
 D:boolean;
 S:String;
 ...
Procedure QQQ(z1,z2:real; m:byte; var b:boolean; var R:String);
begin
 ...
end;

Begin
  QQQ(x1,x2,n,D,S);
End.

Отличия от функции:
1. На выходе процедуры могут формироваться не одна, а сразу несколько переменных, причем разных типов. При описании процедуры в перечне ее параметров входные задаются так же, как и в функции, а выходным предшествует служебное слово "var". С массивами, правда, сложнее, но этого пока трогать не будем.
2. Имя процедуры НЕ является, в отличие от функции, идентификатором переменной. При обращении к процедуре из тела программы ее имя есть команда вызова.

Сейчас сделаю вариант программы с процедурой, как Вы просите. Надеюсь, станет понятнее.

P.S. Вопрос "что лучше?" не просто бессмысленный, а АБСОЛЮТНО бессмысленный. Лучше то, что больше подходит к конкретной ситуации. Единственно - если подпрограмма вычисляет одну-единственную переменную, то целесообразнее использовать функцию. Просто удобнее.

Vladimir_S 28.03.2014 10:14

Цитата:

Сообщение от "Программист" (Сообщение 1019819)
Напишите пожалуйста Процедурой.

Пожалуйста:
Код:

Type
 Vect=Array[1..5] of Real;

Var
 A:Array[1..5] of Vect;
 X,Y:Vect;
 p,q:Byte;
 Sum5Col:Real;

Procedure V_med(R:Vect; var Vm:Real);
var
 i:byte;
 M:Real;
begin
 M:=0;
 for i:=1 to 5 do M:=M+R[i];
 Vm:=M/5;
end;

Begin
 for p:=1 to 5 do X[p]:=0;
 Randomize;
 for p:=1 to 5 do
  begin
  for q:=1 to 5 do
    begin
    A[p,q]:=Random*100-30;
    write(A[p,q]:8:3);
    end;
  writeln;
  Y[p]:=A[p,5];
  end;
 writeln;
 V_med(Y,Sum5Col);
 Sum5Col:=Sum5Col*5;
 writeln( 'Sum = ',Sum5Col:0:3);
 writeln;
 if Sum5Col>0 then
  for p:=1 to 5 do V_med(A[p],X[p]);
 writeln('Array X:');
 for p:=1 to 5 do write(X[p]:8:3);
 readln
End.



Часовой пояс GMT +4, время: 09:12.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.