Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Большая проблема в программе Pascal (http://www.tehnari.ru/f41/t101651/)

Madara 20.03.2015 18:51

Большая проблема в программе Pascal
 
Вложений: 2
Здравствуйте.

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


Столкнулся с такой проблемой: вывести измененную "матрицу" (пусть 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
Среднее арифметическое полученной матрицы В равно 


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

Vladimir_S 20.03.2015 21:20

Значит, так.
Сначала - об "изюминке" задания, потом об ошибках в программе, потом о просто всяких несуразностях.

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

2. Вот это:
Код:

sredarifm:=summ/n*n;
ГРУБЕЙШАЯ ошибка!!!!! Поймите: действия умножения и деления имеют равный приоритет, а потому результатом данной манипуляции будет умножение частного от деления summ на n на то же самое n, т.е. summ!!! Правильно или
Код:

sredarifm:=summ/(n*n);
или
Код:

sredarifm:=summ/Sqr(n);
3. Вот это вот:
Код:

Function module(x:real):real;
 
Begin
  module
:=abs(x);
 
end; // написал функцию, функция выводит модуль числа

что за ахинея, позвольте поинтересоваться? Зачем нужно по сути просто переименовывать стандартную функцию Паскаля? Какой-такой супостат запрещает пользоваться прямо функцией 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.


Madara 20.03.2015 22:10

Вложений: 1
PascalABC.NET не принимает такой тип в процедуре...
Может в другой программе работает? tehnobanka

Vladimir_S 21.03.2015 09:57

Цитата:

Сообщение от Madara (Сообщение 1114533)
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.


Vladimir_S 21.03.2015 14:08

Еще попробуйте такой вариант. Он, в общем, эквивалентен первому, но более явно задана совместимость типов. Это по идее дожен даже заср АВС сожрать:
Код:

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.


Madara 21.03.2015 16:30

Спасибо большое за помощь!
 
Оба варианта программы работают, выбрал 1 вариант.

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

PHP код:

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

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

PHP код:

Program zam;
Const 
n=3;

Type mass=array[1..nof real;
     
matr=array[1..n,1..nof 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:

Vladimir_S 21.03.2015 18:34

Ну, в общем, счастливый конец у этой эпопеи. Вот и славно.


Часовой пояс GMT +4, время: 18:02.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.