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

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

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

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


Новичок
*

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

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


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


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


Гость






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

Как ты хочешь, чтобы тебе помогли, если там у тебя черт ногу сломит в этих вызовах меню из одного в другое?...
Да и с массивом тоже... Ты же его не подключил, откуда знаешь, что он работает?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

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


Новичок
*

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

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


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


Гость






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

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


Прикрепленные файлы
Прикрепленный файл  Kursovik.rar ( 3.59 килобайт ) Кол-во скачиваний: 199
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

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

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


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


Новичок
*

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

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


Да и еще такой вопрос. Можно ли запретить вводить массив и список перед вводом матрицы? Потому что на основе размерности матрицы надо создавать уже размерность массива и списка???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата(SunDevil @ 10.06.05 21:12)
Можно ли запретить вводить массив и список перед вводом матрицы?

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

...
{ создавать массив только если матрица уже создана }
if ptrMatr <> nil then New(ptrMas, Init);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;

Вот и все...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 



- Текстовая версия 22.04.2025 16:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name