Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 17
1

Проверка на зацикленность

28.08.2015, 17:19. Показов 1514. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть таблица например 4*3, в ней каждая ячейка может ссылаться на любую другую в которой есть число или ссылка на другую ячейку например ячейка A1 может ссылаться на B1 в которой может быть ссылка на С1. В итоге нужно выйти на число или получить ошибку если ссылка например на ячейку с текстом. С этим разобрался, единственное это ситуация когда A1=>B1=>C1=>A1. Тогда проверка происходит бесконечно, как найти такие зацикленности?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2015, 17:19
Ответы с готовыми решениями:

Зацикленность коллекции
Пожалуйста, помогите! Уже голову сломал, напишите пример как в коллекции найти зацикленность!!

Исправте зацикленность
Дано два одноизмерных массива x и y, ult i=1,2,... n. В массиве x задано стаж работников...

Зацикленность условия if else
Есть условная конструкция типа: if (ui->codeArea->toPlainText() == '{') else if...

Определить зацикленность списка
Здравствуйте уважаемые форумчане. Задали мне на экзамене вопрос, что надо написать функцию, которая...

5
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
28.08.2015, 17:23 2
Отслеживать повтор ячейки.
0
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 17
28.08.2015, 17:24  [ТС] 3
Отслеживал, работает не корректно так как могут быть выражения типа A1+B1-C1/5
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
28.08.2015, 17:34 4
Цитата Сообщение от vik_tor Посмотреть сообщение
A1+B1-C1/5
В данной строке нет повторов. В чем не корректность?

Добавлено через 33 секунды
Покажите код так проще понять.
0
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 17
28.08.2015, 17:48  [ТС] 5
Возможно я не понял как отслеживать, я делал так все ячейки которые ссылаются добавлял в очередь и по очереди их проверял, если ячейка получала конечные данные или ошибку я удалял ее из очереди, если нет то удалял и потом добавлял в конец очереди, каждой ячейке я добавил строку где записывал индекс ячейки с которой была ссылка, если эта строка пустая, и если не пустая то это значение передавал дальше, в итого если есть цикл то строка придет в исходную ячейку. Но например если очередь пройдет по кругу 3 раза, первая ячейка передаст свой индекс, дальше следующая ячейка ссылается на 2 ячейки одна из которых самая первая, покажет что цикл хотя есть решение

C#
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  void FindDigitd(Queue<KeyValuePair<string, DataType>> queue)
        {
            DataType val = new DataType();
            DataType tempVal = new DataType();
            string [] findDig;
            string s = "";
            Regex regexExpression = new Regex(@"^((?:((-?\d+)(,\d+)?)+[*+/-])+((-?\d+)(,\d+)?)+)|^(-?\d+)(,\d+)?$");
            Regex error = new Regex(@"^#");
            
            for (; queue.Count > 0; )
            {
                val = queue.Peek().Value;
                findDig = SplitString(val.text.Remove(0, 1));
                string keyText = @"\b" + queue.Peek().Key;
                Regex keyReg = new Regex(keyText);
 
                for (int i = 0; i < findDig.Length; i++)
                {
                    if (SpreadSsheet.data.TryGetValue(findDig [i], out tempVal))
                    {
                        if(keyReg.IsMatch(keyText))
                        {
                            Console.WriteLine(keyText +": "+ queue.Peek().Key + " - LOOP");
                            s = "#LOOP";
                            break;
                        }
                        else if (tempVal.isEmpty)
                        {
                            s = "#EMPTY";
                            break;
                        }
                        else if (tempVal.isString)
                        {
                            s = "#TEXT";
                            break;
                        }
                        else if (tempVal.isError)
                        {
                            s = "#ERROR";
                        } 
                        
                        else if (tempVal.isDigit)
                        {
                            findDig [i] = tempVal.decNum.ToString();
                            s += findDig [i];
                        }
                        else
                        {
                            s += findDig [i];
                            if (val.checkedFrom == "")
                            {
                               tempVal.checkedFrom = queue.Peek().Key;
                            }
                            else
                            {
                                tempVal.checkedFrom = val.checkedFrom;
                            }
                        }
                    }
                    else
                    {
                        s += findDig [i];
                    }
 
                }
                if (regexExpression.IsMatch(s))
                {
 
                    string [] f = SplitString(s);
                    SpreadSsheet.data [queue.Peek().Key].decNum = Calculation(f);
                    SpreadSsheet.data [queue.Peek().Key].text = SpreadSsheet.data [queue.Peek().Key].decNum.ToString().Replace(',', '.');
                    SpreadSsheet.data [queue.Peek().Key].isDigit = true;
                    queue.Dequeue();
                    s = "";
                }
                else if (error.IsMatch(s))
                {
                    SpreadSsheet.data [queue.Peek().Key].text = s;
                    SpreadSsheet.data [queue.Peek().Key].isError = true;
                    queue.Dequeue();
 
                }
                else
                {
                    KeyValuePair<string, DataType> temp = queue.Peek();
                    queue.Dequeue();
                    queue.Enqueue(temp);
                    s = "";
                }
            }
        }
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.08.2015, 19:54 6
vik_tor,
1) Строим матрицу смежности для графа.
2) Проверяем диагонали графа, если отлично от 0, значит есть цикл.
3) Возводим матрицу смежности в степень 2,3,4... и переходим к пп 2, пока матрица не станет нулевой.
1
28.08.2015, 19:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2015, 19:54
Помогаю со студенческими работами здесь

Как убрать зацикленность слайдера?
Помогите, пожалуйста немного исправить слайдер. Он крутит блоки зациклено, а нужно, чтобы на...

Починка программы Зацикленность Repeat
Во время роботы программа повторяет бесконечный цикл, нужна помощь в решении этой проблемы. Первая...

Связный список, поиск вхождений, зацикленность
Надо найти входит ли один список в другой, но функция циклится, не пойму, как это обойти bool...

Вывод ветки / дерева категорий контента, зацикленность
Здравствуйте БД в таком виде. Там категории и ссылки на родителей при редактировании категории...

Что быстрее, проверка на null, или проверка на тип перечисления в запросе?
вопрос такой. если несколько таблиц. сходных по структуре в запросе. в первой таблице ...

Проверка кода и советы по его улучшению. Генерация случайных чисел и проверка на уникальность
Привет народ! Занимаюсь изучением Java, захотелось реализовать выборку случайных чисел для лотереи....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru