Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
1

Подсчет скобок

09.12.2015, 09:24. Показов 1033. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, помогите пожалуйста написать код для программы «Символы» на языке LISP

Нужно чтобы программа читала листинг другого языка, например C# и могла сосчитать в нем все фигурные скобки - сколько { и сколько }, и сравнить их.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2015, 09:24
Ответы с готовыми решениями:

Подсчет скобок в тексте
проверить, имеется ли в заданном тексте баланс открывающих и закрывающих круглых скобок. Помогите...

Подсчет количества парных скобок
Написать программу, которая сравнивает в строке между собой количество левых и правых парных...

Ввод из файла, подсчет количества открывающих и закрывающих скобок
Задача этого куска посчитать количество открывающих и закрывающих скобок. Проблема в том, что он он...

Подсчёт количества круглых скобок в строке с помощью StringBuilder
using System; namespace cyber1 { class Program { static void Main() { ...

18
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
09.12.2015, 09:45 2
Могу на HomeLisp
0
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
09.12.2015, 09:50  [ТС] 3
Пожалуйста, помогите

Добавлено через 1 минуту



Кликните здесь для просмотра всего текста
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
{
    class Program
    {
        private const int FIELDWIDTH = 4;
        static void Main(string[] args)
        {
 
            char[,] MyField = new char[FIELDWIDTH, FIELDWIDTH];
            FillField(ref MyField);
            ShowField(MyField, "Initial field");
            Console.ReadKey();
            Rotate2x2Block(2, 2, ref MyField);
            ShowField(MyField, "Rotated 3,3");
            Console.ReadKey();
            //Ищем и поворачиваем
            byte blockToRotateLine;
            byte blockToRotatePos;
            UInt64 iteractonNo = 0;
            while (FindBlock2x2ToRotate(MyField, out blockToRotateLine, out blockToRotatePos))
            {
                iteractonNo++;
                Rotate2x2Block(blockToRotateLine, blockToRotatePos, ref MyField);
                Thread.Sleep(500);
                ShowField(MyField, String.Format("Rotated {0},{1}; Iteraction #{2}", blockToRotateLine + 1, blockToRotatePos + 1, iteractonNo));
            }
 
 
 
        }
 
        private static bool FindBlock2x2ToRotate(char[,] field, out byte Line, out byte Pos)
        {
            byte correctOrder = 0; // Определяет корректный порядковый номер текущего символа по перебору
            byte b;
            byte tempLine =0, tempPos =0;
            for (b=(byte)'A';  b <= (byte)'P'; b++)
            {
                FindSymbolPositionInField(field, (char)b, out tempLine, out tempPos);
                byte currentSymbolOrderNo = (byte)( tempLine * FIELDWIDTH + tempPos);
                if ( currentSymbolOrderNo != correctOrder )
                {
                    bool lineMoved = false;
                    bool posMoved = false;
                    if (tempLine > 0) //Попробуем сдвинть квадрат вверх, если возможно
                    {
                       
                        if ((field [tempLine-1,tempPos] > b) && (field[tempLine - 1, tempPos + (tempPos == FIELDWIDTH -1?-1:+1)] > b)) { // Если выше сверху или выше слева (если у правой стенки) и выше справа (если не у правой стенки) нет более ранних букв, то сдвинем квадрат вверх
                            tempLine--;
                            lineMoved = true;
                        }
                       
                    }
                    if (tempPos > 0) //Попробуем сдвинть квадрат влево, если возможно
                    {
                        if (field[tempLine,tempPos -1] > b) //Если слева нет более раннего символа, сдвинем влево
                        {
                            tempPos--;
                            posMoved = true;
                        }
                    }
 
                    if (posMoved && lineMoved)
                    {
                        Console.WriteLine("Ignoring {0} because nowhere to move", (char)b);
                    }
 
 
                    if ((tempLine == FIELDWIDTH - 1) || (tempPos == FIELDWIDTH - 1))
                    {
                        Console.WriteLine("Ignoring to rotate {0} due to position", (char)b);
                        continue;
                    } else
                    {
                        Console.WriteLine("Rotation found for {0}", (char)b);
                        Line = tempLine;
                        Pos = tempPos;
                        return true;
                    }
                } else
                {
                    Console.WriteLine("{0} is at correct position", (char)b);
                }
                correctOrder++;
            }
            Line = 0;
            Pos = 0;
            if ((b == (byte)'P') && (!(tempLine == FIELDWIDTH -1) && (tempPos == FIELDWIDTH - 1)) ) // Если мы на букве P, и X и Y у нас не максимум, значит задачка нерешаема
            {
                throw new Exception("UNABLE TO COMPLETE!");
            }
            return false;
        }
 
        private static void FindSymbolPositionInField(char [,] field, char symbol, out byte Line, out byte Pos)
        {
            for (byte i = 0; i < FIELDWIDTH; i++)
            {
                for (byte j = 0; j < FIELDWIDTH; j++)
                {
                    if (field[i,j] == symbol)
                    {
                        Line = i;
                        Pos = j;
                        return;
                    }
                }
            }
            throw new Exception("Not found");
        }
 
        private static void Rotate2x2Block(byte Line, byte Pos, ref char[,] field)
        {
            char temp; //Временная переменая для храненияы
            temp = field[Line, Pos]; //Сохраняем верхний левый
            field[Line, Pos] = field[Line + 1, Pos]; //Верхний левый = нижний левый
            field[Line + 1, Pos] = field[Line + 1, Pos + 1 ]; // нижний левый = нижний правый
            field[Line +1 , Pos +1 ] = field[Line , Pos + 1]; // Нижний правый = верхний правый
            field[Line, Pos + 1] = temp; // Верхний правый  = временная
        }
 
        private static void ShowField(char[,] field, string comment)
        {
            Console.Clear();
            Console.WriteLine(comment);
            Console.WriteLine();
            for (int i = 0; i < FIELDWIDTH; i++)
            {
                for (int j = 0; j < FIELDWIDTH; j++)
                {
                    Console.Write("{0}\t", field[i, j]);
                }
                Console.WriteLine();
            }
        }
 
        private static void FillField(ref char[,] field)
        {
            //Создаем набор символов
            List<char> symbols = new List<char>();
            for (byte i = (byte)'A';i <= (byte)'P';i++)
            {
                symbols.Add((char)i);
            }
 
            //Старуем рандом
            Random rnd = new Random();
 
            //Заполняем поле
            int lineNo = 0;
            int symNo = 0;
            while (symbols.Count > 0)
            {
                int pos = rnd.Next(0, symbols.Count - 1);
                Console.WriteLine("Getting symbol from position {0}, total is {1}",pos,symbols.Count);
                char sym = symbols[pos];
                Console.WriteLine("Adding symbol {0} to line {1} position {2}", sym, lineNo, symNo);
                field[lineNo, symNo] = sym;
                symbols.Remove(sym);
               
                symNo++;
                //Переходим на строку
                if (symNo == ( FIELDWIDTH) )
                {
                    symNo = 0;
                    lineNo++;
                }
            }
        }
       
    }
}

Добавлено через 24 секунды
Листинг языка C# который можно использовать
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
09.12.2015, 12:14 4
В последней версии HomeLisp это будет примерно так:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun par-counter (fname)
  (let ((lpar 0)
        (rpar 0)
        (dq   nil)
        (co   nil)
        (p    ""))
   (iter (for stri in-file fname)
     (setq co nil p "")
     (iter (for s in-string stri)
        (cond ((and (not dq) (not co) (eq s "{")) (setq lpar (+ 1 lpar)))
              ((and (not dq) (not co) (eq s "}")) (setq rpar (+ 1 rpar)))
              ((and (not dq) (not co) (eq s (strChr 34))) (setq dq (not dq)))
              ((and (not dq) (eq s "/") (eq p "/")) (setq co t)))
        (setq p s)))      
    (prints "к-во { =")
    (print lpar)
    (prints " к-во } =")
    (printline lpar)
    'OK))
Но имей в виду, что этот код считает только синтаксически значимые скобки (скобки, содержащиеся внутри строковых констант и комментариев не учитываются). Если нужно тупо считать все, то будет еще проще.
1
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
09.12.2015, 12:20  [ТС] 5
Catstail, В какой части когда вставлять листинг др. кода?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
09.12.2015, 12:28 6

Не по теме:

Гусары, молчать!!!



Листинг берется из файла, его имя - параметр функции
0
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
09.12.2015, 12:33  [ТС] 7
(setq co nil p "") - где "" - путь к файлу с кодом?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
09.12.2015, 14:20 8
путь к файлу - fname
0
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
09.12.2015, 14:29  [ТС] 9
Вам, наверно может показаться что я шучу, но к сожалению я действительно не понимаю что это значит :

есть две функции fname

(defun par-counter (fname) - мне тут нужно стереть слово fmane и написать условно C:\1.txt?

(iter (for stri in-file fname) - следовательно тот же самый вопрос. как и с первой функцией.

Просьба объясните как ему показать где файл лежит и как правильно задать ему читаемый путь.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
09.12.2015, 14:55 10
Цитата Сообщение от Interactive Посмотреть сообщение
есть две функции fname
- нет ни одной функции fname, есть аргумент fname у функции par-counter.

Нужно:

1) загрузить код функции par-counter в HomeLisp
2) создать в текущей директории HomeLisp файл с кодом c# (111.cs)
3) вызвать функцию par-counter

Lisp
1
(par-counter "111.cs")
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
09.12.2015, 15:42 11
Цитата Сообщение от Interactive Посмотреть сообщение
мне тут нужно стереть слово fmane и написать условно C:\1.txt?
в строке "static void main(String[] args)" вместо args тоже надо писать условно "c:\\1.txt"?
1
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
09.12.2015, 17:17  [ТС] 12
Catstail, Внутри LET: EVFUN: Не найдена функция ITER
==> ERRSTATE
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
09.12.2015, 17:37 13
Interactive, старый Homelisp. Датчик температуры на HomeLisp - здесь выложена более свежая версия.
0
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
09.12.2015, 19:10  [ТС] 14
(par-counter "C:\HomeLisp\1.cs")
к-во { =3 к-во } =3

==> OK

;; Утилизировано ячеек: 0; атомов: 239.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
10.12.2015, 10:00 15
Interactive, вот этот:

Lisp
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
(defun par-counter (fname)
  (let ((lpar 0)
        (rpar 0)
        (dq   nil)
        (co   nil)
        (p    ""))
   (iter (for stri in-file fname)
     (setq co nil p "")
     (iter (for s in-string stri)
        (cond ((and (not dq) (not co) (eq s "{")) (setq lpar (+ 1 lpar)))
              ((and (not dq) (not co) (eq s "}")) (setq rpar (+ 1 rpar)))
              ((and (not co) (eq s (strChr 34))) (setq dq (not dq)))
              ((and (not dq) (eq s "/") (eq p "/")) (setq co t)))
        (setq p s)))      
    (prints "к-во { =")
    (print lpar)
    (prints " к-во } =")
    (printline lpar)
    'OK))
 
(par-counter "c#.txt")
 
к-во { =28 к-во } =28
 
==> OK
2
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
10.12.2015, 10:34  [ТС] 16
Да, все получилось. Он посчитал, получилось 28 скобок и { и }

Но если я убираю например три скобки } и вызываю функцию снова, то он все равно считает по 28 и тех и тех.
Если я убираю 3-и скобки и { и }, то он убирает общее кол-во. т.е. итого получается 25 и тех и тех.

А можно добавить, чтобы система сообщала в виде ошибки (информационном сообщении) если скобок не равно?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
10.12.2015, 11:18 17
Цитата Сообщение от Interactive Посмотреть сообщение
Но если я убираю например три скобки } и вызываю функцию снова, то он все равно считает по 28 и тех и тех.
- мне стыдно... В строке 18 нужно печатать не lpar, а rpar:


Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(defun par-counter (fname)
  (let ((lpar 0)
        (rpar 0)
        (dq   nil)
        (co   nil)
        (p    ""))
   (iter (for stri in-file fname)
     (setq co nil p "")
     (iter (for s in-string stri)
        (cond ((and (not dq) (not co) (eq s "{")) (setq lpar (+ 1 lpar)))
              ((and (not dq) (not co) (eq s "}")) (setq rpar (+ 1 rpar)))
              ((and (not co) (eq s (strChr 34))) (setq dq (not dq)))
              ((and (not dq) (eq s "/") (eq p "/")) (setq co t)))
        (setq p s)))      
    (prints "к-во { =")
    (print lpar)
    (prints " к-во } =")
    (printline rpar) ;; !!!!!!!!
    'OK))
1
castorsky
10.12.2015, 14:54
  #18

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
мне стыдно
Ерунда, обычное каждодневное дело.

0
1 / 1 / 0
Регистрация: 05.12.2015
Сообщений: 18
12.12.2015, 20:45  [ТС] 19
Все получилось! Огромное спасибо Вам!!!!!
0
12.12.2015, 20:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2015, 20:45
Помогаю со студенческими работами здесь

Проверить правильность расстановки в строке скобок (баланс открывающих и закрывающих скобок)
помогите с решением задачи. Запросить у пользователя ввод значений согласно варианту. Выполнить...

Вывести все корректные комбинации пар круглых скобок, которые можно сформировать из n скобок
Вывести все корректные комбинации пар круглых скобок, которые можно сформировать из n скобок,...

Внести произвольный текст. Проверить в заданном тексте количество открытых скобок равно числу закрытых скобок
Внести произвольный текст. Проверить в заданном тексте количество открытых скобок равно числу...

Ввести произвольный текст. Проверить, в заданном тексте количество открытых скобок равно количеству закрытых скобок.
Помогите сделать задачу: Ввести произвольный текст. Проверить, в заданном тексте количество...

Удалить часть текста, заключённую в скобки вместе со скобками. Внутри каждой пары скобок нет других скобок.
1. Удалить часть текста, заключённую в скобки вместе со скобками. Внутри каждой пары скобок нет...

1.В заданном предложении проверить парность расстановки круглых скобок. Вложение скобок допускается. 2. Заданы два массива A и B одинаковой размерност
1.В заданном предложении проверить парность расстановки круглых скобок. Вложение скобок...


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

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