|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
20.03.2015, 18:51 | #1 (permalink) |
Member
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Большая проблема в программе Pascal
Нужна ваша помощь. Дано задание : Составить программу (задание ниже в виде изображений) строго соблюдая указание (использовать процедуру для массива!) Столкнулся с такой проблемой: вывести измененную "матрицу" (пусть 3 на 3) в виде 3 массивов размерностью 3 не составляет труда, но необходимо найти среднее арифметическое этой матрицы,т.е. требуется получить именно матрицу, например B[i,j]...проблема в том, что используя процедуру замены элементов для массива выходят массивы и работать с этими массивами мы не можем, надеюсь на вашу помощь... Отойти от требований в задании нельзя... Вот сама программа: PHP код:
PHP код:
|
20.03.2015, 18:51 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Вы можете посмотреть похожие на вашу темы Большая беда со временем и размером мозга Две видеокарты - большая проблема Ошибки в программе Проблема с программой на Pascal |
20.03.2015, 21:20 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Значит, так.
Сначала - об "изюминке" задания, потом об ошибках в программе, потом о просто всяких несуразностях. 1. Дело в том, что со строкой матрицы можно обращаться, как с одномерным массивом. Вот в уяснении Вами этого факта и состоит суть задания. Так, если есть матрица D[i,j], то D[i] - это строка-массив. И ничего выдумывать не надо. Как это делается, увидите в моем варианте программы. 2. Вот это: Код:
sredarifm:=summ/n*n; Код:
sredarifm:=summ/(n*n); Код:
sredarifm:=summ/Sqr(n); Код:
Function module(x:real):real; Begin module:=abs(x); end; // написал функцию, функция выводит модуль числа 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. |
21.03.2015, 09:57 | #4 (permalink) |
Специалист
Регистрация: 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,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. |
21.03.2015, 14:08 | #5 (permalink) |
Специалист
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
21.03.2015, 16:30 | #6 (permalink) |
Member
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо большое за помощь!
Оба варианта программы работают, выбрал 1 вариант.
Что касается этой бредовой функции, то я понимаю в ней нет смысла, но в задании требуется чтобы в процедуре была функция, это вроде бы как для понимания. Я с вами совершенно согласен, незачем тратить время и место на переименование стандартной функции, но задание требует... PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
Другого способа посчитать общее число замен не нашёл, в принципе это не требуется в задании... Владимир, ещё раз спасибо! Вы как всегда описали всё предельно информативно. |
21.03.2015, 18:34 | #7 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну, в общем, счастливый конец у этой эпопеи. Вот и славно.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|