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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2013, 20:53   #1
Язуджи
 
Регистрация: 22.12.2013
Сообщений: 7
По умолчанию Процедура вывода матрицы на экран (Паскаль)

Программа должна по идее работать верно, НО в конце, в главной программе после вычисление процедур "changeAfterMin(A, N, M, Z);" и "ChangeAfterMin(B, K, L, Z);" , начинают работать процедуры "output(A, N, M);" и "output(B, K, L);" , которые отвечаю за вывод результата после обработки матрицы. Так вот, почему никаких результатов программа не вывод? даже если она и не правильно обрабатывалась и ничего не менялось или менялись другие не нужные значения, программа вывело бы всё какой-никакой результат. В чём проблема?
Код:
type
  Arr = Array[1..10, 1..10] of integer;

var
  A, B: Arr;
  N, M, K, L, Z: integer;

P.S. Задание: В каждую из двух матриц вставить заданное число после минимального элемента каждого столбца.

procedure PrintMatr(var C: Arr; p, q: integer);
var
  i, j: integer;
begin
  write('Введите число Z = ');
  read(Z);
  write('Введите количество строк p = ');
  readln(q);
  write('Введите количество cтолбцов q = ');
  readln(p);
  for i := 1 to p do
    for j := 1 to q do
    begin
      C[i, j] := 50 - random(49) + 1; 
    end;
  writeln('Результат :');
  for i := 1 to p do
  begin
    for j := 1 to  q do
    begin
      write(C[i,j]:5, '     ');
    end;
    writeln('  ');
  end;
end;

procedure ChangeAfterMin(C: arr; p, q, z: integer);
var
  i, j, min, minj: integer;
begin
  for i := 1 to p do
  begin
    min := C[i, 1];
    minj := 1;
    for j := 2 to q do
    begin
      if (C[i, j] <= min) then
      begin
        min := C[j, i];
        minj := j;
      end;
    end;
    if (minj <> 1) then 
      C[i, minj + 1] := Z;
  end;
end;

procedure output(var C: Arr; p, q: integer);
var
  i, j: integer;
begin
  for i := 1 to p do 
    for j := 1 to q do 
    begin
      write(C[i, j]:5, '     ');
    end;
    writeln('');  
end;

begin
  writeln('Заполнение матрицы A[N,M]');
  PrintMatr(A, N, M);
  writeln(' ');
  writeln('Заолнение матрицы B[K,L]');
  PrintMatr(B, K, L);
  writeln(' ');
  changeAfterMin(A, N, M, Z);
  writeln('Mатрица A после обработки :');
  output(A, N, M);
  ChangeAfterMin(B, K, L, Z);
  writeln('Матрица В после обработки :');
  output(B, K, L);
end.
P.S. Задание: В каждую из двух матриц вставить заданное число после минимального элемента каждого столбца.

Последний раз редактировалось Язуджи; 26.12.2013 в 20:55.
Язуджи вне форума Ответить с цитированием
Старый 26.12.2013, 20:57   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Код:
  writeln('Mатрица A после обработки :');
  output(A, N, M);
N,m чему равны?
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 26.12.2013, 20:58   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Наверное, потому что K и L равны 0.
Как я понял, их значения должно появляться на выходе из PrintMatr.
Не появится, потому что нет волшебного слова var перед p,q в описании PrintMatr.

PS Ага, и по поводу N,M - то же самое.

Последний раз редактировалось type_Oleg; 26.12.2013 в 21:01.
type_Oleg вне форума Ответить с цитированием
Старый 26.12.2013, 20:59   #4
Язуджи
 
Регистрация: 22.12.2013
Сообщений: 7
По умолчанию

Они равны p и q , как и K и L соответственно
Язуджи вне форума Ответить с цитированием
Старый 26.12.2013, 21:01   #5
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Не-а, они равны 0.
Потому что предыдущая процедура не возвращает их значения ввиду отсутствия var перед ними в заголовке процедуры.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 26.12.2013, 21:03   #6
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Поставьте перед p и q var.

Кстати, никаких p и q не существует. Они - только в описании.
type_Oleg вне форума Ответить с цитированием
Старый 26.12.2013, 21:04   #7
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

type_Oleg, опередил
Держи +
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 26.12.2013, 21:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

замените
Цитата:
Код:
procedure PrintMatr(var C: Arr; p, q: integer);
на
Код:
procedure PrintMatr(var C: Arr; var p, q: integer);

а тут ничего странного не видите???
Цитата:
Код:
  write('Введите количество строк p = ');
  readln(q);
  write('Введите количество cтолбцов q = ');
  readln(p);

Последний раз редактировалось Serge_Bliznykov; 26.12.2013 в 21:06.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.12.2013, 21:09   #9
Язуджи
 
Регистрация: 22.12.2013
Сообщений: 7
По умолчанию

Так, спасибо, разобрался, теперь выводит. осталось разобраться, почему не вставляется заданное число после минимального элемента в каждом столбце:D
Язуджи вне форума Ответить с цитированием
Старый 26.12.2013, 21:23   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

Да все по тому же:
Код:
procedure ChangeAfterMin(C: arr; p, q, z: integer);
var
  i, j, min, minj: integer;
begin
  for i := 1 to p do
  begin
    min := C[i, 1];
    minj := 1;
    for j := 2 to q do
    begin
      if (C[i, j] <= min) then
      begin
        min := C[j, i];
        minj := j;
      end;
    end;
    if (minj <> 1) then 
      C[i, minj + 1] := Z; {тут присвоение, но в описании ...} 
  end;
end;
Почитайте повнимательнее, как передаются параметры в процедуры и функции. Если запись вида:
dd : real {<имя переменной> : <тип переменной>}
то - передача значения. В этом случае в процедуре/функции будет видно только переданное значение, а изменить это значение нельзя ...;
А вот если
Var dd : real {Var <имя переменной> : <тип переменной>}
то - передача адреса - в этом случае из процедуры или функции можно изменять значение переменной, которая размещяется в сегменте данных;
Ну, в общем, почитайте - это важная часть ...

И еще: не пользуйте
Код:
read(<переменная>);  {read(Z) - неправильно}

readln(Z); {правильно}
Процедура read() используется при чтении данных из файла ...



Как-то так, ...
Как-то так, ...

Последний раз редактировалось ViktorR; 26.12.2013 в 21:44.
ViktorR вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++, Функция вывода матрицы на экран fantomasje Помощь студентам 4 03.06.2013 17:12
Процедура вывода на экран символов aleksej01-91 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 18.10.2011 18:57
Процедура вывода Jack125 Помощь студентам 4 24.09.2011 17:45
Вывод матрицы на экран [Паскаль] mistertvister Помощь студентам 8 04.11.2009 23:44