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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2013, 16:34   #1
Crazy-kun
Пользователь
 
Аватар для Crazy-kun
 
Регистрация: 27.05.2013
Сообщений: 11
По умолчанию Матрицы. Заполнение и вывод подпрограммами. Turbo Pascal.

Есть одна простая задачка которую нужно решить не совсем простым способом. Нужно создать матрицу 5х5, заполнить ее рандомно и вывести на экран. Проблема в том, что заполнить матрицу нужно с помощью подпрограммы и с помощью подпрограммы вывести ее на экран. На эту проблему я напоролся когда понял что тип результата функции или процедуры должен быть базовый.
Код:
program dfds;
type matrix=array[1..5, 1..5] of byte;
var
  i,j:byte;
  m:matrix;

procedure vvod(x:matrix);
var i,j:byte;
begin
  for i:=1 to 5 do
    for j:=1 to 5 do
      x[i,j]:=i*j
end;

begin
  m:=vvod(m);
  for i:=1 to 5 do
  begin
    for j:=1 to 5 do
      write(m[i,j]:4);
    writeln;
  end;
end.
Вот мой нерабочий код.
Crazy-kun вне форума Ответить с цитированием
Старый 06.06.2013, 16:55   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

А так?
Код:
program dfds;
type matrix=array[1..5, 1..5] of byte;
var
  i,j:byte;
  m:matrix;

procedure vvod(var x:matrix);
var i,j:byte;
begin
  for i:=1 to 5 do
    for j:=1 to 5 do
      x[i,j]:=i*j
end;

begin
  vvod(m);
  for i:=1 to 5 do
  begin
    for j:=1 to 5 do
      write(m[i,j]:4);
    writeln;
  end;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2013, 16:59   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Так-с..
Сначала исправим ошибки, которые нам любезно подсказал компилятор :
Вместо
Цитата:
m:=vvod(m);
Пишем просто
Код:
vvod (m);
Теперь попробуйте запустить программу. Ну что? Вывелись нули (или возможно какой-то "мусор")?

А если еще исправить :
Цитата:
Код:
procedure vvod(x:matrix);
на
Код:
procedure vvod(var x:matrix);
?
Вы, наверное, не до конца разобрались со способами передачи параметров.


P.S. Очень рад, что остались студенты\школьники, пишущие код самостоятельно, а не сразу бегущие на форум.
P.P.S. Не успел..
Удачи!
Poma][a вне форума Ответить с цитированием
Старый 06.06.2013, 17:05   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
P.S. Очень рад, что остались студенты\школьники, пишущие код самостоятельно, а не сразу бегущие на форум.
+1
Цитата:
Сообщение от Poma][a Посмотреть сообщение
P.P.S. Не успел..
Зато все объяснили
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2013, 17:12   #5
Crazy-kun
Пользователь
 
Аватар для Crazy-kun
 
Регистрация: 27.05.2013
Сообщений: 11
По умолчанию

BDA
Точно, все работает. Честное слово, забыл что процедура изменяет значение глобальной переменной.

Poma][a, спасибо за пояснение.
Заочник я, объясняют все поверхностно, так что многого не схватываю. Кстати, что делает var в заголовке процедуры? Не совсем понял как оно работает.

Последний раз редактировалось Stilet; 06.06.2013 в 18:22.
Crazy-kun вне форума Ответить с цитированием
Старый 06.06.2013, 17:20   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

http://borlpasc.narod.ru/docym/Faronov/gl8/gl8_3.html
В принципе, можно прочесть всю книжку - http://borlpasc.narod.ru/docym/Faronov/index.html.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.06.2013, 17:29   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Кстати, что делает var в заголовке процедуры?
В паскале есть 3 способа передачи параметров :
1) По значению
Код:
procedure Example (n : Integer);
2) По ссылке
Код:
procedure Example (var n : Integer);
3) Константой
Код:
procedure Example (const n : Integer);
Когда Вы передает параметр по значению, он фактически копируется в новую ячейку памяти. После выхода из процедуры, параметр, который Вы передавали в эту процедуру, останется тем же.
Код:
procedure ChangeValue (n : Integer);

begin
	n := 10
end;

var
	n : Integer;
begin
	ReadLn (n);
	ChangeValue (n);
	WriteLn (n)
end.
Когда Вы передаете параметр по ссылке, то Вы передаете только адрес (насколько помню в Turbo он занимает 1 байт, а во Free - 2 байта) (при передаче по значению же тот параметр будет копироваться). Поэтому все изменения, которые произойдут с переменной в процедуре "сохранятся".
Код:
procedure ChangeValue (var n : Integer);

begin
	n := 10
end;

var
	n : Integer;
begin
	ReadLn (n);
	ChangeValue (n);
	WriteLn (n)
end.
Переда ввиде константы хороша сразу 2-мя вещами :
1) Он НЕ позволяет изменять параметр.
2) Он происходит точно так же, как и передача по ссылке, тоесть передает только адрес.

Поэтому многие авторы при использовании процедур вывода советуют использовать именно передачу ввиде константы.

Код:
procedure ChangeValue (const n : Integer);

begin
	n := 10
end;

var
	n : Integer;
begin
	ReadLn (n);
	ChangeValue (n);
	WriteLn (n)
end.
Не компилируется? Правильно

P.S. Даже не сомневался
Poma][a вне форума Ответить с цитированием
Старый 06.06.2013, 17:58   #8
Crazy-kun
Пользователь
 
Аватар для Crazy-kun
 
Регистрация: 27.05.2013
Сообщений: 11
По умолчанию

Poma][a, теперь все более-менее понятно, спасибо.

После того как разобрался с процедурами, возникла проблема с процедурным типом. Эту задачу нужно решить используя процедурный тип. Если бы я использовал функции, то можно было бы передать функции вывода функцию ввода в качестве параметра, используя процедурный тип. Но функции я использовать не могу, т.к. они требуют описания типа результата, а тип matrix не подойдет.
В общем, есть какие-нибудь идеи как можно решить задачу заполнения и вывода матрицы, обязательно используя процедурный тип?
Crazy-kun вне форума Ответить с цитированием
Старый 06.06.2013, 18:12   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Почему тип matrix не подойдет?
Код:
type
  matrix = array [1 .. 5, 1 .. 5] of byte;

function vvod(): matrix;
var
  i, j: byte;
begin
  for i := 1 to 5 do
    for j := 1 to 5 do
      vvod[i, j] := i * j
end;

procedure vivod(const x: matrix);
var
  i, j: byte;
begin
  for i := 1 to 5 do
  begin
    for j := 1 to 5 do
      write(x[i, j]:4);
    writeln;
  end;
end;

begin
  vivod(vvod());
  readln;
end.
Или вот такое извращение:
Код:
type
  matrix = array [1 .. 5, 1 .. 5] of byte;
  f = procedure(var x: matrix);

var
  m: matrix;

procedure vvod(var x: matrix);
var
  i, j: byte;
begin
  for i := 1 to 5 do
    for j := 1 to 5 do
      x[i, j] := i * j
end;

procedure vivod(vv: f; var x: matrix);
var
  i, j: byte;
begin
  vv(x);
  for i := 1 to 5 do
  begin
    for j := 1 to 5 do
      write(x[i, j]:4);
    writeln;
  end;
end;

begin
  vivod(vvod, m);
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 06.06.2013 в 18:15.
BDA вне форума Ответить с цитированием
Старый 06.06.2013, 18:49   #10
Crazy-kun
Пользователь
 
Аватар для Crazy-kun
 
Регистрация: 27.05.2013
Сообщений: 11
По умолчанию

Цитата:
Или вот такое извращение:
Да да, именно такое извращение мне и нужно
По сути такой же алгоритм можно было сделать и с функциями, к которым я привык, а тут я запутался и поэтому затупил. Спасибо большое.
Crazy-kun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
turbo pascal Создать программу с пятью подпрограммами обработки числового массива Rlayh Фриланс 2 07.06.2012 23:52
Задачи на обработку массива и матрицы в Turbo Pascal Lena1808 Помощь студентам 1 16.05.2012 20:18
Матрицы (Turbo Pascal). Олег1993 Помощь студентам 4 20.01.2012 20:21
Матрицы в Turbo Pascal JIUMOH Помощь студентам 3 23.12.2009 17:50
Заполнение матрицы Pascal lebrosha Помощь студентам 3 25.05.2009 19:55