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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2010, 07:52   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию добавление нового типа данных

Доброе утро написала программу для работы с гетерогенными списками
Код:
program get_spisok;
uses
  SysUtils;

{===============================================================================
                    описание типов и данных
===============================================================================}
  type ob_spisok=^Tob_spisok;    //абстрактный тип
  Tob_spisok=object
    constructor init;
    procedure output;virtual;
  end;

  int = ^Tint;  //целые
  Tint = object(Tob_spisok)
    inf:integer;
    procedure insert(cel:integer);
    procedure output;virtual;
  end;

  float = ^Tfloat;  //вещественное
  Tfloat = object(Tob_spisok)
    inf:real;
    procedure insert(vesh:real);
    procedure output;virtual;
  end;

  simbol = ^Tsimbol;  //символ
  Tsimbol = object(Tob_spisok)
    inf:char;
    procedure insert(sim:char);
    procedure output;virtual;
  end;

{===============================================================================
          конструкторы и процедуры
===============================================================================}
Constructor Tob_spisok.init;
begin

end;

procedure Tob_spisok.output;
begin

end;


//целые
procedure Tint.insert(cel:integer);
begin
  inf:=cel;
end;

procedure Tint.output;
begin
  write(inf,' ');
end;

//вещественные
procedure Tfloat.insert(vesh: Real);
begin
  inf:=vesh;
end;

procedure Tfloat.output;
begin
  write(inf:2:2,' ');
end;

//символы
procedure TSimbol.insert(sim: Char);
begin
  inf:=sim;
end;

procedure Tsimbol.output;
begin
  write(inf,' ');
end;

{===============================================================================
        описание данных
===============================================================================}
type spisok = ^Tspisok;
  Tspisok = record
    inf:ob_spisok;
    next:spisok;
    prior:spisok;
  end;

var
  head:spisok;  //голова списка
  x:real; //значение инф поля

{===============================================================================

===============================================================================}
procedure print(head:spisok);
var
  temp:spisok;
begin
  temp:=head;
  while(temp<>nil) do
  begin
    temp^.inf^.output;
    temp:=temp^.next;
  end;
end;


procedure insert(var head:spisok); //процедура вставки
var
  int1:int;  //целое
  float1:float;  //вещественное
  simbol1:simbol; //символ
  new_element,temp:spisok;
  s:Variant;
  c:char;
  x:real;
begin
  while not(eof) do
  begin
    read(x);
    if (head=nil) then  //если голова пустая вставлять туда
    begin
      new(head);
    {  if s  in ['a'..'Z'] then
      begin
        new(simbol1,init);
        simbol1^.insert(c);
        head^.inf:=simbol1;
        head^.next:=nil;
        head^.prior:=nil;
      end
      else
      begin
        x:=s; }
        if frac(x)<>0 then //если вещественное
        begin
          new(float1,init);
          float1^.insert(x);
          head^.inf:=float1;
          head^.next:=nil;
          head^.prior:=nil;
        end
        else   //иначе целое
        begin
          new(int1,init);
          int1^.insert(trunc(x));
          head^.inf:=int1;
          head^.next:=nil;
          head^.prior:=nil;
        end;
      end
  //  end
    else   //список не пустой
    begin
      new(temp);
      temp:=head;
      while(temp^.next<>nil) do
      temp:=temp^.next;
      new(new_element);

   {   if s  in ['a'..'Z'] then
      begin
        new(simbol1,init);
        simbol1^.insert(s);
        head^.inf:=simbol1;
        head^.next:=nil;
        head^.prior:=nil;
      end
      else
      begin  }
        x:=s;
        if frac(x)<>0 then  //если вещественное
        begin
          new(float1,init);
          float1^.insert(x);
          new_element^.inf:=float1;
          new_element^.next:=nil;
          new_element^.prior:=temp;
        end
        else //иначе целое
        begin
          new(int1,init);
          int1^.insert(trunc(x));
          new_element^.inf:=int1;
          new_element^.next:=nil;
          new_element^.prior:=temp;
        end;
        temp^.next:=new_element;
     // end;
    end;
  end;
end;

{===============================================================================
            главная программа
===============================================================================}
begin
//считать начальные данные из списка
  assign(input,'input.txt');
  reset(input);
  assign(output,'output.txt');
  rewrite(output);
  insert(head);
  print(head);
  readln;
end.
Работает для файла вида 2 2.2 4 2.9
А нужно чтобы еще работала для файлов такого вида 2.2 e 2 42.2
Как испрвить? помогите пожалуйста
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.04.2010, 07:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
2.2 e 2 42.2
А что эти цифры то означают?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.04.2010, 07:58   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

И чего прога работает ?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.04.2010, 08:43   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

прога работает когда в файле только целые и вещественные, а нужно чтобы еще она считывала и записывала в список элементы типа char. Эти цифры означают элементы которые добавлятся в спискок
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.04.2010, 08:52   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Проблема в том, что данной инфы не достаточно чтобы определить, что же у тебя Char (Он ведь тоже может содержать и точку и цифры) .
Я бы делал так - сначала считывал бы в буфер очередной элемент файла. Будем считать что это строка символов обрамленная пробелами. Прочтя строку, я бы уже смотрел - похоже на число? Значит число. Символ, значит char. Это называется утиная типизация .

ЗЫ. Что-то Вы не любите строки и символы... А зря, будущее за ними .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.04.2010, 09:03   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
строка символов обрамленная пробелами.
Я бы считывал символы до тех пор пока не встретится неоднотипный с ними символ
Например если первый символ - цифра то считывать пока очередной символ не ['0'..'9']
Если это буква (IsCharAlpha()) то считывать до not IsCharAlphaNumerik
и т.д.
Это обычнейшее сканирование.

Sparky, мы тут с Уткиным где-то выкладывали примеры своих редакторов кода, так вот в том что я выложил есть класс сканирования текста - посмотри его я там парсер как раз делал он числа отличает от остальных, а дядя Уткин пусть подскажет ссылку на ту тему.
I'm learning to live...

Последний раз редактировалось Stilet; 07.04.2010 в 09:07.
Stilet вне форума Ответить с цитированием
Старый 07.04.2010, 09:11   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

http://programmersforum.ru/showthread.php?t=84887
Если ты это имел ввиду...
Там и в моем редакторе осуществляется поиск слов, чисел и символов (некоторых). Так что алгоритмы можно дернуть оттудова.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 07.04.2010 в 09:13.
Utkin вне форума Ответить с цитированием
Старый 07.04.2010, 09:17   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

спасибо большое
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.04.2010, 09:34   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Если ты это имел ввиду...
Именно
Цитата:
Так что алгоритмы можно дернуть оттудова.
Вот стало быть Спарки теперь остается взять лучшее
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.04.2010, 09:52   #10
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

да нет я не стала брать, я просто в очередной раз ступила, и не воспользовалась строкой, уже все исправила, надо заканчивать по ночам проги писать
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формирование нового массива из данных в Делфи Юлия Алексеевна Помощь студентам 0 07.03.2010 13:53
сравнение ячеек и добавление нового столбца к таблице robbe Microsoft Office Excel 7 22.01.2010 10:30
Добавление данных Ruska882009 PHP 2 22.09.2009 18:36
Создание нового типа master_root Общие вопросы Delphi 2 02.07.2008 22:33
Добавление данных OLEGSENT БД в Delphi 3 17.06.2008 23:47