• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Программа с несколькими процедурами, нисходящий способ

Регистрация
26 Мар 2014
Сообщения
10
Реакции
0
Баллы
0
Программа с несколькими процедурами, нисходящий способ

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

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

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

Вложения

  • Screenshot-48(3).webp
    Screenshot-48(3).webp
    25.8 KB · Просмотры: 87
Помогите с программой... началась новая тема, ничего не понял совершенно
К сожалению, помочь не можем. По крайней мере до тех пор, пока Вы будете хранить тайну языка программирования, как величайшую из святынь. Извините.
 
Ты случайно не из МЭИ ?

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

На паскале надо написать?
 
Последнее редактирование:
можете пожалуйста объяснить для чего нужна процедура?
Знаете, тут я Вас адресую к многочисленным учебникам и пособиям по программированию, где этот вопрос расписан детально и подробно (вот хоть по ссылке из #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.
Ничего, что вместо процедуры использована функция? Но если надо, можно и в процедуру переделать, это легко.
 
Спасибо)
Напишите пожалуйста Процедурой.
Чем процедура отличается от функции? что лучше?
 
Я прочитал но такое ощущение как будто это одно и то жеtehno036
 
Чем процедура отличается от функции? что лучше?
Я прочитал но такое ощущение как будто это одно и то же
Как говорится, "похоже, да не то же".
Попробую показать наглядно.
Код:
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. Вопрос "что лучше?" не просто бессмысленный, а АБСОЛЮТНО бессмысленный. Лучше то, что больше подходит к конкретной ситуации. Единственно - если подпрограмма вычисляет одну-единственную переменную, то целесообразнее использовать функцию. Просто удобнее.
 
Напишите пожалуйста Процедурой.
Пожалуйста:
Код:
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.
 
Вот это чудо, это чудесный форум!!!!
Вы просто очень добрый человек, помогаете глупым студентам.
Хотя для вас наверное такие задачки смешны....
Но всё равно это невероятно!! Я если научусь такому тоже буду здесь всем помогать.
Спасибо большое!
 
А можете ещё такую сделать, а то я думал однотипные все, но что-то не выходит...
Составить процедуру, исходными дан¬ными которой является матрица А из n строк и n столбцов, либо два массива B1,B2,...,Вn; C1,C2,...,Cm, либо один из них. Для проверки составленной внешней процедуры разработать головной модуль.
Важно. Процедура не должна использовать «внутри себя» глобальных переменных. Все необходимое для работы процедуры и передачи результата должно осуществляться через параметры процедуры.

Множество всех значений, имеющихся в массивах B1,B2,..., Bn; C1,C2,...,Cm, без повторения значений.

И можете объяснить что требуется в задаче, а то не понятен даже вопрос...
Я вот думаю так
Например С= 1, 3, 5, 1, 0, 5
B= 1, 10, 0, 5, -10

тогда ответ D= 1, 3, 5, 0, 10, -10
 
как это не использовать глобальные переменные =(? вот как теперь и жить (((
 
Я если научусь такому тоже буду здесь всем помогать.
Ждём с нетерпением!
А можете ещё такую сделать, а то я думал однотипные все, но что-то не выходит...
Могу и такую :D
Код:
Const
 N=20;
 M=16;

Type
 Ar1=Array[1..N] of byte;
 Ar2=Array[1..M] of byte;
 Ar3=Array[1..N+M] of byte;

Var
 B:Ar1;
 C:Ar2;
 D:Ar3;
 v,Nd:byte;

Procedure Select(Q:Ar1; P:Ar2; var R:Ar3; var Nr:Byte);
var
 i,j,k:byte;
 b:boolean;
 W:Ar3;
begin
 k:=0;
 for i:=1 to N do
  begin
   b:=true;
   for j:=1 to k do
    if Q[i]=W[j] then b:=false;
   if b then
    begin
     Inc(k);
     W[k]:=Q[i];
    end;
  end;
 for i:=1 to M do
  begin
   b:=true;
   for j:=1 to k do
    if P[i]=W[j] then b:=false;
   if b then
    begin
     Inc(k);
     W[k]:=P[i];
    end;
  end;
 Nr:=k;
 R:=W;
end;

Begin
 Randomize;

 Writeln('Array B:');
 for v:=1 to N do
  begin
   B[v]:=Random(40);
   Write(B[v]:4);
  end;
 writeln;
 writeln;

 Writeln('Array C:');
 for v:=1 to M do
  begin
   C[v]:=Random(40)+10;
   Write(C[v]:4);
  end;
 writeln;
 writeln;

 Select(B,C,D,Nd);

 Writeln('Result:');
 for v:=1 to Nd do Write(D[v]:4);

 Readln
End.
 
Вау, спасибо большое за такую огромную помощь!!!!!!!!!!!

Помогите ещё пожалуйста программу подкорректировать

В матрице A (4 строки, 5 столбцов) поменять местами наибольшие элементы в ее верхней и нижней половинах.

Для поиска индексов наибольшего элемента в произвольной части матрицы использовать процедуру.

Program lab31;
const n=4;
m=5;
type matr=array[1..n,1..m] of byte;

procedure XL(const mt:matr; n1,m1:byte; var im,jm:byte);
var i,j:byte;
max1,max2:byte;

begin
max1:=mt[(n1-1),1];
for i:=1 to n1 do
for j:=1 to m1 do
if max1<mt[i,j] then
begin
max1:=mt[j,i];
im:=i;
jm:=j;
end;
end;
var na:=4;
ma:=5;
i1m,j1m,i2m,j2m, i,j,c:byte;
var a:matr;
begin
for i:=1 to na do
begin
for j:=1 to ma do
begin
writeln('a[',i,',',j,']=');
readln(a[i,j]);
end;
XL(a,n,m,i1m,j1m);
writeln('i1m=',i1m);
writeln('j1m=',j1m);
XL(a,n,m,i2m,j2m);
writeln('i2m=',i2m);
writeln('j2m=',j2m);
c:=a[i1m,j1m];
a[i1m,j1m]:=a[i2m,j2m];
a[i2m,j2m]:=c;
for i:=1 to n do
begin
for j:=1 to m do
begin
write('a[',i,',',j,']=');
writeln;
end;
end;
end;
end.
 
Вот программа просто меняет нижнюю и верхнюю половины:
Код:
// Дана матрица размера M x N.
// (M — четное число).
// Поменять местами верхнюю
// и нижнюю половины матрицы.
program Matrix55;
var
j,i,M,N,num:integer;
a: array [1..10,1..10] of real;
temp:real;
bol:boolean;
begin
// Ввод данных
writeln('Введите числа M (M — четное число)(M<=10) и N (N<=10)');
read(M); readln(N);
writeln('Введите по ',N,' элементов (значения от 0 до 100) ');
for i:=1 to M do begin
write(i,' строки : ');
for j:=1 to N do read(a[i,j]);
end;
// Решение
for i:=1 to M div 2 do
begin
for j:=1 to N do
begin
temp:=a[i,j];
a[i,j]:=a[(M div 2) + i,j];
a[(M div 2) + i,j]:=temp;
end;

end;
// ответ
writeln;
writeln('Ответ');
for i:=1 to M do begin
writeln;
for j:=1 to N do write(a[i,j],' ');
end;
end.
 
У вас там получается что меняются строки местами, а нужно чтобы макимальные элементы менялись местами....
 
Помогите ещё пожалуйста программу подкорректировать
Ужас, конечно!
procedure XL(const mt:matr; n1,m1:byte; var im,jm:byte);
Ну где Вы видели, чтобы константа была параметром процедуры?!
А это еще что за "чудеса в решете"?
Ладно, вот работающий вариант:
Код:
const
 n=4;
 m=5;

Type matr=array[1..n,1..m] of byte;

procedure XL(mt:matr; n1,n2:byte; var im,jm:byte);
var
 i,j:byte;
 max:byte;
begin
 max:=mt[n1,1];
 im:=n1;
 jm:=1;
 for i:=n1 to n2 do
  for j:=1 to m do
   if max<mt[i,j] then
    begin
     max:=mt[i,j];
     im:=i;
     jm:=j;
    end;
end;

Var
 na1,na2,nb1,nb2,i1m,j1m,i2m,j2m,i,j,c:byte;
 a:matr;

Begin
 na1:=1;
 na2:=2;
 nb1:=3;
 nb2:=4;
 for i:=1 to n do
  for j:=1 to m do
   begin
    write('a[',i,',',j,']= ');
    readln(a[i,j]);
   end;
 writeln;
 writeln('Initial matrix:');
 for i:=1 to n do
  begin
   for j:=1 to m do write(a[i,j]:4);
   writeln;
  end;
 writeln;
 XL(a,na1,na2,i1m,j1m);
 writeln('i1m= ',i1m);
 writeln('j1m= ',j1m);
 XL(a,nb1,nb2,i2m,j2m);
 writeln('i2m= ',i2m);
 writeln('j2m= ',j2m);
 c:=a[i1m,j1m];
 a[i1m,j1m]:=a[i2m,j2m];
 a[i2m,j2m]:=c;
 writeln;
 writeln('New matrix:');
 for i:=1 to n do
  begin
   for j:=1 to m do write(a[i,j]:4);
   writeln;
  end;
 readln
End.
 
Назад
Сверху