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

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

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

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


Новичок
*

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

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


Помогите, плиз, разобраться с такой проблемой: в прикрепленном файле наполовину сделанный мой курсовик. Все ООП содержтся в файле Main.PAS В этом файле нормально работает только массив (с матрицей и списком я еще не разобрался). Когда запустите прогу, то увидете меню. Мне надо, чтобы на данный момент ВЫ помогли бы мне реализовать первый пункт меню (РАБОТА С МАССИВОМ). Надо, чтобы когда я зашел в этот пункт меню и выбрал любой другой пункт (Ввод массива, ввод диапазона от А до В, вывод измененного массива), то соотвественно это все работало. Моя проблема заключается в том, что я не знаю как вызывать файл Main.PAS и чтобы там все прекрасно работало :o
ПОМОГИТЕ, плиз :p2:


Прикрепленные файлы
Прикрепленный файл  Kursovik.zip ( 3.28 килобайт ) Кол-во скачиваний: 165
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2005 18:25
Сообщение #2


Гость






Так напиши процедуры, который вызываются вот тут:
input_baza(list,n);
output_baza(list,n)}

Как ты хочешь, чтобы тебе помогли, если там у тебя черт ногу сломит в этих вызовах меню из одного в другое?...
Да и с массивом тоже... Ты же его не подключил, откуда знаешь, что он работает?
 К началу страницы 
+ Ответить 
SunDevil
сообщение 5.06.2005 18:45
Сообщение #3


Новичок
*

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

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


Чтобы всем понятнее было :
Исходный код
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 - 12.06.2005 20:09
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2005 19:01
Сообщение #4


Гость






Ну, и где во всей программе у тебя хоть одна их этих функций вызывается? Покажи мне !!! У тебя этот модуль где-нибудь в программе упоминается? Ты вообще разницу между "реализовать" и "подключить" знаешь? Куда ты полез? Какое ООП? Не ты ли позавчера говорил:

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

Уже шаришь?
 К началу страницы 
+ Ответить 
SunDevil
сообщение 5.06.2005 19:20
Сообщение #5


Новичок
*

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

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


2 volvo
Разницу между реализовать и подключить знаю, подключить-то я смогу, мне надо чтобы ВЫ показали, как вызов делается этих объектов???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2005 21:35
Сообщение #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
сообщение 6.06.2005 11:52
Сообщение #7


Гость






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

Попробуй разобраться в работе menu.PAS ...


Прикрепленные файлы
Прикрепленный файл  Kursovik.rar ( 3.59 килобайт ) Кол-во скачиваний: 135
 К началу страницы 
+ Ответить 
SunDevil
сообщение 10.06.2005 20:01
Сообщение #8


Новичок
*

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

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


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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.06.2005 20:28
Сообщение #9


Гость






Цитата(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
сообщение 10.06.2005 20:46
Сообщение #10


Новичок
*

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

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


volvo
Спасибо, буду работать дальше...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
SunDevil
сообщение 10.06.2005 21:12
Сообщение #11


Новичок
*

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

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


Да и еще такой вопрос. Можно ли запретить вводить массив и список перед вводом матрицы? Потому что на основе размерности матрицы надо создавать уже размерность массива и списка???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.06.2005 21:42
Сообщение #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
сообщение 10.06.2005 22:50
Сообщение #13


Новичок
*

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

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


Еще есть вопрос:
...
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;

Мне надо чтобы когда я выбирал этот пунт (СПРАВКА), то в окне появлялось всего пять строчек текста. Как это сделать???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.06.2005 23:03
Сообщение #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
сообщение 12.06.2005 15:12
Сообщение #15


Новичок
*

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

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


Постепенно добрался до работы с матрицей... Соответсвенно надо писать процедуру 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;

Копмилятор снова бухтел на меня...Помогите написать эту процедурку, СПАСИБО!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.06.2005 15:24
Сообщение #16


Гость






Цитата(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
сообщение 12.06.2005 17:27
Сообщение #17


Новичок
*

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

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


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 - 12.06.2005 17:33
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.06.2005 17:37
Сообщение #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
сообщение 12.06.2005 18:18
Сообщение #19


Новичок
*

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

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


Сделал как вы написали, пишу далее процедуру 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 вылезла??? Ничего не понимаю, поправьте меня
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.06.2005 18:49
Сообщение #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;
 К началу страницы 
+ Ответить 

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

 



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