Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Эмулятор электронной таблицы / 18 сообщений из 18, страница 1 из 1
05.08.2005, 11:20
    #33203520
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Здравствуйте!
Мне нужно реализовать что то на подобе таблицы в Excel. Проблема как вычеслить ссылочные поля. Подскажите как это можно реализовать или может есть какой - то готовый алгоритм?
Благодарю!
...
Рейтинг: 0 / 0
05.08.2005, 11:24
    #33203540
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Забыл добавить пример,
Например нужно вычеслить с1, ссылка же тоже может ссылаться на другую ячейку та на третию и т.д


A B C
1 5 8 A1*b2+c2

2 3 b1 a1
...
Рейтинг: 0 / 0
05.08.2005, 11:49
    #33203664
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Я делал так:
Иду по порядку по всем полям и считаю если удалось посчитать то хорошо, если нет(есть ссылка на еще не посчитанное поле) то заношу в очередь ожидания и считаю дальше, когда дохожу до конца, то перехожу на очередь ожидания и теперь по ней циркулирую пока все ссылки не разрешатся...
Естественно надо добавить обработку cross cell reference...
Если не понятно расскажу подробнее...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
05.08.2005, 11:50
    #33203669
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Если не секрет, то это случайно не тестовые задания для устройства на работу,
а то мне приходилось решать такую тестовую задачку когда я устраивался в одну контору...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
05.08.2005, 11:55
    #33203690
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
А не осталось исходников, может дашь глянуть?
...
Рейтинг: 0 / 0
05.08.2005, 11:56
    #33203693
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Guest wrote:
> Здравствуйте!
> Мне нужно реализовать что то на подобе таблицы в Excel. Проблема как
> вычеслить ссылочные поля. Подскажите как это можно реализовать или может
> есть какой - то готовый алгоритм?

Насколько я знаю, в Excel для определения порядка вычисления используется алгоритм топологической сортировки.
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
05.08.2005, 12:51
    #33203944
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
synapseЯ делал так:
Иду по порядку по всем полям и считаю если удалось посчитать то хорошо, если нет(есть ссылка на еще не посчитанное поле) то заношу в очередь ожидания и считаю дальше, когда дохожу до конца, то перехожу на очередь ожидания и теперь по ней циркулирую пока все ссылки не разрешатся...
Естественно надо добавить обработку cross cell reference...
Если не понятно расскажу подробнее...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@

Не совсем понятно по поводу очереди ожидания, ведь ячейка может содержать не просто ссылку а выражение типа A2*B3+C1-B2 и т.д
...
Рейтинг: 0 / 0
05.08.2005, 13:26
    #33204093
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Так начинаем по порядку.
У нас есть таблица.
Представим ее как двумерный массив объектов Cell.
т.к. каждая ячейка имеет аддресс типа A1,A2, то все это легко представить как двумерный массив(A->1;B->2). Получается ячейка с адресом A1 ,будет иметь индекс в массиве array[0][0], A2->array[0][1]....

class Cell
{
public:
double res;//результат вычислений
char *value; //выражение
}

Дальше идем по этому массиву строчка за строчкой и считаем, если встречаем ссылку на поле то проверяем по индексу рассчитана ли она, если рассчитана то берем результат.
Если в выражении нет не рассчитанных полей то вычисляем и заносим в результат. Идем дальше...
Если встречается хоть одна ссылка без результата то заносим указатель на эту ячейку в очередь ожидания.
После окончания прохода таблицы возвращаемся к очереди ожидания. Пробуем вычислить снова, если снова неудача, заносим ее опять в конец очереди(ждем, значит на этот есть ссылки на не расчитанные ячейки из очереди ожидания, которые должны разрешиться с учетом уже рассчитанных ячеек.)
И так вот циркулием по этой очереди пока не разрешаться все ссылки...

Еще кстати как расширение можно перед началом проходов упорядочить таблицу определенным образом, чтоб очередь меньше оказалась....
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
05.08.2005, 13:29
    #33204103
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Guest synapseЯ делал так:
Иду по порядку по всем полям и считаю если удалось посчитать то хорошо, если нет(есть ссылка на еще не посчитанное поле) то заношу в очередь ожидания и считаю дальше, когда дохожу до конца, то перехожу на очередь ожидания и теперь по ней циркулирую пока все ссылки не разрешатся...
Естественно надо добавить обработку cross cell reference...
Если не понятно расскажу подробнее...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@

Не совсем понятно по поводу очереди ожидания, ведь ячейка может содержать не просто ссылку а выражение типа A2*B3+C1-B2 и т.д

А для расчета самого выражения и определения в нем ссылок на ячейки его предварительно нужно разложить на кирпичики...
Здесь уже синтаксическим анализатором представляешь все это в постфиксной форме(венгерской нотации) и вперед...
...
Рейтинг: 0 / 0
05.08.2005, 13:33
    #33204118
Эмулятор электронной таблицы
Типа на PERL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
#как бы лист
my %T= ( E1=>'A1+B2*C3',   A1=>'C3/2',   B2=>'A1*5',   C3=>'10' );
our @V=keys %T; #vertices
our %adj=(); #edges
foreach my $k (@V){
  my %w;
 @w{($T{$k} =~ m/([A-Z]\d+)/g)} = (); #выборка ячеек, от кот. зависит текущая
  $adj{$k}= keys %w; # финт для избавления от дубликатов
}
# топологическая сортировка
our ( $color, @order);
#поиск в глубину
map { $color{$_}= 0 } @V;
foreach  my $u(@V){
  DFS_VISIT($u) if($color{$u} ==  0 );
}

# собственно вычисления
for my $k (@order){
        my $expr = $T{$k} ;
        $expr =~ s/([A-Z]\d+)/$T{$ 1 }/ge;
        warn "EVAL: $k $expr";
        $T{$k} = eval ($expr);
}

use Data::Dumper;print Dumper(\%T); #как бы вывод результата

sub DFS_VISIT{
  my $u=shift;
  $color{$u}= 1 ;
  foreach my $v ( @{$adj{$u}}) { #проходим по соседним вершинам
        DFS_VISIT($v) if($color{$v} == 0 );
  }
  $color{$u}= 2 ;
  push @order, $u;
}
Типа результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
EVAL: C3  10  at a.pl line  22 .
EVAL: A1  10 / 2  at a.pl line  22 .
EVAL: B2  5 * 5  at a.pl line  22 .
EVAL: E1  5 + 25 * 10  at a.pl line  22 .
$VAR1 = {
          'C3' =>  10 ,
          'A1' => '5',
          'B2' =>  25 ,
          'E1' =>  255 
        };
...
Рейтинг: 0 / 0
05.08.2005, 14:33
    #33204320
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
Спасибо, то что нужно,
Ещё вопрос помогите составить регулярное выражение, что бы оно сопоставлялось строкам типа :
Например :
просто число 5
или формула 5*8
или
А1 * 5 + С2

Но не проходили строки "неправельные выражения" типа
A1+
или +А1 и т.д
...
Рейтинг: 0 / 0
05.08.2005, 14:37
    #33204328
Эмулятор электронной таблицы
GuestСпасибо, то что нужно,
Ещё вопрос помогите составить регулярное выражение, что бы оно сопоставлялось строкам типа :
Например :
просто число 5
или формула 5*8
или
А1 * 5 + С2

Но не проходили строки "неправельные выражения" типа
A1+
или +А1 и т.д
Нифига, регекспы здесь слегка не в тему.
нужен парсер алгебраических выражений (хотя бы примитивный).
...
Рейтинг: 0 / 0
05.08.2005, 15:00
    #33204407
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
дураг с инецеативой Guest
Нифига, регекспы здесь слегка не в тему.
нужен парсер алгебраических выражений (хотя бы примитивный).

Для вычесления выражения да согласен, а мне нужно допустим просто узнать является ли данная строка "правельным" выражением
...
Рейтинг: 0 / 0
05.08.2005, 15:11
    #33204430
Эмулятор электронной таблицы
Guest
Для вычесления выражения да согласен, а мне нужно допустим просто узнать является ли данная строка "правельным" выражением
Нифига, парсер все равно нужен, т.к. иначе хрен проверишь даже такую примитивную грамматику простых алгебр выражений:
Код: plaintext
1.
2.
3.
4.
5.
e : e '+' p | e '-' p |  '-' p | '+' p
p : t | p '*' t | p '/'  t
t : ident | float | '('  e ')'
float : \d+\.?\d*[eE][-+]?\d+  |  \d+\.?\d*
ident : [a-zA-Z][ 0 - 9 ]
...
Рейтинг: 0 / 0
05.08.2005, 15:47
    #33204529
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
А если есть условие,
только положительные целые числа , ссылки(A1) и знаки +, -, *, /.
Всё остальное не нужно.
...
Рейтинг: 0 / 0
05.08.2005, 15:58
    #33204560
Эмулятор электронной таблицы
GuestА если есть условие,
только положительные целые числа , ссылки(A1) и знаки +, -, *, /.
Всё остальное не нужно.
Код: plaintext
^\s*([A-Z][ 0 - 9 ]|\d+)(\s*[-+/*]\s*([A-Z][ 0 - 9 ]|\d+)\s*)*$
...
Рейтинг: 0 / 0
05.08.2005, 15:59
    #33204563
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
дураг с инецеативой GuestА если есть условие,
только положительные целые числа , ссылки(A1) и знаки +, -, *, /.
Всё остальное не нужно.
Код: plaintext
^\s*([A-Z][ 0 - 9 ]|\d+)(\s*[-+/*]\s*([A-Z][ 0 - 9 ]|\d+)\s*)*$


Спасибо!
...
Рейтинг: 0 / 0
05.08.2005, 16:25
    #33204649
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмулятор электронной таблицы
synapse

Еще кстати как расширение можно перед началом проходов упорядочить таблицу определенным образом, чтоб очередь меньше оказалась....
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@


Можно подробнее как упорядочить таблицу опредлённым образом?
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Эмулятор электронной таблицы / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]