Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 20.03.2015, 18:51   #1 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Большая проблема в программе 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
Среднее арифметическое полученной матрицы В равно 

Заранее спасибо!
Миниатюры
8o4vxib5qb4.jpg   elezhlvusuu.jpg  
Madara вне форума   Ответить с цитированием

Старый 20.03.2015, 18:51
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Вы можете посмотреть похожие на вашу темы

Большая беда со временем и размером мозга
Две видеокарты - большая проблема
Ошибки в программе
Проблема с программой на Pascal

Старый 20.03.2015, 21:20   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

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.
Vladimir_S вне форума   Ответить с цитированием
Старый 20.03.2015, 22:10   #3 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

PascalABC.NET не принимает такой тип в процедуре...
Может в другой программе работает?
Миниатюры
screenshot-701-1-.jpg  
Madara вне форума   Ответить с цитированием
Старый 21.03.2015, 09:57   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
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   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Еще попробуйте такой вариант. Он, в общем, эквивалентен первому, но более явно задана совместимость типов. Это по идее дожен даже заср АВС сожрать:
Код:
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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 21.03.2015, 16:30   #6 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Спасибо большое за помощь!

Оба варианта программы работают, выбрал 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//процедура считающая нули изменённой матрицы - т.е. и число замен 
Эта процедура считает именно нули и при контрольной величине, равной нулю, она не будет работать, поэтому её лучше не использовать
Другого способа посчитать общее число замен не нашёл, в принципе это не требуется в задании...

Владимир, ещё раз спасибо!
Вы как всегда описали всё предельно информативно.
Madara вне форума   Ответить с цитированием
Старый 21.03.2015, 18:34   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.