• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Большая проблема в программе Pascal

  • Автор темы Автор темы Madara
  • Дата начала Дата начала

Madara

Новые
Регистрация
29 Ноя 2013
Сообщения
50
Реакции
0
Баллы
0
Большая проблема в программе Pascal

Здравствуйте.

Нужна ваша помощь.
Дано задание : Составить программу (задание ниже в виде изображений) строго соблюдая указание (использовать процедуру для массива!)


Столкнулся с такой проблемой: вывести измененную "матрицу" (пусть 3 на 3) в виде 3 массивов размерностью 3 не составляет труда, но необходимо найти среднее арифметическое этой матрицы,т.е. требуется получить именно матрицу, например B[i,j]...проблема в том, что используя процедуру замены элементов для массива выходят массивы и работать с этими массивами мы не можем, надеюсь на вашу помощь...
Отойти от требований в задании нельзя...

Вот сама программа:

PHP:
Program zam;
Const n=3;

Type mass=array[1..n]of real;
     matr=array[1..n,1..n]of real;
     
Function module(x:real):real;
  Begin
   module:=abs(x); 
  end; // написал функцию, функция выводит модуль числа
  
Function sredarifm(B:matr):real;
 var
  summ:real;
  i,j:integer;
 Begin
    Summ:=0;
     Begin
      for i:=1 to n do
       for j:=1 to n do
         summ:=summ+B[i,j];
     end;
    sredarifm:=summ/n*n;  
 end; //функция расчёта среднего арифметического матрицы
     
Procedure zamena(w:real; var p:mass );
 var i,k:integer;
  Begin
   k:=0;
   for i:=1 to n do
    if module(p[i])<w then
     Begin
      k:=k+1;
      p[i]:=0;
     end;
   writeln;
   for i:=1 to n do
   write(p[i]:0:2,'   ');
   Write('Число замен в данной строке : ',k);
  end; // написал процедуру, считаем количество элементов массива р модули которых больше меньше или равны r, 

 
Var
  i,j:integer;
  w:real;
  A,B:matr;
  p,c:mass;
  Begin
   Write('Введите контрольную величину W : ');
   Readln(w);
   Write('Заполните матрицу А: ');
   for i:=1 to n do
    Begin
     Write('Введите ',i,' строку : ' );
      for j:=1 to n do
       Begin
        Read(A[i,j]);
        p[j]:=(A[i,j]);  
        write(A[i,j]:0:2,'   ');
       end;
    end;
   writeln('Матрица успешно введена');
   writeln;
   writeln('После замены элементов матрицы А получаем матрицу В: ');
    Begin
     for i:=1 to n do
       Begin
        for j:=1 to n do
          p[j]:=A[i,j];
        zamena(w,p); //здесь у нас выходят 3 массива в столбик, получается матрица
       end;
    end;
    //как получить матрицу B ???
 Writeln;
 Writeln('Среднее арифметическое полученной матрицы В равно : ', sredarifm(B));
end.

Так у меня выглядит окно вывода:

PHP:
Введите контрольную величину W : 5
Заполните матрицу А: Введите 1 строку : 2 3 6
2.00   3.00   6.00   Введите 2 строку : 5 8 7
5.00   8.00   7.00   Введите 3 строку : 1 0 9
1.00   0.00   9.00   Матрица успешно введена

После замены элементов матрицы А получаем матрицу В: 

0.00   0.00   6.00   Число замен в данной строке : 2
5.00   8.00   7.00   Число замен в данной строке : 0
0.00   0.00   9.00   Число замен в данной строке : 2
Среднее арифметическое полученной матрицы В равно : 0

Заранее спасибо!
 

Вложения

  • 8O4VxIb5QB4.webp
    8O4VxIb5QB4.webp
    15.6 KB · Просмотры: 41
  • eLezhlVUSUU.webp
    eLezhlVUSUU.webp
    17.2 KB · Просмотры: 51
Значит, так.
Сначала - об "изюминке" задания, потом об ошибках в программе, потом о просто всяких несуразностях.

1. Дело в том, что со строкой матрицы можно обращаться, как с одномерным массивом. Вот в уяснении Вами этого факта и состоит суть задания. Так, если есть матрица D[i,j], то D - это строка-массив. И ничего выдумывать не надо. Как это делается, увидите в моем варианте программы.

2. Вот это:
Код:
sredarifm:=summ/n*n;
ГРУБЕЙШАЯ ошибка!!!!! Поймите: действия умножения и деления имеют равный приоритет, а потому результатом данной манипуляции будет умножение частного от деления summ на n на то же самое n, т.е. summ!!! Правильно или
Код:
sredarifm:=summ/(n*n);
или
Код:
sredarifm:=summ/Sqr(n);
3. Вот это вот:
Код:
[COLOR=#000000][COLOR=#007700]Function [/COLOR][COLOR=#0000BB]module[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]x[/COLOR][COLOR=#007700]:[/COLOR][COLOR=#0000BB]real[/COLOR][COLOR=#007700]):[/COLOR][COLOR=#0000BB]real[/COLOR][COLOR=#007700];
  [/COLOR][COLOR=#0000BB]Begin
   module[/COLOR][COLOR=#007700]:=[/COLOR][COLOR=#0000BB]abs[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]x[/COLOR][COLOR=#007700]); 
  [/COLOR][COLOR=#0000BB]end[/COLOR][COLOR=#007700]; [/COLOR][COLOR=#FF8000]// написал функцию, функция выводит модуль числа[/COLOR][/COLOR]
что за ахинея, позвольте поинтересоваться? Зачем нужно по сути просто переименовывать стандартную функцию Паскаля? Какой-такой супостат запрещает пользоваться прямо функцией Abs(x)?!! В общем, убрать за полной ненадобностью.

4. Массивы B и c не нужны вовсе, p - только как формальный параметр процедуры.

5. Совет: старайтесь не использовать для формальных и реальных параметров одни и те же идентификаторы. Не ошибка, но просто неряшливость.

Итак, главное: никаких ухищрений типа построчного ввода матрицы НЕ ТРЕБУЕТСЯ. Вводите ее обычным образом, а потом работайте с ее строками, как с одномерными массивами. Допускается.

Исходя из всего вышеизложенного, вот вариант программы. Выводимые на экран комментарии добавьте сами.

Код:
Program zam;
Const n=3;

Type mass=array[1..n] of real;
     matr=array[1..n,1..n] of real;

Function sredarifm(Q:matr):real;
 var
  summ:real;
  i,j:integer;
 Begin
    Summ:=0;
     Begin
      for i:=1 to n do
       for j:=1 to n do
         summ:=summ+Q[i,j];
     end;
    sredarifm:=summ/(n*n);
 end; //функция расчёта среднего арифметического матрицы

Procedure zamena(T:real; var p:mass );
 var i,k:integer;
  Begin
   k:=0;
   for i:=1 to n do
    if abs(p[i])<T then
     begin
      p[i]:=0;
      k:=k+1;
     end;
   writeln;
   for i:=1 to n do
    write(p[i]:8:2);
   Write('  Число замен в данной строке : ',k);
  end; // написал процедуру, считаем количество элементов массива р модули которых больше меньше или равны r,


Var
  i,j:integer;
  w:real;
  A:matr;
  
Begin
 Write('Введите контрольную величину W : ');
 Readln(w);
 Writeln('Заполните матрицу А: ');
 for i:=1 to n do
  for j:=1 to n do
   begin
    write('A[',i,',',j,']= ');
    readln(A[i,j]);
   end;
 writeln;
 for i:=1 to n do
  begin
   for j:=1 to n do write(A[i,j]:8:2);
   writeln;
  end;

 for i:=1 to n do zamena(w,A[i]);

 writeln;
 writeln;

 for i:=1 to n do
  begin
   for j:=1 to n do write(A[i,j]:8:2);
   writeln;
  end;
 writeln;

 Writeln('Среднее арифметическое полученной матрицы В равно : ', sredarifm(A):0:2);
 Readln
end.
 
PascalABC.NET не принимает такой тип в процедуре...
Может в другой программе работает? tehnobanka
 

Вложения

  • Screenshot-701(1).webp
    Screenshot-701(1).webp
    6.7 KB · Просмотры: 52
PascalABC.NET не принимает такой тип в процедуре...
Чтоб этим вонючкам - авторам всяких там АВС - провалиться! Чтоб их приподняло, бросило да не поймало!! Чтоб их мамы в юности аборты сделали!!! Не, ну это черт-те-что: самые нужные, ходовые, удобные возможности языка отброшены, а зато напихано какой-то дряни!!!! Бедные дети, коих заставляют это всё учить...

Ладно, попробуйте так:
Код:
Program zam;
Const n=3;

Type mass=array[1..n] of real;
     matr=array[1..n,1..n] of real;

Function sredarifm(Q:matr):real;
 var
  summ:real;
  i,j:integer;
 Begin
    Summ:=0;
     Begin
      for i:=1 to n do
       for j:=1 to n do
         summ:=summ+Q[i,j];
     end;
    sredarifm:=summ/(n*n);
 end; //функция расчёта среднего арифметического матрицы

Procedure zamena(w:real; var p:mass );
 var i,k:integer;
  Begin
   k:=0;
   for i:=1 to n do
    if abs(p[i])<w then
     Begin
      k:=k+1;
      p[i]:=0;
     end;
   writeln;
   for i:=1 to n do
    write(p[i]:8:2);
   Write(' Число замен в данной строке : ',k);
  end; // написал процедуру, считаем количество элементов массива р модули которых больше меньше или равны r,


Var
  i,j:integer;
  w:real;
  A:matr;
  c:mass;

Begin
 Write('Введите контрольную величину W : ');
 Readln(w);
 Writeln('Заполните матрицу А: ');
 for i:=1 to n do
  for j:=1 to n do
   begin
    write('A[',i,',',j,']= ');
    readln(A[i,j]);
   end;
 writeln;
 for i:=1 to n do
  begin
   for j:=1 to n do write(A[i,j]:8:2);
   writeln;
  end;

 for i:=1 to n do
  begin
   for j:=1 to n do c[j]:=A[i,j];
   zamena(w,c);
   for j:=1 to n do A[i,j]:=c[j];
  end;

 writeln;
 writeln;

 for i:=1 to n do
  begin
   for j:=1 to n do write(A[i,j]:8:2);
   writeln;
  end;
 writeln;

 Writeln('Среднее арифметическое полученной матрицы В равно : ', sredarifm(A):0:2);
 Readln
end.
 
Еще попробуйте такой вариант. Он, в общем, эквивалентен первому, но более явно задана совместимость типов. Это по идее дожен даже заср АВС сожрать:
Код:
Program zam;
Const n=3;

Type mass=array[1..n] of real;
     matr=array[1..n] of mass;

Function sredarifm(Q:matr):real;
 var
  summ:real;
  i,j:integer;
 Begin
    Summ:=0;
     Begin
      for i:=1 to n do
       for j:=1 to n do
         summ:=summ+Q[i,j];
     end;
    sredarifm:=summ/(n*n);
 end; //функция расчёта среднего арифметического матрицы

Procedure zamena(T:real; var p:mass );
 var i,k:integer;
  Begin
   k:=0;
   for i:=1 to n do
    if abs(p[i])<T then
     begin
      p[i]:=0;
      k:=k+1;
     end;
   writeln;
   for i:=1 to n do
    write(p[i]:8:2);
   Write('  Число замен в данной строке : ',k);
  end; // написал процедуру, считаем количество элементов массива р модули которых больше меньше или равны r,


Var
  i,j:integer;
  w:real;
  A:matr;

Begin
 Write('Введите контрольную величину W : ');
 Readln(w);
 Writeln('Заполните матрицу А: ');
 for i:=1 to n do
  for j:=1 to n do
   begin
    write('A[',i,',',j,']= ');
    readln(A[i][j]);
   end;
 writeln;
 for i:=1 to n do
  begin
   for j:=1 to n do write(A[i][j]:8:2);
   writeln;
  end;

 for i:=1 to n do zamena(w,A[i]);

 writeln;
 writeln;

 for i:=1 to n do
  begin
   for j:=1 to n do write(A[i][j]:8:2);
   writeln;
  end;
 writeln;

 Writeln('Среднее арифметическое полученной матрицы В равно : ', sredarifm(A):0:2);
 Readln
end.
 
Спасибо большое за помощь!

Оба варианта программы работают, выбрал 1 вариант.

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

PHP:
Function module(x:real):real;
 Begin
  module:=abs(x);
 end; // функция модуля

Вот что получилось у меня с оформлением: (если кому надо)

PHP:
Program zam;
Const n=3;

Type mass=array[1..n] of real;
     matr=array[1..n,1..n] of real;

Function module(x:real):real;
 Begin
  module:=abs(x);
 end; // функция модуля

Function sredarifm(Q:matr):real;
 var
  summ:real;
  i,j:integer;
 Begin
    Summ:=0;
     Begin
      for i:=1 to n do
       for j:=1 to n do
         summ:=summ+Q[i,j];
     end;
    sredarifm:=summ/(n*n);
 end; //функция расчёта среднего арифметического матрицы

Procedure zamena(w:real; var p:mass );
 var i,k:integer;
  Begin
   k:=0;
   for i:=1 to n do
    if module(p[i])<w then
     Begin
      k:=k+1;
      p[i]:=0;
     end;
   writeln;
   for i:=1 to n do
    write(p[i]:8:2);
   Write('   Число замен в данной строке : ',k);
  end; // написал процедуру, считаем количество элементов массива р модули которых больше меньше или равны r,
  
Var
  i,j:integer;
  w:real;
  A:matr;
  c:mass;

Begin
 Write('Введите контрольную величину W : ');
 Readln(w);
 Writeln('Заполните матрицу А: ');
 for i:=1 to n do
  Begin      
   write('Введите ',i,' строку из ',n,' элементов : ');
    for j:=1 to n do
     Begin
      read(A[i,j]);
     end;
  end;
 writeln;
 writeln('    Исходная матрица А: ');
 writeln;
 for i:=1 to n do
  Begin
   for j:=1 to n do
   write(A[i,j]:8:2);
   writeln;
  end;
 writeln;
 writeln('    Измененная матрица А: ');
 for i:=1 to n do
  Begin
   for j:=1 to n do
   c[j]:=A[i,j];
   zamena(w,c);
   for j:=1 to n do
   A[i,j]:=c[j];
  end;
 writeln;
 writeln;
 Writeln('  Среднее арифметическое полученной матрицы : ', sredarifm(A):0:2);
end.

Окно вывода выглядит так:
PHP:
Введите контрольную величину W : 5
Заполните матрицу А: 
Введите 1 строку из 3 элементов : 1 3 6
Введите 2 строку из 3 элементов : 1 2 8
Введите 3 строку из 3 элементов : 0 1 9

    Исходная матрица А: 

    1.00    3.00    6.00
    1.00    2.00    8.00
    0.00    1.00    9.00

    Имененная матрица А: 

    0.00    0.00    6.00   Число замен в данной строке : 2
    0.00    0.00    8.00   Число замен в данной строке : 2
    0.00    0.00    9.00   Число замен в данной строке : 2

  Среднее арифметическое полученной матрицы : 2.56

Не знаю почему, но мне больше нравится вводить матрицу таким образом (возможно это не совсем верно):
PHP:
Введите 1 строку из 3 элементов : 1 3 6
Введите 2 строку из 3 элементов : 1 2 8
Введите 3 строку из 3 элементов : 0 1 9

Т.е. таким кодом:
PHP:
for i:=1 to n do
  Begin      
   write('Введите ',i,' строку из ',n,' элементов : ');
    for j:=1 to n do
     Begin
      read(A[i,j]);
     end;
  end;

Так же в программу можно добавить процедуру, считающую число нулей (замен) в матрице (не желательно):
PHP:
Procedure chislozamen(A:matr);
 var i,j,k:integer;
  Begin
   k:=0;
   for i:=1 to n do
    Begin
     for j:=1 to n do
      Begin
       if A[i,j]=0 then
       k:=k+1;
      end; 
    end;
    Writeln('  Общее число замен в матрице равно : ',k);
  end; //процедура считающая нули изменённой матрицы - т.е. и число замен
Эта процедура считает именно нули и при контрольной величине, равной нулю, она не будет работать, поэтому её лучше не использовать
Другого способа посчитать общее число замен не нашёл, в принципе это не требуется в задании...

Владимир, ещё раз спасибо!
Вы как всегда описали всё предельно информативно.
:wo:
 
Ну, в общем, счастливый конец у этой эпопеи. Вот и славно.
 
Назад
Сверху