Помощь - Поиск - Пользователи - Календарь
Полная версия: Модули, операции со строками и столбцами матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Мария-
Добрые люди! Помогите, чем сможете...
У меня че-то не получается сделать так, чтобы прога заработала, то одна ошибка, то другая, особенно с типами данных, я уж не знаю че делать..
На всякий случай текст задачи:
Дана матрица R(4,3), состоящая из чисел типа WORD. Найти сумму элементов того столбца матрицы, где находится максимальный элемент, и разделить на максимальный элемент все элементы второй строки. Вывести полученную матрицу. Написать программу без функций и процедур. Оформить деление на максимальный элемент в виде процедуры, а нахождение суммы элементов столбца матрицы, в виде функции.
Может еще какие ошибки заприметите... Заранее спасибо..
Текст программы:
program Matrica;
uses crt,lll,ccc;
const m=4; n=3;
type
ind1=1..m; ind=1..n;
vect=array[ind] of word;
matr=array[ind1,ind] of word;
var
k,i,imax:ind1;
k1,j,jmax:ind;
msmax,a:word;
ms:matr;
begin
for i:=1 to k do
for j:=1 to k1 do
begin
write('введите элемент матрицы a[',i,',',j,']:');
readln(ms[i,j]);
end;
begin
imax:=4;
jmax:=3;
msmax:=ms[4,3];
for i:=1 to k do
for j:=1 to k1 do
if ms[i,j]>msmax then
begin msmax:=ms[i,j];
imax:=4;
jmax:=3;
end;
end;
sum(k1,msmax);
begin
clrscr;
writeln(sum(m,n,ms[jmax]):5:2); {еще вопрос: по какому принципу здесь
dl(m,2,msmax,ms); ставятся переменные, от которых зависит функция?}
end;
begin
for i:=1 to k do
begin
writeln;
for j:=1 to k1 do
write(ms[i,j]:8:2);
End;
End.


Модуль1
unit ccc;
interface
const n=3;
type
ind=1..n;
vect=array[ind] of word;
Function sum(k:ind; Line:vect):word;
implementation
Function sum;
var
j:ind;
S:word;
begin
S:=0;
For j:=1 To k do
S:=S+Line[j];
begin
End;
End;
end.


Модуль2

unit ccc;
interface
const n=3;
type
ind=1..n;
vect=array[ind] of word;
Function sum(k:ind; Line:vect):word;
implementation
Function sum;
var
j:ind;
S:word;
begin
S:=0;
For j:=1 To k do
S:=S+Line[j];
begin
End;
End;
end.

rolleyes.gif
volvo
Цитата(-Мария- @ 16.05.05 12:27)
Написать программу без функций и процедур.

Цитата(-Мария- @ 16.05.05 12:27)
Оформить деление на максимальный элемент в виде процедуры, а нахождение суммы элементов столбца матрицы, в виде функции.

Противоречия не видите?

Кроме этого - у в приведенной программе есть неоднозначность - в обоих подключаемых модулях есть функция с одним и тем же именем... В таком случае желательно явно указывать, из какого модуля вызывать процедуру.

Еще одно:
clrscr;
writeln(sum(m,n,ms[jmax]):5:2); { <--- здесь }

... слишком много параметров - функция ждет 2, передаются 3...
-Мария-
Цитата(volvo @ 16.05.05 12:32)
Противоречия не видите?


Вот в этом-то и фишка, что функции и процедуры запихнуть надо в модули, а основной текст проги должен быть без них.
volvo
Вот что получилось у меня:
-Мария-
Спасибо за выделенное мне время rolleyes.gif
вопрос: Можно ли получить инфо поподробнее по этой строчке?

ms[which, i] := ms[which, i] div max;

И еще почему Type в отдельном модуле, это по собственому желанию или так и надо?
volvo
Я на Сурсах вообще-то написал про это... rolleyes.gif
Дело в том, что Паскаль считает два типа, которые определены совершенно одинаково, но в разных модулях (или в модуле и основной программе, неважно) РАЗНЫМИ !!! Они же описаны в разных местах... И естественно, может возникнуть ошибка "несоответствие типов". Поэтому везде, где только можно желательно выносить определение типов в отдельный модуль и подключать его по мере необходимости...

Насчет
ms[which, i] := ms[which, i] div max;
...
Здесь есть небольшая проблемка. Во-первых, используется Div потому что результат должен быть целый, а оператор "/" дает вещественный результат.
А во вторых - можно обойтись совсем без этого, т.к. при целочисленном делении ЛЮБОГО элемента матрицы на ее максимальный элемент получится 0, итого можно просто заменять всю вторую строку нулями и не мучаться smile.gif
-Мария-
у меня новая проблема:
1. ошибка "Не делится на 0", при чем по сути дела прога должна сначала запросить ввод элементов матрицы, чего не происходит
2.Что-то я не вникла в
Цитата
А во вторых - можно обойтись совсем без этого, т.к. при целочисленном делении ЛЮБОГО элемента матрицы на ее максимальный элемент получится 0, итого можно просто заменять всю вторую строку нулями и не мучаться
Я думала, что только при делении 0 на любое число получается 0, а 2-я строка не обязательно из нулей, может я какое-то свойство матрицы позабыла?
volvo
Цитата(-Мария- @ 16.05.05 19:20)
1. ошибка "Не делится на 0", при чем по сути дела прога должна сначала запросить ввод элементов матрицы, чего не происходит

Я не знаю, что было в программе изменено, но моя версия отработала без нареканий...
Цитата(-Мария- @ 16.05.05 19:20)
Я думала, что только при делении 0 на любое число получается 0, а 2-я строка не обязательно из нулей, может я какое-то свойство матрицы позабыла?

Если я поделю НАЦЕЛО 5 на 12, сколько будет (целая часть)? Правильно, 0... То же самое происходит и там, при делении каждого элемента строки на максимум матрицы, т.е. на заведомо БОЛЬШЕЕ число. Частное ВСЕГДА будет равно 0...

А делить НЕнацело мне не дает ограничение
Цитата
Дана матрица R(4,3), состоящая из чисел типа WORD
-Мария-
Цитата(volvo @ 16.05.05 19:32)
Я не знаю, что было в программе изменено, но моя версия отработала без нареканий...



Я не изменяла в самой проге, пришлось поновой сохранить модули, чтобы основная прога их видела, а так он мне писал Unit file format error (про TPU)
к самому тексту я и не притрагивалась..
volvo
Какие TPU? Я никакие TPU не присоединял... Это что-то с компилятором. Сам свои же TPU-шки не понимает...
-Мария-
Цитата(volvo @ 16.05.05 19:50)
Какие TPU? Я никакие TPU не присоединял... Это что-то с компилятором. Сам свои же TPU-шки не понимает...

Ну дак,я сохранила еще в этом TPU все модули, т к компилятор требовал...
а ему мало этого, теперь с 0 проблемы
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.