IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Помогите с курсовиком, И снова ООП
SunDevil
сообщение 12.06.2005 19:21
Сообщение #21


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 10.06.05 22:42)
Ты имеешь в виду запретить создание объектов типа TMas и TList если не был создан экземпляр TMatr? Тогда работай с указателями, а не с самими объектами:
Var
  ptrMas: ^TMas;
  ptrList: ^TList;
  ptrMatr: ^TMatr;

...
{ создавать массив только если матрица уже создана }
if ptrMatr <> nil then New(ptrMas, Init);


Мне не совсем понятно куда надо это вставлять, вернее в какой из моих модулей? В Main.Pas или в Menu.Pas???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.06.2005 19:33
Сообщение #22


Гость






Ну, так это должно быть там, где ты собрался использовать эти переменные. Значит в menu.pas smile.gif
 К началу страницы 
+ Ответить 
SunDevil
сообщение 12.06.2005 19:41
Сообщение #23


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


Исходный код
Unit menu;
interface
Procedure Run;
implementation
Uses Crt, main;
Const
maxLen = 42;
myHelp:array[1..5] of string=(
' ',
'Курсовая Работа',
'Все права защищены © 2005',
'БГТУ "ВоенМех" им. Д.Ф. Устинова',
'Автор: ');
Type
menuString = String[maxLen];
Function ShowMenu(Var Options: Array Of menuString;
Const n: Integer): Integer;
Var
ToExit: Boolean;
i, CurrSelect: integer;
Answer: Char;
Begin
TextAttr := 7;
ClrScr;
ToExit := False; CurrSelect := 1;
Repeat
Window(18,7,50,11);
TextBackground(Blue);
ClrScr;
Window(1,1,80,25);
GotoXY(18, 7);
TextColor(White);
Write('╔════════════════════════════════════════╗');
For i := 1 To 7 Do Begin
GotoXY(18,7+i);
Write('║ ║')
End;
GotoXY(18,15);
Write('╚════════════════════════════════════════╝');
GotoXY(29, 8);
WriteLn('Выберите действие:');
For i := 1 To n Do Begin
If i = CurrSelect Then TextBackground(Red)
Else TextBackground(Blue);
GotoXY(20, 9+i); Write(Options[Pred(i)])
End;
TextBackground(Black);
Case ReadKey Of
#0: Begin
Answer := ReadKey;
Case Answer Of
#80 : {Down}
If CurrSelect < n Then Inc(CurrSelect)
Else CurrSelect := 1;
#72 : {Up}
If CurrSelect > 1 Then Dec(CurrSelect)
Else CurrSelect := n;
End; {case}
End;
#13 : {Enter}
ToExit := True;
End;
Until ToExit;
ShowMenu := CurrSelect
End;
Const
mainMenuSize = 5;
mainMenu:
Array[1 .. mainMenuSize] Of menuString =
(' Работа с массивом ',
' Работа с матрицей ',
' Работа со списком ',
' Справка ',
' Выход ');
massivMenuSize = 4;
massivMenu:
Array[1 .. massivMenuSize] Of menuString =
(' Ввести массив ',
' Ввести диапазон от A до B ',
' Вывести измененный массив ',
' Назад ');
matrixMenuSize = 4;
matrixMenu:
Array[1 .. matrixMenuSize] Of menuString =
(' Ввести матрицу ',
' Ввести диапазон от A до B ',
' Вывести массив значений ',
' Назад ');
listMenuSize = 4;
listMenu:
Array[1 .. listMenuSize] Of menuString =
(' Ввести список ',
' Ввести диапазон от A до B ',
' Вывести измененный список ',
' Назад ');
Procedure Run;
Var
i,menuResult: Integer;
massObj: TMas;
matrixObj: TMatr;
{
listObj: TList
}
Begin
Repeat
Case ShowMenu(mainMenu, mainMenuSize) of
1: { Work with Array: }
Begin
GotoXY(1, 20);
massObj.Init;
Repeat
menuResult := ShowMenu(massivMenu, massivMenuSize);
Case menuResult Of
1: massObj.InData; { ... }
2: massObj.Form; { ... }
3: massObj.OutRes; { ... }
4: massObj.Done;
End;
Until menuResult = 4;
End;
2: { Work with Matrix: }
Begin
matrixObj.Init;
Repeat
menuResult := ShowMenu(matrixMenu, matrixMenuSize);
Case menuResult Of
1: matrixObj.InData; { ... }
2: matrixObj.Form; { ... }
3: matrixObj.OutRes; { ... }
4: matrixObj.Done;
End;
Until menuResult = 4;
End;
3: { Work with List: }
Begin
{
listObj.Init;
}
Repeat
menuResult := ShowMenu(listMenu, listMenuSize);
Case menuResult Of
1:; { ... }
2:; { ... }
3:; { ... }
4: { listObj.Done; }
End;
Until menuResult = 4;
End;
4: begin
Window(18,7,50,11);
TextBackground(Blue);
ClrScr;
Window(1,1,80,25);
GotoXY(18, 7);
TextColor(White);
Write('╔════════════════════════════════════════╗');
For i := 1 To 7 Do Begin
GotoXY(18,7+i);
Write('║ ║')
End;
GotoXY(18,15);
Write('╚════════════════════════════════════════╝');
GotoXY(29, 8);
WriteLn(' Справка:');
for i:=1 to 5 do
begin
GoToXY(23,8+i);
write(myHelp[i]);
end;
readln
end; { Show help }
5: Break;
End;
Until False;
End;
end.

Вот мой Menu.pas и куда в него надо всунуть условие и описание указателей? ;)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.06.2005 20:08
Сообщение #24


Гость






Я же сказал тебе не просто описАть указатели, а работать с указателями:
Исходный код
Unit menu;
interface
Procedure Run;
implementation
Uses Crt, main;
Const
maxLen = 42;
myHelp:array[1..5] of string=(
' ',
'Курсовая Работа',
'Все права защищены © 2005',
'БГТУ "ВоенМех" им. Д.Ф. Устинова',
'Автор: ');
Type
menuString = String[maxLen];
Function ShowMenu(Var Options: Array Of menuString;
Const n: Integer): Integer;
Var
ToExit: Boolean;
i, CurrSelect: integer;
Answer: Char;
Begin
TextAttr := 7;
ClrScr;
ToExit := False; CurrSelect := 1;
Repeat
Window(18,7,50,11);
TextBackground(Blue);
ClrScr;
Window(1,1,80,25);
GotoXY(18, 7);
TextColor(White);
Write('╔════════════════════════════════════════╗');
For i := 1 To 7 Do Begin
GotoXY(18,7+i);
Write('║ ║')
End;
GotoXY(18,15);
Write('╚════════════════════════════════════════╝');
GotoXY(29, 8);
WriteLn('Выберите действие:');
For i := 1 To n Do Begin
If i = CurrSelect Then TextBackground(Red)
Else TextBackground(Blue);
GotoXY(20, 9+i); Write(Options[Pred(i)])
End;
TextBackground(Black);
Case ReadKey Of
#0: Begin
Answer := ReadKey;
Case Answer Of
#80 : {Down}
If CurrSelect < n Then Inc(CurrSelect)
Else CurrSelect := 1;
#72 : {Up}
If CurrSelect > 1 Then Dec(CurrSelect)
Else CurrSelect := n;
End; {case}
End;
#13 : {Enter}
ToExit := True;
End;
Until ToExit;
ShowMenu := CurrSelect
End;
Const
mainMenuSize = 5;
mainMenu:
Array[1 .. mainMenuSize] Of menuString =
(' Работа с массивом ',
' Работа с матрицей ',
' Работа со списком ',
' Справка ',
' Выход ');
massivMenuSize = 4;
massivMenu:
Array[1 .. massivMenuSize] Of menuString =
(' Ввести массив ',
' Ввести диапазон от A до B ',
' Вывести измененный массив ',
' Назад ');
matrixMenuSize = 4;
matrixMenu:
Array[1 .. matrixMenuSize] Of menuString =
(' Ввести матрицу ',
' Ввести диапазон от A до B ',
' Вывести массив значений ',
' Назад ');
listMenuSize = 4;
listMenu:
Array[1 .. listMenuSize] Of menuString =
(' Ввести список ',
' Ввести диапазон от A до B ',
' Вывести измененный список ',
' Назад ');
Procedure Run;
Var
i,menuResult: Integer;
pmassObj: ^TMas;
pmatrixObj: ^TMatr;
plistObj: ^TList
Begin
pmatrixObj := nil;
Repeat
Case ShowMenu(mainMenu, mainMenuSize) of
1: { Work with Array: }
Begin
GotoXY(1, 20);
If pmatrixObj <> nil Then Begin
New(pmassObj, Init);
Repeat
menuResult := ShowMenu(massivMenu, massivMenuSize);
Case menuResult Of
1: pmassObj^.InData; { ... }
2: pmassObj^.Form; { ... }
3: pmassObj^.OutRes; { ... }
4: pmassObj^.Done;
End;
Until menuResult = 4;
Dispose(pmassObj, Done)
End
Else WriteLn(' Не могу инициализировать массив.'
+ ' Матрица не была инициализирована ');
End;
2: { Work with Matrix: }
Begin
New(pmatrixObj, Init);
Repeat
menuResult := ShowMenu(matrixMenu, matrixMenuSize);
Case menuResult Of
1: matrixObj^.InData; { ... }
2: matrixObj^.Form; { ... }
3: matrixObj^.OutRes; { ... }
4: matrixObj^.Done;
End;
Until menuResult = 4;
{ не удаляем матрицу - она еще понадобится }
End;
3: { Work with List: }
Begin
{
listObj.Init;
}
Repeat
menuResult := ShowMenu(listMenu, listMenuSize);
Case menuResult Of
1:; { ... }
2:; { ... }
3:; { ... }
4: { listObj.Done; }
End;
Until menuResult = 4;
End;
4: begin
Window(18,7,50,11);
TextBackground(Blue);
ClrScr;
Window(1,1,80,25);
GotoXY(18, 7);
TextColor(White);
Write('╔════════════════════════════════════════╗');
For i := 1 To 7 Do Begin
GotoXY(18,7+i);
Write('║ ║')
End;
GotoXY(18,15);
Write('╚════════════════════════════════════════╝');
GotoXY(29, 8);
WriteLn(' Справка:');
for i:=1 to 5 do
begin
GoToXY(23,8+i);
write(myHelp[i]);
end;
readln
end; { Show help }
5: Break;
End;
Until False;

{ А вот тут уже удаляем матрицу }
Dispose(pmatrixObj, Done);
End;
end.
 К началу страницы 
+ Ответить 
SunDevil
сообщение 12.06.2005 21:15
Сообщение #25


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


Еще возникает такая проблема:
constructor TAbst.Init;
begin
clrscr;
writeln('Введите размерность матрицы');
readln(n);
clrscr;
end;

Это общий конструктор! Он вызывается вот тут:
constructor TMas.Init;
begin
TAbst.Init;
getmem(x,n*sizeof(Mas));
getmem(y,n*sizeof(Mas));
end;

Но когда я создаю матрицу, то я там задаю размерность! Так как сделать так, чтобы constructor TMas.Init не вызывал constructor TAbst.Init и делал размерность массива равным n*n?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.06.2005 22:14
Сообщение #26


Гость






:no: Никак !!! Ты не имеешь доступа к полям TMatr из TMas... Эти типы не связаны наследованием, они оба - наследники одного абстрактного типа... Так что тебе придется или оставить все как есть или наследовать TMas от TMatr (это предпочтительнее, т.к. тогда тебе не нужно будет проверять, инициализирован ли объект типа TMatr, он будет инициализироваться автоматически при инициализации TMas)
 К началу страницы 
+ Ответить 
SunDevil
сообщение 13.06.2005 9:43
Сообщение #27


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


То есть мне надо наследовать так:
TMas=object(TMatr)
x,y:^mas;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;

Или еще что-то надо сюда вписать???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.06.2005 10:31
Сообщение #28


Гость






Объясни мне, непонятливому, ПОЧЕМУ ты массив хочешь наследовать от матрицы??? Смысл в этом какой? Искусственно создать себе же проблемы и искусственно их потом решать? Ну не для этого ввели OOP !!! Если уж тебе нужно наследование и виртуальные функции, то я бы сделал так:

Исходный код
Type
pMassiv: ^massiv;
massiv: Array[1 .. 1] Of Real;

pMatrix = ^matrix;
matrix = Array[1 .. 1] Of pMassiv;

TAbst = Object { Абстрактный класс }
Size, ArrCount: Integer;
x: pMassiv; { это все равно везде присутствует }

Constructor Init;
{
Write('Размерность: '); ReadLn(Size);
GetMem(X, Size*SizeOf(Real));
}
Destructor Done; Virtual;
{
FreeMem(X, Size*SizeOf(Real));
}

Procedure InData; Virtual;
Procedure OutData; Virtual;
Procedure Form; Virtual;
Procedure OutRes; Virtual;
End;

TMass = Object(TAbst)
Y: pMassiv;

Constructor Init;
{
Inherited Init; { Вызываем конструктор предка }
GetMem(Y, Size*SizeOf(Real));
}
Destructor Done; Virtual;
{
FreeMem(Y, Size*SizeOf(Real));
Inherited Done;
}

Procedure InData; Virtual;
Procedure OutData; Virtual;
Procedure Form; Virtual;
Procedure OutRes; Virtual;
End;

TMatr = Object(TAbst)
Y: pMatrix;

Constructor Init;
{
Inherited Init;
GetMem(Y, Size*SizeOf(pMassiv));
For i := 1 To Size Do
GetMem(Y[i], Size*SizeOf(Real));
}
Destructor Done; Virtual;
{
For i := 1 To Size Do
FreeMem(Y[i], Size*SizeOf(Real));
FreeMem(Y, Size*SizeOf(pMassiv));
Inherited Done;
}

Procedure InData; Virtual;
Procedure OutData; Virtual;
Procedure Form; Virtual;
Procedure OutRes; Virtual;
End;


Я уж не знаю, что ты хочешь делать со списком, но при желании его тоже можно наследовать от TAbst (правда, непонятно зачем ему нужен размер unsure.gif ) ...
 К началу страницы 
+ Ответить 
SunDevil
сообщение 13.06.2005 13:58
Сообщение #29


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


2 volvo
Я совсем запутался с этими объектами sad.gif Уже голова не соображает что от чего наследовать и как с этим работать. Пожалуйста, не могли бы вы переделать файл Main.Pas, чтобы понятнее было и быстрее, а то сдавать надо скоро эту работу :o


Прикрепленные файлы
Прикрепленный файл  MAIN.zip ( 896 байт ) Кол-во скачиваний: 126
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.06.2005 14:10
Сообщение #30


Гость






:no: Нет... Я не знаю смысла всего этого проекта, поэтому делать ничего не буду... Помочь - пожалуйста, но делать ЗА кого-то ...
 К началу страницы 
+ Ответить 
SunDevil
сообщение 13.06.2005 16:38
Сообщение #31


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


volvo
Спасибо за помощь, тогда как все-таки вы мне посоветуете действовать. Мне надо чтобы без ввода матрицы ни массив, ни список нельзя было ввести!!! И чтобы они основывались на размерности матрицы! Вот вся проблема, хотя еще проблема будет со списком (я его даже не начинал делать) blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.06.2005 17:06
Сообщение #32


Гость






Тогда я делал бы вот так:
1. Наследуешь все как и прежде (есть абстрактный класс TAbst и от него - все остальные)
2. В конструкторе TAbst делаешь так:
Constructor TAbst.Init;
Begin End;

3. В конструкторе TMatr:
Constructor TMatr.Init;
Begin
Inherited Init; { инициализация предка }
Write('Размерность: '); ReadLn(n);

GetMem(Y, n*SizeOf(pMassiv));
For i := 1 To n Do
GetMem(Y[i], n*SizeOf(Real));
End;
{ еще в TMatr добавится новый метод: }
Function TMatr.GetSize: Integer;
Begin GetSize := n End;

4. Теперь TMas:
Constructor TMas.Init(Size: Integer);
Begin
Inherited Init; { создание TAbst }
n := Size;
GetMem(Y, n*SizeOf(Real));
End;

А для того чтобы нельзя было создать MasObj или ListObj ДО того как создана матрица - я уже говорил: пользоваться указателями (пост №24), но немного с изменениями:
If pmatrixObj <> nil Then Begin

{ Создаем массив с размерностью как у матрицы }
New(pmassObj, Init(pmatrixObj^.GetSize));

Repeat
menuResult := ShowMenu(massivMenu, massivMenuSize);
Case menuResult Of
1: pmassObj^.InData; { ... }
2: pmassObj^.Form; { ... }
3: pmassObj^.OutRes; { ... }
4: pmassObj^.Done;
End;
Until menuResult = 4;
Dispose(pmassObj, Done)
End
Else WriteLn(' Не могу инициализировать массив.'
+ ' Матрица не была инициализирована ');

То же самое - со списками... :yes:
 К началу страницы 
+ Ответить 
SunDevil
сообщение 13.06.2005 20:07
Сообщение #33


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


volvo
Мне надо еще одну переменную m вводить, для размерности матрицы! Ведь матрица может быть и не квадратной huh.gif Что тогда еще добавлять надо?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
SunDevil
сообщение 13.06.2005 20:35
Сообщение #34


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


Что тут не так???? Почему теперь компилятор гонит на I и говорит, что неизвестный идентификатор???
Исходный код
unit main;
interface
uses crt;
type pMassiv=^massiv;
massiv=array[1..1] of integer;
pMatrix=^matrix;
matrix=array[1..1] of pMassiv;

TAbst=object
Size,ArrCount:integer;
n:integer;
x:pMassiv;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
{mas=array[1..1] of integer;}
TMas=object(TAbst)
y:pMassiv;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
{matr=array[1..1] of ^mas;}
TMatr=object(TAbst)
{m:integer;
x:^matr;}
y:pMatrix;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
{PList1=^List1;
List1=record
dat:real;
next:PList1;
end;
TList=object(TAbst)
beg,beg1:PList1;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;}
PMas=^TMas;
PMatr=^TMatr;{
PList=^TList;}
implementation
constructor TAbst.Init;
begin
{clrscr;
writeln('Введите размерность матрицы');
readln(n);
clrscr;}
end;
procedure TAbst.InData;
begin
end;
procedure TAbst.Form;
begin
end;
procedure TAbst.OutRes;
begin
end;
destructor TAbst.Done;
begin
end;
{Array}
constructor TMas.Init;
begin
TAbst.Init;
n:=Size;
getmem(y,n*sizeof(integer));
{getmem(y,n*sizeof(Mas));}
end;
procedure TMas.InData;
var i:integer;
begin
clrscr;
for i:=1 to n do
begin
write('a[',i,']= ');
readln(x^[i]);
end;
clrscr;
end;
procedure TMas.Form;
var i,k:integer;
a,b:real;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
k:=0;
for i:=1 to n do
if ( x^[i]<a ) OR ( x^[i]>b ) then
begin
inc(k);
y^[k]:=x^[i];
end;
clrscr;
end;
procedure TMas.OutRes;
var k:integer;
begin
clrscr;
for k:=1 to n do
write(y^[k],' ');
readln;
clrscr;
end;
destructor TMas.Done;
begin
freemem(x,n*sizeof(pMassiv));
freemem(y,n*sizeof(pMassiv));
end;
{Matrix}
constructor TMatr.Init;
begin
TAbst.Init;
write('Размерность:');
readln(n);
getmem(y,n*sizeof(pMassiv));
for i:=1 to n do
getmem(y[i],n*sizeof(integer));
end;
function TMatr.GetSize:Integer;
begin
GetSize:=n
end;
procedure TMatr.InData;
var i,j:integer;
begin
clrscr;
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']= ');
readln(x^[i]^[j]);
end;
clrscr;
end;
procedure TMatr.Form;
var i,j:integer;
a,b:real;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
ArrLen:=0;
for i:=1 to n do
for j:=1 to n do
if ( x^[i]^[j]<a ) OR ( x^[i]^[j]>b ) then
begin
inc(ArrLen);
y^[ArrLen]:=x^[i]^[j];
end;
clrscr;
end;
procedure TMatr.OutRes;
var k:integer;
begin
clrscr;
for k:=1 to ArrLen do
write(y^[k],' ');
readln;
clrscr;
end;
destructor TMatr.Done;
begin
freemem(x,n*sizeof(Matr));
freemem(y,n*sizeof(Matr));
end;
end.

Поправьте, и плиз гляньте нет ли еще ошибок???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.06.2005 21:07
Сообщение #35


Гость






Потому что ты его не определил!!! Где у тебя описан var i:intteger? Ну, в конце концов, тебе же дается сообщение об ошибке компиляции !!! Учись исправлять такие ошибки сам, что тебе здесь, удаленный компилятор? Единственное, что могу еще сказать - читай предыдущие посты ВНИМАТЕЛЬНО... Не стОит вставлять в свой код один кусок, и не вставлять другой. Программа от этого лучше работать не станет. Там еще не меньше десятка ошибок, но в том коде, что я давал, этих ошибок просто нет... И второй раз приводить тот же код я не собираюсь.

Мне вообще кажется, что тема себя исчерпала - самостоятельного решения проблем с твоей стороны я не вижу...
 К началу страницы 
+ Ответить 
SunDevil
сообщение 14.06.2005 20:29
Сообщение #36


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


Доделал я этот гребаный курсовик, НО есть теперь опять одно НО! Сначала ввожу матрицу, потом для нее диапазон, все прекрасно. Со списком тоже все хорошо, но вот когда я перехожу к массиву, то при выводе выдает опять черт знает что.
Тестил на:
3 4 6 7
Диапазон 0;3
Вывод 4 6 7 1
Откуда теперь единица? :o Может дело в переменной k? А то ее слишком уж много у меня в программе? Посмотрите, плиз
Исходный код
unit main;
interface
uses crt;
type TAbst=object
n:integer;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
mas=array[1..1] of integer;
TMas=object(TAbst)
x,y:^mas;
constructor Init(n1:integer);
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
matr=array[1..1] of ^mas;
TMatr=object(TAbst)
m:integer;
x:^matr;
y:^mas;
ArrLen:integer;
constructor Init(n1,m1:integer);
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
PList1=^List1;
List1=record
dat:integer;
next:PList1;
end;
TList=object(TAbst)
beg,beg1:PList1;
constructor Init(n1:integer);
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
PMas=^TMas;
PMatr=^TMatr;
PList=^TList;
procedure InRazm(var n,m:integer);
implementation
procedure InRazm(var n,m:integer);
begin
clrscr;
writeln('Введите размерность матрицы :');
readln(n,m);
end;
constructor TAbst.Init;
begin
end;
procedure TAbst.InData;
begin
end;
procedure TAbst.Form;
begin
end;
procedure TAbst.OutRes;
begin
end;
destructor TAbst.Done;
begin
end;
{Array}
constructor TMas.Init(n1:integer);
begin
n:=n1;
getmem(x,n*sizeof(Mas));
getmem(y,n*sizeof(Mas));
end;
procedure TMas.InData;
var i:integer;
begin
clrscr;
for i:=1 to n do
begin
write('a[',i,']= ');
readln(x^[i]);
end;
clrscr;
end;
procedure TMas.Form;
var i,k:integer;
a,b:real;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
k:=0;
for i:=1 to n do
if (x^[i]<a) OR (x^[i]>b) then
begin
inc(k);
y^[k]:=x^[i];
end;
clrscr;
end;
procedure TMas.OutRes;
var k:integer;
begin
clrscr;
for k:=1 to n do
write(y^[k],' ');
readln;
clrscr;
end;
destructor TMas.Done;
begin
freemem(x,n*sizeof(Mas));
freemem(y,n*sizeof(Mas));
end;
{Matrix}
constructor TMatr.Init(n1,m1:integer);
var i:integer;
begin
n:=n1;
m:=m1;
getmem(x,n*sizeof(Matr));
for i:=1 to n do
getmem(x^[i],m*sizeof(Mas));
getmem(y,n*m*sizeof(Mas));
end;
procedure TMatr.InData;
var i,j:integer;
begin
clrscr;
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']= ');
readln(x^[i]^[j]);
end;
clrscr;
end;
procedure TMatr.Form;
var i,j:integer;
a,b:real;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
ArrLen:=0;
for i:=1 to n do
for j:=1 to m do
if (x^[i]^[j]<a) OR (x^[i]^[j]>b) then
begin
inc(ArrLen);
y^[ArrLen]:=x^[i]^[j];
end;
clrscr;
end;
procedure TMatr.OutRes;
var k:integer;
begin
clrscr;
for k:=1 to ArrLen do
write(y^[k],' ');
readln;
clrscr;
end;
destructor TMatr.Done;
var i:integer;
begin
for i:=1 to n do
freemem(x^[i],m*sizeof(Mas));
freemem(y,n*m*sizeof(Mas));
freemem(x,n*sizeof(Matr));
end;
constructor TList.Init(n1:integer);
begin
n:=n1;
end;
procedure TList.InData;
var i:integer;
PEnd,p:PList1;
begin
clrscr;
beg:=nil;
for i:=1 to n do
begin
new(p);
write('a[',i,']= ');
readln(p^.Dat);
p^.next:=nil;
if beg=nil then
beg:=p
else
PEnd^.Next:=p;
PEnd:=p;
end
end;
procedure TList.Form;
var a,b:integer;
p,p1,PEnd1:PList1;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
p:=beg;
beg1:=nil;
repeat
if (p^.Dat<a) OR (p^.Dat>b) then
begin
new(p1);
p1^.Dat:=p^.Dat;
p1^.next:=nil;
if beg1=nil then
beg1:=p1
else
PEnd1^.next:=p1;
PEnd1:=p1
end;
p:=p^.next;
until p=nil;
end;
procedure TList.OutRes;
var p:PList1;
begin
clrscr;
p:=beg1;
repeat
write(p^.Dat,' ');
p:=p^.next;
until p=nil;
readln
end;
destructor TList.Done;
var p,p1:PList1;
begin
p:=beg;
repeat
p1:=p^.next;
dispose(p);
p:=p1;
until p=nil;
p:=beg1;
repeat
p1:=p^.next;
dispose(p);
p:=p1;
until p=nil;
end;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.06.2005 21:12
Сообщение #37


Гость






У тебя тут та же самая история, что была с TMatr... Я же говорил - нельзя распечатывать ВЕСЬ массив... Добавь описание ArrLen:integer; в TMas и поменяй процедуру TMas.Form вот так:
procedure TMas.Form;
var
i:integer;
a,b:real;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
ArrLen:=0;
for i:=1 to n do
if (x^[i]<a) OR (x^[i]>b) then begin
inc(ArrLen);
y^[ArrLen]:=x^[i];
end;
clrscr;
end;

Работай с ArrLen вместо k...
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 6.07.2025 9:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"