![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
SunDevil |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите, плиз, разобраться с такой проблемой: в прикрепленном файле наполовину сделанный мой курсовик. Все ООП содержтся в файле Main.PAS В этом файле нормально работает только массив (с матрицей и списком я еще не разобрался). Когда запустите прогу, то увидете меню. Мне надо, чтобы на данный момент ВЫ помогли бы мне реализовать первый пункт меню (РАБОТА С МАССИВОМ). Надо, чтобы когда я зашел в этот пункт меню и выбрал любой другой пункт (Ввод массива, ввод диапазона от А до В, вывод измененного массива), то соотвественно это все работало. Моя проблема заключается в том, что я не знаю как вызывать файл Main.PAS и чтобы там все прекрасно работало :o
ПОМОГИТЕ, плиз :p2: Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Так напиши процедуры, который вызываются вот тут:
input_baza(list,n);
output_baza(list,n)}
Как ты хочешь, чтобы тебе помогли, если там у тебя черт ногу сломит в этих вызовах меню из одного в другое?... Да и с массивом тоже... Ты же его не подключил, откуда знаешь, что он работает? |
SunDevil |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Чтобы всем понятнее было :
Исходный код 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 - |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Ну, и где во всей программе у тебя хоть одна их этих функций вызывается? Покажи мне !!! У тебя этот модуль где-нибудь в программе упоминается? Ты вообще разницу между "реализовать" и "подключить" знаешь? Куда ты полез? Какое ООП? Не ты ли позавчера говорил:
Цитата(SunDevil @ 3.06.05 22:30) Помогите переделать прогу. Там все на объектах, а мне надо просто чтобы без объектов было, а то я в них не шарю... Уже шаришь? |
SunDevil |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
2 volvo
Разницу между реализовать и подключить знаю, подключить-то я смогу, мне надо чтобы ВЫ показали, как вызов делается этих объектов??? |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(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 |
![]()
Сообщение
#7
|
Гость ![]() |
Вот тебе простой пример работы с многоуровневым меню... Я подключил массив, он инициализируется и удаляется при выходе в предыдущее меню, больше с ним никаких действий не производится...
Попробуй разобраться в работе menu.PAS ... Прикрепленные файлы ![]() |
SunDevil |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
2 volvo
СПАСИБО ЗА МЕНЮ ОГРОМНОЕ! РАЗОБРАЛСЯ! Но появилась одна проблемка: в файле main.pas есть такая процедура: Код procedure TMas.OutRes; begin clrscr; for k:=1 to n do write(y^[k],' '); readln; clrscr end; Так вод копмилятор ругается ![]() Что это такое??? Помогите, плиз ![]() |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата(SunDevil @ 10.06.05 20:01) компилятор ругается ![]() Правильно ругается. Смотри: Цитата(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 только как переменные цикла - то можешь смело их удалять, Паскаль тебе это сделать не позволит. Определяй переменные там, где они нужны, а не "на всякий случай"... ![]() |
SunDevil |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo
Спасибо, буду работать дальше... |
SunDevil |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Да и еще такой вопрос. Можно ли запретить вводить массив и список перед вводом матрицы? Потому что на основе размерности матрицы надо создавать уже размерность массива и списка???
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Цитата(SunDevil @ 10.06.05 21:12) Можно ли запретить вводить массив и список перед вводом матрицы? Ты имеешь в виду запретить создание объектов типа TMas и TList если не был создан экземпляр TMatr? Тогда работай с указателями, а не с самими объектами: Var
ptrMas: ^TMas;
ptrList: ^TList;
ptrMatr: ^TMatr;
...
{ создавать массив только если матрица уже создана }
if ptrMatr <> nil then New(ptrMas, Init);
|
SunDevil |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Еще есть вопрос:
...
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 |
![]()
Сообщение
#14
|
Гость ![]() |
Ну, раз только 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 |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Постепенно добрался до работы с матрицей... Соответсвенно надо писать процедуру 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 |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата(SunDevil @ 12.06.05 15:12) Копмилятор снова бухтел на меня... И снова он прав ![]() 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 |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
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 - |
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
Один дополнительный цикл:
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 |
![]()
Сообщение
#19
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Сделал как вы написали, пишу далее процедуру 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 |
![]()
Сообщение
#20
|
Гость ![]() |
: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;
|
![]() ![]() |
![]() |
Текстовая версия | 22.04.2025 16:36 |