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


A B C
1 5 8 A1*b2+c2

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

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

Не совсем понятно по поводу очереди ожидания, ведь ячейка может содержать не просто ссылку а выражение типа A2*B3+C1-B2 и т.д
...
Рейтинг: 0 / 0
Эмулятор электронной таблицы
    #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
Эмулятор электронной таблицы
    #33204103
synapse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest synapseЯ делал так:
Иду по порядку по всем полям и считаю если удалось посчитать то хорошо, если нет(есть ссылка на еще не посчитанное поле) то заношу в очередь ожидания и считаю дальше, когда дохожу до конца, то перехожу на очередь ожидания и теперь по ней циркулирую пока все ссылки не разрешатся...
Естественно надо добавить обработку cross cell reference...
Если не понятно расскажу подробнее...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@

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

А для расчета самого выражения и определения в нем ссылок на ячейки его предварительно нужно разложить на кирпичики...
Здесь уже синтаксическим анализатором представляешь все это в постфиксной форме(венгерской нотации) и вперед...
...
Рейтинг: 0 / 0
Эмулятор электронной таблицы
    #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
Эмулятор электронной таблицы
    #33204320
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, то что нужно,
Ещё вопрос помогите составить регулярное выражение, что бы оно сопоставлялось строкам типа :
Например :
просто число 5
или формула 5*8
или
А1 * 5 + С2

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

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

Для вычесления выражения да согласен, а мне нужно допустим просто узнать является ли данная строка "правельным" выражением
...
Рейтинг: 0 / 0
Эмулятор электронной таблицы
    #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
Эмулятор электронной таблицы
    #33204529
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если есть условие,
только положительные целые числа , ссылки(A1) и знаки +, -, *, /.
Всё остальное не нужно.
...
Рейтинг: 0 / 0
Эмулятор электронной таблицы
    #33204560
GuestА если есть условие,
только положительные целые числа , ссылки(A1) и знаки +, -, *, /.
Всё остальное не нужно.
Код: plaintext
^\s*([A-Z][ 0 - 9 ]|\d+)(\s*[-+/*]\s*([A-Z][ 0 - 9 ]|\d+)\s*)*$
...
Рейтинг: 0 / 0
Эмулятор электронной таблицы
    #33204563
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дураг с инецеативой GuestА если есть условие,
только положительные целые числа , ссылки(A1) и знаки +, -, *, /.
Всё остальное не нужно.
Код: plaintext
^\s*([A-Z][ 0 - 9 ]|\d+)(\s*[-+/*]\s*([A-Z][ 0 - 9 ]|\d+)\s*)*$


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

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


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


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