Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедуры и ф-ии
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Guest
Пожалуйста помогите переделать данную программу в 4 новых проги :molitva:
А именно, нужно:
1. Использовать процедуры с параметрами.
2. Использовать процедуры без параметров.
3. Использовать функции с параметрами.
4. Использовать функции без параметров.
Во всех четырёх прогах, необходимо использовать не менее трёх параметров.
Суть проги должна остаться той же.

Код

uses crt;
const
  max_n = 9;
var
a,b:array[1..max_n,1..max_n] of integer;
i,j,n1,n2,error:integer;
s: string; x: longint; er: integer;

label e1;
begin
clrscr;
gotoxy  (3,10);
  writeln ('Данная программа задаёт матрицу А. После чего создаёт');
   gotoxy  (57,10);
  writeln ('новую матрицу B, где ');
   gotoxy  (12,11);
  writeln ('а) B(i,j) = A(i,j), если A(i,j) > 0');
   gotoxy  (12,12);
  writeln ('б) B(i,j) не равно 0, если A(i,j) <= 0');
   gotoxy  (7,14);
  writeln ('Элементами матрицы могут быть только целые числа от -32768 до 32767,');
   gotoxy  (18,15);
  writeln ('максимальный размер матрицы 9х9!');
   gotoxy  (18,20);
  writeln ('Нажмите любую клавишу для продолжения');
   readkey;
e1:
clrscr;
  repeat
    write('Введите кол-во строк = ');
{$I-} readln(n1);
error:=ioresult;{$I+}
IF (n1<2) or (n1>max_n) or (error<>0)
then  writeln ('Кол-во строк от 2 до 9!');
  until (n1 >= 2) and (n1<=max_n) and (error=0);

  repeat
    write('Введите кол-во столбцов = ');
    {$I-} readln(n2);
    error:=ioresult;{$I+}
    IF (n2<2) or (n2>max_n) or (error<>0)
    then writeln ('Кол-во столбцов от 2 до 9!');
  until (n2 >= 2) and (n2<=max_n) and (error=0);


  for i := 1 to n1 do
  for j := 1 to n2 do
    begin
      repeat
        write('a[', i, ',', j, '] = '); Readln(s);
        val(s, x, er);
        if (er<>0) or (x < -32768) or (x > maxint)
        then writeln('Введённый вами символ вне диапозона от -32768 до 32767');
      until (x>=-32768) and (x<=maxint) and (er=0);
      a[i,j] := x;
    end;

  for i := 1 to n1 do
  for j := 1 to n2 do
  begin
       if a[i,j] > 0 then b[i,j] := a[i,j]
       else
       b[i,j] := 0;
  end;
  clrscr;
  write('Матрица A');
  for i := 1 to n1 do
  begin
       writeln;
       for j := 1 to n2 do
       Write(a[i,j]:7);
  end;

  writeln;
  write('Матрица B');
  for i := 1 to n1 do
  begin
       writeln;
       for j := 1 to n2 do
       Write(b[i,j]:7);
       end;
       writeln ('');
       write('Вы хотите сделать ещё одну матрицу? y/n');
       case readkey of
   #89: goto  e1;
   #121: goto e1;
   #78: exit;
   #110: exit;
  end;
end.

Пожалуйста помогите.

Добавлено

Поправка:
НЕ
"Во всех четырёх прогах, необходимо использовать не менее трёх параметров."
А
Только в двух прогах, необходимо использовать не менее трёх параметров.
В 1 и 3=)
volvo
У меня наверное глюки... В прошлый раз это был не Guest а ghost... http://forum.pascalnet.ru/index.php?showt...indpost&p=31093
Ничего не напоминает?
Guest
:D Нет у тебя не глюки, я ghost. Дело в том, что тогда я свой пароль помнил, а щас нет. Запрос на восстановление забытого пароля я сделал, но писмецо пока что не пришло (уже как 2 часа его нет).
Кстати я и мыло то не помню, которе тут оставлял при реге (если оставлял blink.gif )
volvo
Значит, смотри... Предложения пока такие:
1. Вместо конструкций вида
Код
gotoxy(x, y);
writeln(str);

описываешь процедуру (как раз с тремя параметрами)
Код
Procedure PrintStr(x, y: byte; s: string);
 begin
   gotoxy(x, y);
   writeln(s);
 end;
...
{ и в основной программе: }
PrintStr(3, 10, 'Данная программа задаёт матрицу А. После чего создаёт');
{ и так далее... }


2. Делаешь процедуру (опять с тремя параметрами):
Код
type matrix = array[1..max_n,1..max_n] of integer;;
procedure matrixOut(arr: matrix; sz_1, sz_2: integer);
 var i, j: integer;
 begin
   for i := 1 to sz_1 do
   begin
     writeln;
     for j := 1 to sz_2 do
       Write(arr[i, j]:7);
   end;
 end;
...
{ в основной программе - }
 write('Матрица A');
 matrixOut(a, n1, n2);

 write('Матрица b');
 matrixOut(b, n1, n2);
-ghost-
Всё здорого, только во втором варианте происходит ошибка. Ошибка не совпадения типов.

Код

uses crt;
const
 max_n = 9;
var
a,b:array[1..max_n,1..max_n] of integer;
i,j,n1,n2,error:integer;
s: string; x: longint; er: integer;
type matrix = array[1..max_n,1..max_n] of integer;
procedure matrixOut(arr: matrix; sz_1, sz_2: integer);
var i, j: integer;
begin
  for i := 1 to sz_1 do
  begin
    writeln;
    for j := 1 to sz_2 do
      Write(arr[i, j]:7);
  end;
end;

...

 write('Матрица A');
 matrixOut(a, n1, n2); {в этой строке происходит ошибка}

 writeln;
 write('Матрица B');
 matrixOut(b, n1, n2);
      writeln ('');
      write('Вы хотите сделать ещё одну матрицу? y/n');
      case readkey of
  #89: goto  e1;
  #121: goto e1;
  #78: exit;
  #110: exit;
 end;
end.
volvo
Я же написал:
Код
type matrix = array[1..max_n,1..max_n] of integer;


Так a и b объяви не так:
Код
var
a,b:array[1..max_n,1..max_n] of integer;

а вот так:
Код
var
a,b:matrix;


и ошибка исчезнет... :yes:
Guest
Спасиб, помогло=)
А с остальными тремя не поможете?
volvo
Guest, а почему, собственно, с тремя? Что, нельзя в одной программе изменить одно, а во второй - другое?

Ну я бы еще описал функцию:
Код
Function GetColRow: Integer;
Var x, error: integer;
Begin
 repeat
   {$I-} readln(x);
   error:=ioresult;{$I+}
   IF (x<2) or (x>max_n) or (error<>0)
     then writeln ('Кол-во строк (столбцов) от 2 до 9!');
 until (x >= 2) and (x<=max_n) and (error=0);
 GetColRow := x
End;

И вместо того, что есть сейчас, пользовался бы вот этим:
Код
...
write('Введите кол-во строк = ');
n1 := GetColRow;
write('Введите кол-во столбцов = ');
n2 := GetColRow;

Вот тебе функция без параметров... ;)
Guest
volvo, извиняюсь за первоначальную дэзинформацию.
Учитель в задание ввёл ещё пару требований,
1. чтобы процедура или ф-ия использовалась в проге минимум 2 раза.
2. чтобы использовынные параметры в проге изменялись.
Вот тут например они не изменяюцца

Код

...
matrixOut(a, n1, n2);
...
matrixOut(b, n1, n2);
Гость
kazqg vtne aguc tplcujsrk zuxc ibrxgyev mcjtq
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.