Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2010, 13:07   #1
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию Вызов процедур в моей программе

Здравствуйте, форумчане. Я-начинающий программист.Пишу программу (консольную пока) по аппроксимации данных эксперимента поверхностью по методу наименьших квадратов. Описала процедуры и функции для формирования матриц, участвующих в алгоритме решения системы уравнений методом обратной матрицы. Дошла до самого тела программы, где я вывожу матрицы на экран - столкнулась с проблемой, что не могу (потому, что нет практических навыков) правильно организовать вызов процедур. Помогите, пожалуйста, правильно описать список фактических параметров моих процедур.
Код:
program ApproxForMo; // Аппроксимация для критерия оптимальности

{$APPTYPE CONSOLE}

const
NN=20; // Число опытов 
var
x: array [1..NN] of Real; // Массив значений 1-ой независимой переменной 
y: array [1..NN] of Real; // Массив значений 2-ой независимой переменной 
a: array [1..6,1..6] of Real; // Массив матрицы Грама 
z: array [1..NN] of Real; // Массив значений зависимой переменной (критерия) 
b: array [1..1,1..6] of Real; // Массив матрицы столбца свободных членов 
//Раздел описаний процедур 
// Процедура ввода 1-ой независимой переменной -x 
procedure   InputForX;
var
n: byte;
begin
for n:=1 to NN do
WriteLn ( 'Введите значения x[n]:' );
Write ('x[n]=', x[n]);
ReadLn; // Пауза
end;

// Процедура ввода 2-ой независимой переменной -y
procedure   InputForY;
var
n: byte;
begin
for n:=1 to NN do
WriteLn ( 'Введите значения y[n]:' );
Write ('y[n]=', y[n]);
ReadLn; 
end;

//  Процедура ввода зависимой переменной (критерия) -z
procedure   InputForZ;
var
n: byte;
begin
for n:=1 to NN do
WriteLn ('Введите значения  z[n]:' );
Write ('z[n]=', z[n]);
ReadLn; 
end;




// Описание процедуры вычисления значения элементов матрицы Грама
procedure CreateMatricaGrama;

function Create_Element1: real;
var
s1: Real;
n: Integer;
begin
s1:=0;
for n:=1 to NN do s1:=s1+x[n]*x[n]*x[n]*x[n];
Result:=s1;
a[1,1]:= Result;
//write(a[1,1]);
end;

...

function Create_Element36: real;
var
s36: Real;
n: Integer;
begin
s36:=0;
for n:=1 to NN do s36:=s36+1*1;
Result:=s36;
a[6,6]:=Result;
//write(a[6,6]);
end;

// пустой ли ?
begin

end;
// Описание процедуры вычисления значения элементов матрицы столбца свободных членов

procedure CreateMatricaColumn_of_AbsoluteTerms;

function Create_Element_b1: real;
var
s1: Real;
n: Integer;
begin
s1:=0;
for n:=1 to NN do s1:=s1+x[n]*x[n]*z[n];
Result:=s1;
b[1,1]:= Result;
//write(b[1,1]);
end;

...

function Create_Element_b6: real;
var
s6: Real;
n: Integer;
begin
s6:=0;
for n:=1 to NN do s6:=s6+1*z[n];
Result:=s6;
b[1,6]:=Result;
//write(b[1,6]);
end;

// Пустой ли?
begin

end;
// Описание процедуры вывода для мартицы а
procedure OutputArray_a;
var
i,j: Integer;
begin  
Writeln('Вывод массива "а" в вbде мартицы.');
for i:=1 to 6 do begin
for j:=1 to 6 do Write( a[i,j]:6 );
Writeln;
readLn;
end;
end;
// Описание процедуры вывода для матрицы b
procedure OutputArray_b; 
var
i,j: Integer;
begin 
Writeln('Вывод массива "b" в виде матрицы.');
for i:=1 to 6 do begin
for j:=1 to 6 do Write( b[i,j]:6 );
Writeln;
readLn;
end;
end;
// Раздел операторов программы Optimizacia2
BEGIN
// Оператор ввода/вывода числа опытов-NN
WriteLn ( 'Проверь число опытов:' );
Write ('NN=', NN);
ReadLn; 
// Операторы вызова процедур. Прошу помочь правильно записать
procedure InputForX (); 
procedure InputForY ();
procedure InputForZ ();
procedure CreateMatricaGrama ();
procedure CreateMatricaColumn_of_AbsoluteTerms();
procedure OutputArray_a ();
procedure OutputArray_b ();
END.
Say we can do it together
Беллая вне форума Ответить с цитированием
Старый 19.08.2010, 13:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure InputForX (); 
procedure InputForY ();
procedure InputForZ ();
procedure CreateMatricaGrama ();
procedure CreateMatricaColumn_of_AbsoluteTerms();
procedure OutputArray_a ();
procedure OutputArray_b ();
Когда вызываешь не нужно писать слово procedure или function
просто пиши
Код:
InputForX (); 
InputForY ();
...
Цитата:
// пустой ли ?
begin

end;
А это что?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2010, 13:38   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Для начала стоит определить тип:

Код:
const
  NN = 20;

type
  TNNArray = array [1..NN] of Real;

var
var
  x: TNNArray; // Массив значений 1-ой независимой переменной 
  y: TNNArray; // Массив значений 2-ой независимой переменной 
  a: array [1..6,1..6] of Real; // Массив матрицы Грама 
  z: TNNArray; // Массив значений зависимой переменной (критерия) 
  b: array [1..1,1..6] of Real; // Массив матрицы столбца свободных членов
Далее, сейчас у вас все переменные - глобальные. Поэтому любая процедура может их использовать и параметры ей как бы и не нужны.

С другой стороны, такой подход - не очень хорошо. Плюс, вы можете заметить, что ваши InputForXYZ практически одинаковы.

Тогда вы могли бы написать:
Код:
// Процедура ввода зависимой/независимой переменной
procedure InputArr(var Arr: TNNArray; ArrName: String);
var
  n: byte;
begin
  WriteLn ( 'Введите значения ', ArrName, ':' );
  for n:=1 to NN do
  begin
    Write (ArrName, '[', n ,']=', Arr[n]);
    ReadLn; 
  end;
end;

...

begin
  ...
  // Операторы вызова процедур.
  InputForArr(x, 'x'); 
  InputForArr(y, 'y');
  InputForArr(z, 'z');
  CreateMatricaGrama;
  CreateMatricaColumn_of_AbsoluteTerms;
  OutputArray_a;
  OutputArray_b;  
end.
Аналогично поступить и с OutputArray_ab, да и с ввести параметры к остальным процедурам можно.

Кроме того, NN у вас константа, но вы её вводите/меняете?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.08.2010, 13:42   #4
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию

Stilet, здравствуйте.
Код:
begin

end;
Я то думаю, что это раздел операторов процедуры. Наверное, он не пустой должен быть? Здесь функции, наверное, вызвать надо? Кроме функций больше никакого оператора то и нет.

Спасибо, Stilet.

Сделала, как вы указали, и операторы вызова функции занесла в исполнительную часть процедуры, кое-какие ошибки ввода/вывода исправила - программа работает. Сам факт этого ликования не вызывает, есть, что позже надо будет доделать, но промежуточную проверку вычислений сделать теперь могу.

Спасибо, GumSmoker , за ценное замечание - "у вас все переменные - глобальные. Поэтому любая процедура может их использовать и параметры ей как бы и не нужны". Другую организацию процедур отложу на потом - надо дальше математику программировать.
Say we can do it together

Последний раз редактировалось Stilet; 19.08.2010 в 17:09.
Беллая вне форума Ответить с цитированием
Старый 19.08.2010, 17:12   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Наверное, он не пустой должен быть? Здесь функции, наверное, вызвать надо?
Пустым он быть может, но тогда его просто компилятор проигнорирует
В нем ессно тебе нужно прописать код, чтоб процедура правильно работала, если она содержит подфункции, то их вызывай там... В общем тут уж фантазия программиста, но пустая процедура ошибкой не считается.
Цитата:
но промежуточную проверку вычислений сделать теперь могу.
Что имеется ввиду?
Покажи как уже сделала и опиши что еще хочешь и что не получается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.08.2010, 04:25   #6
Беллая
Пользователь
 
Аватар для Беллая
 
Регистрация: 30.07.2010
Сообщений: 44
По умолчанию Что получилось

показываю во вложении.
Поскольку у меня здесь все переменные глобальные параметры при вызове процедур и функций указывать не стала.

P.S. Собираюсь разобраться с подпрограммой-русификатором для корректного вывода русского текста указанного в процедурах. Потом к вычислению детерминанта моей симметричненькой квадратненькой матрицы Грама перейду.

Ещё радостью хочу поделиться - вычисления программой выполнены верно, я с экселевскими сверяла, так точно!
Вложения
Тип файла: rar Вывод на экран.rar (34.9 Кб, 7 просмотров)
Тип файла: rar Тело исполнительной части программы.rar (29.6 Кб, 7 просмотров)
Say we can do it together
Беллая вне форума Ответить с цитированием
Старый 21.08.2010, 08:01   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Беллая
Хитрая ты дамочка )
Цитата:
подпрограммой-русификатором для корректного вывода русского текста
Легкий примерчик для винды:
Код:
uses windows,
  SysUtils;
var s:string;
begin
 s:='привет мир';
 AnsiToOem(@s[1],@s[1]);
 write(s);readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Основные моменты выделены.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открыть с помощью моей программы! KWN, lnc Общие вопросы Delphi 1 22.04.2009 14:33
структура моей бд. Нужно разъяснение. Roof Microsoft Office Access 1 27.12.2008 18:23
Помогите Сестренке моей (ПАСКАЛЬ) KurtCobainUfa Помощь студентам 2 11.06.2008 17:50
обновление моей программы andrey4623 Общие вопросы Delphi 1 15.03.2008 13:15
прокси в моей программе SHEI'TI Работа с сетью в Delphi 1 18.11.2006 19:11