Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 26.03.2014, 01:33   #1 (permalink)
"Программист"
Новичок
 
Регистрация: 26.03.2014
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Программа с несколькими процедурами, нисходящий способ

Помогите с программой... началась новая тема, ничего не понял совершенно

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

можете пожалуйста объяснить для чего нужна процедура? и что такое нисходящий способ?
Миниатюры
screenshot-48-3-.jpg  
"Программист" вне форума   Ответить с цитированием

Старый 26.03.2014, 01:33
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Советую вам посмотреть уже обсуждаемые аналогичные темы

Программы с процедурами
Придуман гениальный способ борьбы с неправильной парковкой
WeChat - новый способ оставаться на связи
Любопытный способ отделки АС
Способ просмотра скрытого изображения
Написать программу в Pascal с процедурами и функциями

Старый 26.03.2014, 10:06   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,837
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от "Программист" Посмотреть сообщение
Помогите с программой... началась новая тема, ничего не понял совершенно
К сожалению, помочь не можем. По крайней мере до тех пор, пока Вы будете хранить тайну языка программирования, как величайшую из святынь. Извините.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 26.03.2014, 18:39   #3 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

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

Последний раз редактировалось Madara; 26.03.2014 в 18:45
Madara вне форума   Ответить с цитированием
Старый 26.03.2014, 18:51   #4 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вот теория.
Может поможет.

Это для языка "Паскаль" !
Вложения
Тип файла: docx Процедуры и функции в Паскаль (общая часть).docx (33.5 Кб, 405 просмотров)
Madara вне форума   Ответить с цитированием
Старый 26.03.2014, 22:46   #5 (permalink)
"Программист"
Новичок
 
Регистрация: 26.03.2014
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Да, это Паскаль, помогите пожалуйста.
"Программист" вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 27.03.2014, 11:03   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,837
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от "Программист" Посмотреть сообщение
можете пожалуйста объяснить для чего нужна процедура?
Знаете, тут я Вас адресую к многочисленным учебникам и пособиям по программированию, где этот вопрос расписан детально и подробно (вот хоть по ссылке из #4). Здесь всё-таки форум, а не курсы. Если кратко - подпрограммы (в Паскале - процедуры и функции) это практически самостоятельные программы, решающие конкретные задачи, предоставляющие возможность при необходимости обратиться к ним из тела основной программы, подставив нужные параметры и аргументы. Например, функции очень удобны для создания библиотек недостающих в Паскале математических операторов, таких, как Tan, ArcSin, ArcCos, Lg и т.п. Один раз описав эти операции, в дальнейшем Вы можете обращаться с ними так же, как со стандартными операциями типа Sin, Cos, Ln и т.п. Процедуры в принципе решают те же задачи, но, в отличие от функций, результатом может быть не одна, а сразу много величин.
К сожалению, есть такие "милые" люди, именующие себя "преподавателями информатики - составителями методичек", которые, знакомя студентов с аппаратом подпрограмм, не утруждают себя подбором таких примеров и заданий, где бы обучаемый почувствовал, что этот аппарат - колоссальное удобство, а не обуза, а просто берут линейные задачи, где подпрограммы нужны, как седло бизону, и требуют, чтобы куски программ были "оформлены в виде процедур". Вот как и в вашем случае. Хотя, пожалуй, не совсем - здесь всё-таки есть многократное обращение.
Цитата:
Сообщение от "Программист" Посмотреть сообщение
и что такое нисходящий способ?
А, не берите в голову. Дело в том, что те же "милые" преподаватели просто обожают изъясняться ну жуть до чего "высокопарным штилем". На самом деле нисходящий способ это, по сути, модульное построение программы, когда каждый чих задается в виде подпрограммы а тело программы представляет собой, по сути, цепочку обращений к этим процедурам да функциям. В нижеприведенном варианте решения задачи это не очень соблюдено (всё-таки я старался придерживаться здравого смысла), но если будут сильно приставать - сообщите, доведём.
Цитата:
Сообщение от "Программист" Посмотреть сообщение
вот задание: Если сумма элементов последнего столбца матрицы 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.
Ничего, что вместо процедуры использована функция? Но если надо, можно и в процедуру переделать, это легко.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 27.03.2014, 23:55   #7 (permalink)
"Программист"
Новичок
 
Регистрация: 26.03.2014
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо)
Напишите пожалуйста Процедурой.
Чем процедура отличается от функции? что лучше?
"Программист" вне форума   Ответить с цитированием
Старый 28.03.2014, 00:00   #8 (permalink)
"Программист"
Новичок
 
Регистрация: 26.03.2014
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Я прочитал но такое ощущение как будто это одно и то же
"Программист" вне форума   Ответить с цитированием
Старый 28.03.2014, 10:01   #9 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,837
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от "Программист" Посмотреть сообщение
Чем процедура отличается от функции? что лучше?
Цитата:
Сообщение от "Программист" Посмотреть сообщение
Я прочитал но такое ощущение как будто это одно и то же
Как говорится, "похоже, да не то же".
Попробую показать наглядно.
Код:
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. Вопрос "что лучше?" не просто бессмысленный, а АБСОЛЮТНО бессмысленный. Лучше то, что больше подходит к конкретной ситуации. Единственно - если подпрограмма вычисляет одну-единственную переменную, то целесообразнее использовать функцию. Просто удобнее.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 28.03.2014, 10:14   #10 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,837
Сказал(а) спасибо: 316
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Цитата:
Сообщение от "Программист" Посмотреть сообщение
Напишите пожалуйста Процедурой.
Пожалуйста:
Код:
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.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.