Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2009, 16:18   #1
Dawystrik
Пользователь
 
Аватар для Dawystrik
 
Регистрация: 22.10.2008
Сообщений: 32
Восклицание Не могу найти ошибку в программе

Вот условие
Постановка задачи:
1. В соответствии с заданным вариантом спроектировать иерархию классов;
2. Описать поведение и состояние всех компонент классов. Использовать спецификаторы доступа к полям и методам класса: public, private, published;
3. Создать экземпляры объектов классов;
4. Используя инструментальную среду Delphi, в консольном режиме реализовать классы на языке Object Pascal.
5. В реализации программы должен быть предусмотрен вывод значений и области видимости (public, protected, private) полей родительского и производных классов,

Содержание отчёта:

1. Краткие теоретические сведения.
2. Графическое представление статических состояний классов и отношений между ними.
3. Листинг реализации классов на языке Object Pascal.
4. Выводы.

Создать класс - транспортные средства, имеющий имя и способ передвижения.. Определить конструктор, деструктор и методы доступа (чтения и записи) к полям класса.
Создать два производных класса:
Класс – пароход, имеющий имя, двигатель, грузоподъемность.
Класс – самолет, имеющий имя, двигатель, дальность полета.
Определить конструкторы, деструкторы, методы доступа (чтения и записи) имени, двигателя, грузоподъемности, дальности полета.
Создать экземпляры объектов всех классов.
В методах доступа к данным класса предусмотреть вывод сообщений поясняющих, метод какого класса вызывается

Вот код программы,но программа почему-то вылетает,помогите и подскажите где какие ошибки?Заранее благодарю.
Код:
program transport;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
   TTransp_sred = class
     private
       fName:string;
     protected
       procedure SetN(const new_name: string);
     public
       constructor Create(Name:string);
       Destructor Destroy; override;
       function Get:string;virtual;
   end;
   TParohod = class(TTransp_sred)
     private
       fGruzopod:integer;
       fDvigatel:string;
     protected
       procedure SetN(const new_name: string);
     public
       constructor Create(name:string; Gruzopod:integer; Dvigatel:string);
       Destructor Destroy; override;
       function Get:string;override;
   end;
   TSamolet = class(TTransp_sred)
     private
       fGruzopod:integer;
       fDvigatel:string;
     protected
       procedure SetN(const new_name: string);
     public
       constructor Create(name:string; Gruzopod:integer; Dvigatel:string);
       Destructor Destroy; override;
       function Get:string;override;
   end;
constructor TTransp_sred.Create(Name:string);
   begin
        fName:=name;
   end;
Destructor TTransp_sred.Destroy;
begin
end;
constructor TParohod.Create(name:string; Gruzopod:integer; Dvigatel:string);
   begin
        inherited create(name);
        fGruzopod:=Gruzopod;
        fDvigatel:=Dvigatel;
   end;
Destructor TParohod.Destroy;
begin
end;
constructor TSamolet.Create(name:string;Gruzopod:integer;Dvigatel:string);
   begin
        inherited create(name);
        fGruzopod:=Gruzopod;
        fDvigatel:=Dvigatel;
   end;
Destructor TSamolet.Destroy;
begin
end;
function TTransp_sred.Get:string;
   begin
        result:=fname;
   end;
procedure TTransp_sred.SetN;
begin
  fname:=new_name;
end;
function TParohod.Get:string;
   begin
        result:=fname + #13 + 'Грузоподъёмность:' + IntToStr(fGruzopod)+#13+
                'Двигатель:' + fDvigatel;
   end;
procedure TParohod.SetN;
begin
  fname:=new_name;
end;
function TSamolet.Get:string;
   begin
        result:=fname + #13 + 'Грузоподъёмность:' + IntToStr(fGruzopod)+#13+
                'Двигатель:' + fDvigatel;
   end;
procedure TSamolet.SetN;
begin
  fname:=new_name;
end;
function Rus(mes:string):string;
var
   i:integer;
begin
      for i:=1 to length(mes) do
        case mes[i] of
            'А'..'п' : mes[i] := Chr(Ord(mes[i]) - 64);
            'р'..'я' : mes[i] := Chr(Ord(mes[i]) - 16);
        end;
      rus:=mes;
end;
var
  name1:TSamolet;
  name2:TParohod;
  ch:char;
begin
  Writeln(Rus('Транспортное средство:'));
  Writeln(Rus('Самолет или пароход? '));
  Readln(ch);
  if (ch = 'Самолет') or (ch='самолет')
  then
        begin
            name1:=TSamolet.Create('Самолет',256,'Двигатель');
            name1.Get;
  end
  else
        begin
            name2:=TParohod.Create('Пароход',256,'Двигатель');
            name2.Get;
        end;
end.
Dawystrik вне форума Ответить с цитированием
Старый 19.03.2009, 16:36   #2
Adler
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 19
По умолчанию

Dawystrik
Цитата:
ch = 'Самолет'
Смысл сравнивать символ и строку?
Цитата:
if (ch = 'Самолет') or (ch='самолет')
then
begin
name1:=TSamolet.Create('Самолет',25 6,'Двигатель');
name1.Get;
end
else
begin
name2:=TParohod.Create('Пароход',25 6,'Двигатель');
name2.Get;
end;
end.
name1.Get и name2.Get возращает резальтат но не выводит на экран. Поэтому ничего и не видно. Можно так сделать
Код:
if (ch = 'С') or (ch='с')
  then
        begin
            name1:=TSamolet.Create('Самолет',256,'Двигатель');
            Writeln(Rus(name1.Get));
  end
  else 
        begin
            name2:=TParohod.Create('Пароход',256,'Двигатель');
            Writeln(Rus(name2.Get));
        end;
Readln;
end.

Последний раз редактировалось Adler; 19.03.2009 в 16:38.
Adler вне форума Ответить с цитированием
Старый 19.03.2009, 16:39   #3
Adler
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 19
По умолчанию

Код:
var
  name1:TSamolet;
  name2:TParohod;
Можно и так
Код:
var
  name1,name2:TTransp_sred;
Adler вне форума Ответить с цитированием
Старый 19.03.2009, 16:40   #4
Dawystrik
Пользователь
 
Аватар для Dawystrik
 
Регистрация: 22.10.2008
Сообщений: 32
По умолчанию

но только оно выводит Двигатель и всё, икак бы так сделать чтоб задействовать деструктор и создание нового элемента??
Dawystrik вне форума Ответить с цитированием
Старый 19.03.2009, 16:54   #5
Adler
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 19
По умолчанию

Код:
S:string:
...
Readln(S);
в S будет черте-что, а не русский текст.
Поэтому пиши транслитом или предлагай выбрать: типа 1 или 2. И завязывай с кирилицей
Цитата:
деструктор и создание нового элемента??
тут это лишнее. Ты же память не выделяешь.
Хотя можешь побаловаться.
Код:
Destructor TSamolet.Destroy;
begin
  Writeln('TSamolet.Destroy'); 
  inherited Destroy;
end;
...
name1.Free;
Adler вне форума Ответить с цитированием
Старый 19.03.2009, 16:57   #6
Dawystrik
Пользователь
 
Аватар для Dawystrik
 
Регистрация: 22.10.2008
Сообщений: 32
По умолчанию

я имею в виду,чтоб в главной программе сделать типа выбора,типа уничтоижить или создать,только как это всё реализовать?и как быть с тем,что оно мне сейчас выводит,мне нужно,допустим чтобы заполнить там имя самолета,какой двигатель,какая грузоподъёмность ичтоб оно мне это всё вывело на экран,как это реализовать?
Dawystrik вне форума Ответить с цитированием
Старый 19.03.2009, 17:02   #7
Adler
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 19
По умолчанию

Код:
...
function ToRus(mes:string):string;
var
  i:integer;
begin
  for i:=1 to length(mes) do
    case mes[i] of
      chr(Ord('А')-64)..chr(Ord('п')-64):mes[i]:=Chr(Ord(mes[i])+64);
      chr(Ord('р')-16)..chr(Ord('я')-16):mes[i]:=Chr(Ord(mes[i])+16);
    end;
  Result:=mes;
end;
...
Readln(S); S:=ToRus(S); Writeln(Rus('Вы ввели : '),Rus(S));
Юзай проверку ввода.
Adler вне форума Ответить с цитированием
Старый 19.03.2009, 17:05   #8
Dawystrik
Пользователь
 
Аватар для Dawystrik
 
Регистрация: 22.10.2008
Сообщений: 32
По умолчанию

где писать Readln и что означает S и где её объявлять??
Dawystrik вне форума Ответить с цитированием
Старый 19.03.2009, 17:06   #9
Adler
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 19
По умолчанию

Цитата:
и как быть с тем,что оно мне сейчас выводит
Разрешай вводить только циферки. Тоесть задавай вопрос такой что бы ответ был цифрой.
Цитата:
где писать Readln и что означает S и где её объявлять??
Код:
var
  name1,name2:TTransp_sred;
  S:string;
begin
  Writeln(Rus('Транспортное средство:'));
  Writeln(Rus('Самолет или пароход? '));
  Readln(S); S:=ToRus(S); Writeln(Rus('Вы ввели : '),Rus(S));
  if (S='Самолет')or(S='самолет') then
  begin
    name1:=TSamolet.Create('Самолет',256,'Двигатель');
    Writeln(Rus(name1.Get));
  end
  else
  begin
    name2:=TParohod.Create('Пароход',256,'Двигатель');
    Writeln(Rus(name2.Get));
  end;
  Readln;
end.
*ушёл*
Adler вне форума Ответить с цитированием
Старый 19.03.2009, 21:19   #10
Adler
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 19
По умолчанию

Dawystrik
Вообще задание не такое и короткое что бы за 5 мин написать. Хотя за 60 уже вполне можно уложится.

если баксов 15 предложишь, сделаю ... только ща меня забанят за такое...
PS: ладно, если буду нужен. найдешь как-нибудь.
Adler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в программе Wast Паскаль, Turbo Pascal, PascalABC.NET 2 29.12.2008 20:40
Паскаль, не могу найти ошибку в программе Julinja Помощь студентам 2 17.11.2008 20:42
Помогите найти ошибку в программе Evgenii Помощь студентам 3 24.07.2008 09:06
Помогите найти ошибку в программе KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 5 10.03.2008 14:19