|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
26.03.2014, 01:33 | #1 (permalink) |
Новичок
Регистрация: 26.03.2014
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Программа с несколькими процедурами, нисходящий способ
вот задание: Если сумма элементов последнего столбца матрицы A положительна, присвоить каждому из элементов X1,X2,...,X5 значение среднего арифметического соответствующей по номеру строки матрицы. можете пожалуйста объяснить для чего нужна процедура? и что такое нисходящий способ? |
26.03.2014, 01:33 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Советую вам посмотреть уже обсуждаемые аналогичные темы Программы с процедурами Придуман гениальный способ борьбы с неправильной парковкой WeChat - новый способ оставаться на связи Любопытный способ отделки АС Способ просмотра скрытого изображения Написать программу в Pascal с процедурами и функциями |
26.03.2014, 18:39 | #3 (permalink) |
Member
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ты случайно не из МЭИ ?
А то я сначала подумал что это я написал, у меня почти такая же программа, только сложнее. На паскале надо написать? Последний раз редактировалось Madara; 26.03.2014 в 18:45 |
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) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Знаете, тут я Вас адресую к многочисленным учебникам и пособиям по программированию, где этот вопрос расписан детально и подробно (вот хоть по ссылке из #4). Здесь всё-таки форум, а не курсы. Если кратко - подпрограммы (в Паскале - процедуры и функции) это практически самостоятельные программы, решающие конкретные задачи, предоставляющие возможность при необходимости обратиться к ним из тела основной программы, подставив нужные параметры и аргументы. Например, функции очень удобны для создания библиотек недостающих в Паскале математических операторов, таких, как Tan, ArcSin, ArcCos, Lg и т.п. Один раз описав эти операции, в дальнейшем Вы можете обращаться с ними так же, как со стандартными операциями типа Sin, Cos, Ln и т.п. Процедуры в принципе решают те же задачи, но, в отличие от функций, результатом может быть не одна, а сразу много величин.
К сожалению, есть такие "милые" люди, именующие себя "преподавателями информатики - составителями методичек", которые, знакомя студентов с аппаратом подпрограмм, не утруждают себя подбором таких примеров и заданий, где бы обучаемый почувствовал, что этот аппарат - колоссальное удобство, а не обуза, а просто берут линейные задачи, где подпрограммы нужны, как седло бизону, и требуют, чтобы куски программ были "оформлены в виде процедур". Вот как и в вашем случае. Хотя, пожалуй, не совсем - здесь всё-таки есть многократное обращение. А, не берите в голову. Дело в том, что те же "милые" преподаватели просто обожают изъясняться ну жуть до чего "высокопарным штилем". На самом деле нисходящий способ это, по сути, модульное построение программы, когда каждый чих задается в виде подпрограммы а тело программы представляет собой, по сути, цепочку обращений к этим процедурам да функциям. В нижеприведенном варианте решения задачи это не очень соблюдено (всё-таки я старался придерживаться здравого смысла), но если будут сильно приставать - сообщите, доведём. Цитата:
Код:
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. |
|
28.03.2014, 10:01 | #9 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Как говорится, "похоже, да не то же".
Попробую показать наглядно. Код:
Var T,x1,x2:Real; n:byte; ... Function QQQ(z1,z2:real; m:byte):Real; begin ... end; Begin T:=QQQ(x1,x2,n); End. Код:
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. Вопрос "что лучше?" не просто бессмысленный, а АБСОЛЮТНО бессмысленный. Лучше то, что больше подходит к конкретной ситуации. Единственно - если подпрограмма вычисляет одну-единственную переменную, то целесообразнее использовать функцию. Просто удобнее. |
28.03.2014, 10:14 | #10 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Пожалуйста:
Код:
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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|