Помощь - Поиск - Пользователи - Календарь
Полная версия: Ссылки, обратный порядок..
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
b0b
Вечер добрый. Необходимо срочно решить 2 задачи. . Завтра зачет, не допустит препод, если не будет их..

Ссылочный тип данных:
1. Составить программу, которая переворачивает список, т.е. изменяет ссылки так, чтобы его элементы оказались расположены в обратном порядке.

Модули:
2. В модуль включить подпрограмму нахождения произведения квадратных матриц А и В третьего порядка. В основной программе для трех квадратных матриц А, В и С 3-го порядка, вычислить Т=А*В*С.

В первой не знаю с чего начать.
Во второй, теоретически догадываюсь.

С уважением.
volvo
Цитата
Во второй, теоретически догадываюсь.

Смотри, как это реализуется практически:
Вычисление произведения матриц
b0b
Цитата(volvo @ 12.12.2005 19:44) *

Смотри, как это реализуется практически:
Вычисление произведения матриц


уже начал писать...
b0b
program laba9;

{$APPTYPE CONSOLE}

uses
SysUtils;

const
n=3;
var
mat1,mat2,mat3,resmat1,resmat2:array[1..n, 1..n] of integer;
i,x,y,r,t:integer;

begin

writeln('Enter 1st matrix: ');
for y:=1 to n do
for x:=1 to n do
begin
write('a[',x,',',y,']: ');
readln(mat1[x,y]);
end;

Writeln('Enter 2nd matrix: ');
for y:=1 to n do
for x:=1 to n do
begin
write('b[',x,',',y,']: ');
readln(mat2[x, y]);
end;

{подсчет матрицы AxB}

for y:=1 to n do
for x:=1 to n do
begin
r:=0; {обнуляем сумму произведений}
for i:=1 to n do {идем под горизонтали Mat1 и по вертикали}
r:=r+mat1[i,y]*mat2[x,i]; {Mat2; умножаем и добавляем в R}
resmat1[x,y]:=r; {Resmat1[x, y] = результат = R}
end;

writeln;
writeln('AxB=');

for y:=1 to n do
begin
for x:=1 to n do
write(resmat1[x,y]:4,' ');
writeln;
end;

readln;

Writeln('Enter 3rd matrix: ');
for y:=1 to n do
for x:=1 to n do
begin
write('b[',x,',',y,']: ');
readln(mat3[x, y]);
end;

for y:=1 to n do
for x:=1 to n do
begin
r:=0;
for i:=1 to n do
r:=r+resmat1[i,y]*mat3[x,i];
resmat2[x,y]:=r;
end;

writeln;
writeln('AxBxC=');

for y:=1 to n do
begin
for x:=1 to n do
write(resmat2[x,y]:4,' ');
writeln;
end;

readln;

end.


вот. все работает.
немогу подогнать под условие задачи..sad.gif
volvo
Const
n = 3;
Type
mxType = array[1 .. n, 1 .. n] Of Integer;

Procedure multMatrix(Var res: mxType; A, B: mxType);
Var x, y, r: Integer;
Begin
for y:=1 to n do
for x:=1 to n do begin
r:=0;
for i:=1 to n do
r:=r+A[i,y]*B[x,i];
res[x,y]:=r;
end;
End;


и в основной программе:

Writeln('Enter 1st matrix: ');
{
Здесь - ввод 1 матрицы ( A )
...
}

Writeln('Enter 2nd matrix: ');
{
Здесь - ввод 2 матрицы ( B )
...
}

{
подсчет матрицы AxB
}
multMatr(resmat1, mat1, mat2);
writeln('AxB='); { ... Распечатываешь resmat1 }

readln;
Writeln('Enter 3rd matrix: ');
{
Вводишь 3-ю матрицу ( C )
...
}
multMatr(resmat2, resmat1, mat3);
writeln('AxBxC='); { ... Распечатываешь resmat2 }
...
b0b
помогите, пожалуйста, оформить в ввиде модуля с процедурой.. sad.gif
b0b
программа

program laba9; 

uses
un1;

var
mat1,mat2,mat3,resmat1,resmat2: matr;

begin
vvod(mat1, 'a');
vvod(mat2,'b');

schet(mat1,mat2,resmat1);

writeln;
writeln('AxB=');
vyvod(resmat1);
readln;

vvod(mat3,'c')

schet(resmat1,mat3,resmat2);

writeln;
writeln('AxBxC=');
vyvod(resmat2);
readln;
end.


модуль

unit un1;   
interface
const
n=3;
type matr=array[1..n, 1..n] of integer;

procedure vvod(var mat: matr; ch: char);
procedure schet(mat1,mat2: matr; var resmat: matr);
procedure vyvod(mat: matr);

implementation

procedure vvod(var mat: matr; ch: char);
var x,y: integer;
begin
writeln('Enter matrix: ',ch);
for x:=1 to n do
for y:=1 to n do
begin
write(ch, '[',x,',',y,']: ');
readln(mat1[x,y]);
end;
end;

procedure schet(mat1,mat2: matr; var resmat: matr);
var x,y,i,r: integer;
{подсчет матрицы AxB}
begin
for x:=1 to n do
for y:=1 to n do
begin
r:=0; {обнуляем сумму произведений}
for i:=1 to n do {идем под горизонтали Mat1 и по вертикали}
r:=r+mat1[x,i]*mat2[i,y]; {Mat2; умножаем и добавляем в R}
resmat[x,y]:=r; {Resmat1[x, y] = результат = R}
end;
end;

procedure vyvod(mat: matr);
var x,y: integer;
begin
for x:=1 to n do
begin
for y:=1 to n do
write(mat[x,y]:4,' ');
writeln;
end;
end;

end.


но чет не пашет..

все работает. исправил.


с чего посоветуете начать первую задачу?
volvo
Исправь синтаксические ошибки:
procedure vvod(var mat: matr; ch: char); 
begin
...
readln(mat[x,y]); { "mat" <--- Здесь !!! }
...
end;

и
 vvod(mat3,'c'); { <--- ";" Здесь !!! }

schet(resmat1,mat3,resmat2);

Для чего тебе компилятор? Он же все это тебе говорит... wacko.gif

Цитата
с чего посоветуете начать первую задачу?
Ну, во-первых, список одно- или двухсвязный? Процедура нужна обычная или рекурсивная?

Сам список ты уже реализовал?
b0b
Цитата

Ну, во-первых, список одно- или двухсвязный? Процедура нужна обычная или рекурсивная?
?

односвязный.
обычная.
Цитата
Сам список ты уже реализовал?

сейчас думаю начать. поэтому и спросил, с чего начать.
volvo
FAQ: Списки
b0b
откомпилировал модуль, который дан в FAQ
но слабо представляю, как пользоваться...
volvo
Кстати, вот процедура, "разворачивающая" односвязный список:
procedure invert_list(var first, last: plist);
var p, T: plist;
begin
if (first = nil) or (not assigned(first^.next)) then exit
else begin

p := nil; last := first;
while assigned(first) do begin
T := first^.next;
first^.next := p;
p := first;
first := T
end;
first := p

end
end;
b0b
BListAddFirst
а как заполнить список?
b0b
все. всем спасибо. написал. уря. smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.