Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите с курсовиком
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SunDevil
Помогите, плиз, разобраться с такой проблемой: в прикрепленном файле наполовину сделанный мой курсовик. Все ООП содержтся в файле Main.PAS В этом файле нормально работает только массив (с матрицей и списком я еще не разобрался). Когда запустите прогу, то увидете меню. Мне надо, чтобы на данный момент ВЫ помогли бы мне реализовать первый пункт меню (РАБОТА С МАССИВОМ). Надо, чтобы когда я зашел в этот пункт меню и выбрал любой другой пункт (Ввод массива, ввод диапазона от А до В, вывод измененного массива), то соотвественно это все работало. Моя проблема заключается в том, что я не знаю как вызывать файл Main.PAS и чтобы там все прекрасно работало :o
ПОМОГИТЕ, плиз :p2:
volvo
Так напиши процедуры, который вызываются вот тут:
input_baza(list,n);
output_baza(list,n)}

Как ты хочешь, чтобы тебе помогли, если там у тебя черт ногу сломит в этих вызовах меню из одного в другое?...
Да и с массивом тоже... Ты же его не подключил, откуда знаешь, что он работает?
SunDevil
Чтобы всем понятнее было :
Исходный код
unit main;
interface
type TAbst=object
n,k:integer;
constructor Init;
procedure InData; virtual;
procedure OutData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
mas=array[1..1] of real;
TMas=object(TAbst)
x,y:^mas;
constructor Init;
procedure InData; virtual;
procedure OutData; 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;
constructor Init;
procedure InData; virtual;
procedure OutData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
PList=^List;
List=record
dat:real;
next:PList;
end;
TList=object(Tabst)
beg,beg1:PList;
constructor Init;
procedure InData; virtual;
procedure OutData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;
PMas=^TMas;
PMatr=^TMatr;
{PList=^TList;}
implementation
constructor TAbst.Init;
begin
writeln('Введите количество элементов');
readln(n);
end;
procedure TAbst.InData;
begin
end;
procedure TAbst.OutData;
begin
end;
procedure TAbst.Form;
begin
end;
procedure TAbst.OutRes;
begin
end;
destructor TAbst.Done;
begin
end;
constructor TMas.Init;
begin
TAbst.Init;
getmem(x,n*sizeof(Mas));
getmem(y,n*sizeof(Mas));
end;
procedure TMas.InData;
var i:integer;
begin
for i:=1 to n do
begin
writeln('a[',i,']= ');
readln(x^[i]);
end
end;
procedure TMas.OutData;
var i:integer;
begin
for i:=1 to n do
write(x^[i],' ');
end;
procedure TMas.Form;
var i:integer;
a,b:real;
begin
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
end;
procedure TMas.OutRes;
begin
{ for k:=1 to n do
write(y^[k],' ');}
end;
destructor TMas.Done;
begin
freemem(x,n*sizeof(Mas));
freemem(y,n*sizeof(Mas));
end;
end.

Это модуль с ООП, так. Вопрос, где я не подключил массив? Мне надо чтобы на данный момент вызывалась и работала процедура ввода массива (procedure TMas.InData), вывода массива (procedure TMas.OutData) и процедура TMas.Form Как это, так сказать, реализовать???
volvo
Ну, и где во всей программе у тебя хоть одна их этих функций вызывается? Покажи мне !!! У тебя этот модуль где-нибудь в программе упоминается? Ты вообще разницу между "реализовать" и "подключить" знаешь? Куда ты полез? Какое ООП? Не ты ли позавчера говорил:

Цитата(SunDevil @ 3.06.05 22:30)
Помогите переделать прогу. Там все на объектах, а мне надо просто чтобы без объектов было, а то я в них не шарю...

Уже шаришь?
SunDevil
2 volvo
Разницу между реализовать и подключить знаю, подключить-то я смогу, мне надо чтобы ВЫ показали, как вызов делается этих объектов???
volvo
Цитата(SunDevil @ 5.06.05 19:20)
как вызов делается этих объектов???

Вот так:
var massObj: TMas;
...
{ там, где нужно работать с massObj: }

massObj.Init;
{ Это обязательно ПЕРВЫМ обращением к объекту,
т.к. объект содержит виртуальные методы
и обращение к ним без Init приведет к ошибке... }
...
{ дальше - работаешь с massObj как тебе нужно }
...
{ и в конце - освобождаешь память: }
massObj.Done;

Я бы massObj.Init делал сразу на входе в процедуру ShowMenu2, а massObj.Init - вот тут:
procedure show_menu2;
...
#13{Enter}:
Case poscur of
...
4: begin
massObj.Done; { <--- Перед переходом на другое меню }
show_menu;
end;
5: halt;
end; { case }
...


Одно замечание: У тебя в программе используется вызов одной функции из другой:
procedure show_menu;
begin
...
show_menu2;
show_menu3;
...
end;
procedure show_menu2;
begin
...
show_menu; { <--- опять же вызов show_menu }
...
end;

Я бы не советовал так делать. Лучше оформи меню отдельной функцией и делай так:
{ это вернет выбранный пункт меню }
function menu(var options: arrOfString; n: integer): integer;
begin ... end;

{ основная программа }
begin
case menu(mainMenu, mainMenuSize) of
1: { работа с массивом: }
repeat
menuResult := menu(massivMenu, massivMenuSize)
case menuResult of
1: ...
2: ...
end;
until menuResult = 4; { переход к предыдущему меню }

2: { работа с матрицей: }
repeat
menuResult := menu(matrixMenu, matrixMenuSize)
case menuResult of
1: ...
2: ...
end;
until menuResult = 4; { переход к предыдущему меню }

3: { работа со списком: }
repeat
menuResult := menu(listMenu, listMenuSize)
case menuResult of
1: ...
2: ...
end;
until menuResult = 4; { переход к предыдущему меню }

...
5: halt;
end;
end;
volvo
Вот тебе простой пример работы с многоуровневым меню... Я подключил массив, он инициализируется и удаляется при выходе в предыдущее меню, больше с ним никаких действий не производится...

Попробуй разобраться в работе menu.PAS ...
SunDevil
2 volvo
СПАСИБО ЗА МЕНЮ ОГРОМНОЕ! РАЗОБРАЛСЯ! Но появилась одна проблемка: в файле main.pas есть такая процедура:
Код
procedure TMas.OutRes;
begin
 clrscr;  
 for k:=1 to n do
    write(y^[k],' ');
 readln;
 clrscr
end;

Так вод копмилятор ругается sad.gif Указывает на : после k и говорит : Invalid FOR control variable
Что это такое??? Помогите, плиз blink.gif
volvo
Цитата(SunDevil @ 10.06.05 20:01)
компилятор ругается sad.gif

Правильно ругается. Смотри:
Цитата(Pascal Help)
The FOR statement control variable must be a simple variable defined in the declaration part of the current subprogram.

То есть управляющая переменная цикла должна определяться в разделе описаний текущей подпрограммы... А у тебя она где описана? В объекте-предке? Так нельзя... Переопредели ее:
procedure TMas.OutRes;
var k: integer; { <--- Здесь }
begin
clrscr;
for k:=1 to n do write(y^[k],' ');
readln;
clrscr
end;

Кстати, если ты собираешься использовать те переменные n, k из TAbst только как переменные цикла - то можешь смело их удалять, Паскаль тебе это сделать не позволит. Определяй переменные там, где они нужны, а не "на всякий случай"... rolleyes.gif
SunDevil
volvo
Спасибо, буду работать дальше...
SunDevil
Да и еще такой вопрос. Можно ли запретить вводить массив и список перед вводом матрицы? Потому что на основе размерности матрицы надо создавать уже размерность массива и списка???
volvo
Цитата(SunDevil @ 10.06.05 21:12)
Можно ли запретить вводить массив и список перед вводом матрицы?

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

...
{ создавать массив только если матрица уже создана }
if ptrMatr <> nil then New(ptrMas, Init);
SunDevil
Еще есть вопрос:
...
Repeat
menuResult := ShowMenu(listMenu, listMenuSize);
Case menuResult Of
1: ; { ... }
2: ; { ... }
3: ; { ... }
4: { listObj.Done; }
End;
Until menuResult = 4;
End;
4: ; { Show help } { <--- Здесь }
5: Break;
End;
Until False;
End;

Мне надо чтобы когда я выбирал этот пунт (СПРАВКА), то в окне появлялось всего пять строчек текста. Как это сделать???
volvo
Ну, раз только 5 строчек, то я бы просто задавал их в константе, а потом выводил и ждал нажатия на Enter ...
Const
myHelp: array[1 .. 5] of String = (
'первая строка помощи',
'вторая строка помощи',
... );
...
Repeat
menuResult := ShowMenu(listMenu, listMenuSize);
Case menuResult Of
1: ; { ... }
2: ; { ... }
3: ; { ... }
4: { listObj.Done; }
End;
Until menuResult = 4;
End;
4: { Show help } { <--- Здесь }
Begin
For i := 1 to 5 Do Begin
{выводишь туда, где сейчас меню, потому что
все равно меню перерисуется на следующем шаге}
GotoXY(19, 7+i); Write(myHelp[i]);
End;
{ И ждешь нажатия на Enter: }
ReadLn
End;
5: Break;

Вот и все...
SunDevil
Постепенно добрался до работы с матрицей... Соответсвенно надо писать процедуру procedure InData для матрицы. В типе у меня написано так:
matr=array[1..1] of ^mas;
TMatr=object(TAbst)
m:integer;
x:^matr;
y:^mas;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
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;

Копмилятор снова бухтел на меня...Помогите написать эту процедурку, СПАСИБО!
volvo
Цитата(SunDevil @ 12.06.05 15:12)
Копмилятор снова бухтел на меня...

И снова он прав smile.gif У тебя неправильно происходит обращение к элементам матрицы. Как матрица у тебя определена? Как массив указателей на массивы, тогда вот так нужно к ним обращаться:
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;
SunDevil
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;

Это процедура для работы с массивом. В ней я ввожу диапазон значений и получаю новый массив. А как ее надо переделать под матрицу, чтобы искала в матрице и выводило в виде массива? Вроде надо еще цикл один или два??? Помогите, плиз ;)
volvo
Один дополнительный цикл:
procedure TMatr.Form;
var
i,j,k:integer;
a,b:real;
begin
clrscr;
writeln('Введите диапазон значений от A до B');
readln( a,B );
k:=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(k);
y^[k]:=x^[i]^[j];
end;
clrscr;
end;
SunDevil
Сделал как вы написали, пишу далее процедуру procedure TMatr.OutRes
 procedure TMatr.OutRes;
var k:integer;
begin
clrscr;
for k:=1 to n*n do
write(y^[k],' ');
readln;
clrscr;
end;

В программе выводит черт знает что :o
Тестил на:
-3 4 5
6 -7 3
2 4 5
Диапазон: 0;4
Выводит массив: -3 5 6 -7 5 5 8 1 7
Откуда еще и 8 вылезла??? Ничего не понимаю, поправьте меня
volvo
:no: Неправильно... В массиве Y скорее всего или просто мусор, или остатки от предыдущего использования... Нельзя распечатывать весь массив. Лучше ввести переменную ArrLen в тип TMatr, и работать с ним:
Type
TMatr = Object(TAbst)
ArrLen: integer;
...
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;
SunDevil
Цитата(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???
volvo
Ну, так это должно быть там, где ты собрался использовать эти переменные. Значит в menu.pas smile.gif
SunDevil
Исходный код
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 и куда в него надо всунуть условие и описание указателей? ;)
volvo
Я же сказал тебе не просто описАть указатели, а работать с указателями:
Исходный код
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
Еще возникает такая проблема:
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?
volvo
:no: Никак !!! Ты не имеешь доступа к полям TMatr из TMas... Эти типы не связаны наследованием, они оба - наследники одного абстрактного типа... Так что тебе придется или оставить все как есть или наследовать TMas от TMatr (это предпочтительнее, т.к. тогда тебе не нужно будет проверять, инициализирован ли объект типа TMatr, он будет инициализироваться автоматически при инициализации TMas)
SunDevil
То есть мне надо наследовать так:
TMas=object(TMatr)
x,y:^mas;
constructor Init;
procedure InData; virtual;
procedure Form; virtual;
procedure OutRes; virtual;
destructor Done; virtual;
end;

Или еще что-то надо сюда вписать???
volvo
Объясни мне, непонятливому, ПОЧЕМУ ты массив хочешь наследовать от матрицы??? Смысл в этом какой? Искусственно создать себе же проблемы и искусственно их потом решать? Ну не для этого ввели 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
2 volvo
Я совсем запутался с этими объектами sad.gif Уже голова не соображает что от чего наследовать и как с этим работать. Пожалуйста, не могли бы вы переделать файл Main.Pas, чтобы понятнее было и быстрее, а то сдавать надо скоро эту работу :o
volvo
:no: Нет... Я не знаю смысла всего этого проекта, поэтому делать ничего не буду... Помочь - пожалуйста, но делать ЗА кого-то ...
SunDevil
volvo
Спасибо за помощь, тогда как все-таки вы мне посоветуете действовать. Мне надо чтобы без ввода матрицы ни массив, ни список нельзя было ввести!!! И чтобы они основывались на размерности матрицы! Вот вся проблема, хотя еще проблема будет со списком (я его даже не начинал делать) blink.gif
volvo
Тогда я делал бы вот так:
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
volvo
Мне надо еще одну переменную m вводить, для размерности матрицы! Ведь матрица может быть и не квадратной huh.gif Что тогда еще добавлять надо?
SunDevil
Что тут не так???? Почему теперь компилятор гонит на 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.

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

Мне вообще кажется, что тема себя исчерпала - самостоятельного решения проблем с твоей стороны я не вижу...
SunDevil
Доделал я этот гребаный курсовик, НО есть теперь опять одно НО! Сначала ввожу матрицу, потом для нее диапазон, все прекрасно. Со списком тоже все хорошо, но вот когда я перехожу к массиву, то при выводе выдает опять черт знает что.
Тестил на:
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.
volvo
У тебя тут та же самая история, что была с 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...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.