Разбить на процедуры - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста разбить код на процедуры. Промучался 2 часа. Ничего так и не получилось. Разбить таким образом, чтобы решение каждой подзадачи описывалось процедурой, а основная программа состояла бы из последовательности вызова процедур.
Листинг программы
  1. const n=5;//размер матрицы
  2. var a:array[1..n,1..n] of integer; //матрица из чисел от -70 до 70
  3. x:array[1..n] of longint;//вектор из чисел не более 70^5
  4. i,j,k:byte; //счетчики циклов и фиксатор отрицательных
  5. begin
  6. writeln('Введите ',n*n,' целых чисел по модулю не более 70');
  7. for i:=1 to n do
  8. for j:=1 to n do
  9. repeat
  10. write('a[',i,',',j,']=');
  11. readln(a[i,j]);
  12. until abs(a[i,j])<=70; //вод с проверкой, чтобы произведение 5 чисел точно не вышло за пределы типа Longint
  13. writeln('Матрица');
  14. k:=0; //пока отрицательных нет
  15. for i:=1 to n do
  16. begin
  17. for j:=1 to n do
  18. begin
  19. write(a[i,j]:4);
  20. if a[i,j]<0 then k:=1; //если есть
  21. end;
  22. writeln;
  23. end;
  24. if k=0 then
  25. begin
  26. writeln('Отрицательных элементов нет');
  27. writeln('Вектор Х сумм четных в строках');
  28. for i:=1 to n do
  29. begin
  30. x[i]:=0;
  31. for j:=1 to n do //считаем суммы четных в строках
  32. if a[i,j] mod 2=0 then x[i]:=x[i]+a[i,j];
  33. end;
  34. end
  35. else
  36. begin
  37. writeln('Отрицательные элементы есть');
  38. writeln('Вектор Х произведений в столбцах');
  39. for j:=1 to n do
  40. begin
  41. x[j]:=1;
  42. for i:=1 to n do
  43. x[j]:=x[j]*a[i,j];//считаем произведения в столбцах
  44. end;
  45. end;
  46. for i:=1 to n do
  47. write(x[i],' ');
  48. readln
  49. end.

Решение задачи: «Разбить на процедуры»

textual
Листинг программы
  1. {$mode ObjFPC}
  2. const n=5;
  3. type
  4.   TMatrix = array [1..n,1..n] of Integer;
  5.   TVector = array [1..n] of Integer;
  6.  
  7. procedure vWrite(const x: TVector; const s: String);
  8. var j: Integer;
  9. begin
  10.   if s<>'' then WriteLn(s);
  11.   for j:=1 to n do Write(' ',x[j]); WriteLn;
  12. end;
  13.  
  14. procedure mWrite(const a: TMatrix; const s: String);
  15. var i, j: Integer;
  16. begin
  17.   if s<>'' then WriteLn(s);
  18.   for i:=1 to n do begin
  19.     for j:=1 to n do Write(' ',a[i,j]:3); WriteLn;
  20.   end;
  21. end;
  22.  
  23. procedure mRead(var a: TMatrix; Limit: Integer);
  24. var i, j: Integer;
  25. begin
  26.   WriteLn('Введите ',n*n,' целых чисел по модулю не более ',Limit);
  27.   for i:=1 to n do for j:=1 to n do
  28.     repeat Read(a[i,j]) until Abs(a[i,j])<=Limit;
  29.   ReadLn;
  30. end;
  31.  
  32. function mNegCount(const a: TMatrix): Integer;
  33. var i, j: Integer;
  34. begin
  35.   Result:=0;
  36.   for i:=1 to n do for j:=1 to n do
  37.     if a[i,j]<0 then Inc(Result);
  38. end;
  39.  
  40. procedure mSumEvens(const a: TMatrix; var x: TVector);
  41. var i, j: Integer;
  42. begin
  43.   for i:=1 to n do begin
  44.     x[i]:=0;
  45.     for j:=1 to n do if not Odd(a[i,j]) then x[i]:=x[i]+a[i,j];
  46.   end;
  47. end;
  48.  
  49. procedure mProdCol(const a: TMatrix; var x: TVector);
  50. var i, j: Integer;
  51. begin
  52.   for j:=1 to n do begin
  53.     x[j]:=1;
  54.     for i:=1 to n do x[j]:=x[j]*a[i,j];
  55.   end;
  56. end;
  57.  
  58. var
  59.   a: TMatrix;
  60.   x: TVector;
  61. begin
  62.   mRead(a,70); mWrite(a,'Матрица:');
  63.   if mNegCount(a)=0 then begin
  64.     WriteLn('Отрицательных элементов нет');
  65.     Writeln('Вектор Х сумм четных в строках');
  66.     mSumEvens(a,x);
  67.   end else begin
  68.     WriteLn('Отрицательные элементы есть');
  69.     WriteLn('Вектор Х произведения в столбцах');
  70.     mProdCol(a,x);
  71.   end;
  72.   vWrite(x,'X =');
  73.   ReadLn;
  74. end.

Объяснение кода листинга программы

  1. Объявлены константы и типы данных:
    • константа n=5 для размера матрицы и вектора;
    • тип данных TMatrix - массив Integer размером 1..n x 1..n;
    • тип данных TVector - массив Integer размером 1..n.
  2. Объявлены процедуры:
    • vWrite - выводит вектор на экран, пробелы между элементами;
    • mWrite - выводит матрицу на экран, пробелы между элементами;
    • mRead - считывает матрицу из диапазона целых чисел, ограниченного Limit;
    • mNegCount - считает количество отрицательных элементов в матрице;
    • mSumEvens - суммирует четные элементы в каждой строке матрицы в соответствующий вектор;
    • mProdCol - перемножает элементы каждого столбца матрицы в соответствующий вектор.
  3. Объявлены переменные:
    • a - матрица;
    • x - вектор;
    • i, j - индексы для обхода матрицы и вектора.
  4. Главный цикл программы:
    • считывание матрицы;
    • проверка наличия отрицательных элементов;
    • вывод соответствующего вектора;
    • чтение из консоли.
  5. Вектор x выводится на экран с пробелами между элементами.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы