Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Temirlan90
132 / 132 / 8
Регистрация: 30.09.2010
Сообщений: 333
#1

Левая рекурсия. - C++

24.04.2011, 16:07. Просмотров 3374. Ответов 4
Метки нет (Все метки)

Левая рекурсия
(Время: 1 сек. Память: 16 Мб Сложность: 20%)

В теории формальных грамматик и автоматов (ТФГиА) важную роль играют так называемые контекстно-свободные грамматики (КС-грамматики). КС-грамматикой будем называть четверку, состоящую из множества N нетерминальных символов, множества T терминальных символов, множества P правил (продукций) и начального символа S, принадлежащего множеству N.

Каждая продукция p из P имеет форму A –> a, где A нетерминальный символ (A из N), а a – строка, состоящая из терминальных и нетерминальных символов. Процесс вывода слова начинается со строки, содержащей только начальный символ S. После этого на каждом шаге один из нетерминальных символов, входящих в текущую строку, заменяется на правую часть одной из продукций, в которой он является левой частью. Если после такой операции получается строка, содержащая только терминальные символы, то процесс вывода заканчивается.

Во многих теоретических задачах удобно рассматривать так называемые нормальные формы грамматик. Процесс приведения грамматики к нормальной форме часто начинается с устранения левой рекурсии. В этой задаче мы будем рассматривать только ее частный случай, называемый непосредственной левой рекурсией. Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.

Задана КС-грамматика. Требуется Найти количество правил, содержащих непосредственную левую рекурсию.
Входные данные

Первая строка входного файла INPUT.TXT содержит количество n (1 <= n <= 1000) правил в грамматике. Каждая из последующих n строк содержит по одному правилу. Нетерминальные символы обозначаются заглавными буквами латинского алфавита, терминальные - строчными. Левая часть продукции отделяется от правой символами –>. Правая часть продукции имеет длину от 1 до 30 символов.
Выходные данные

В выходной файл OUTPUT.TXT выведите ответ на задачу.
Пример
INPUT.TXT
3
S->Sabc
S->A
A->AA
OUTPUT.TXT
2
Условие запутанное в хлам...! Даже не знаю с какой стороны подойти...дайте подсказку, а дальше Я Сам. =)

Добавлено через 35 минут
Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.
Это и есть решение к задаче!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>  
using namespace std;  
int main() {    
    freopen("INPUT.TXT", "r", stdin);
    freopen("OUTPUT.TXT", "w", stdout);
    int n, k = 0;
    char s1[1000];
    cin >> n;
    for(int i = 0; i < n + 1; ++i) {        
        cin.getline(s1, 1000);
        for(int j = 0; j < 999; ++j)
            if(s1[0] == 'A')            
                if(s1[j + 1] == 'A') 
                    k++;
    }
    cout << k;
    return 0;  
}
Но он у Меня ругается на 1 тест, хотя 1-й тест такой же как и в примере.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2011, 16:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Левая рекурсия. (C++):

Правая и левая производная - C++
Помогите сделать задачу. Необходимо посчитать правую и левую производную для какой-либо функции на отрезке h.

Конец файла обнаружен раньше, чем левая { скобка - C++
Помогите исправить программу так,чтобы она работала. ( Программа для перевода числа в письменный вид) #include &lt;iostream&gt; #include...

Если в строке левая и правая скобки идут рядом, удалить их из строки - C++
Сгенерировать строку, длиной в 256 символов, которая состоит из случайной последовательности скобок разных видов: круглых, квадратных и...

fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка '{' - C++
#include &lt;stdio.h&gt; int main(void) { int mas; for (int i=0; i&lt;10; i++) for (int j=0; j&lt;10; j++) scanf(&quot;%d&quot;, &amp;mas); ...

Даны числа x, y, x1, y1, x2, y2. Проверить истинность высказывания: «Точка с координатами (x, y) лежит внутри прямоугольника, левая верхняя вершина ко - C++
Даны числа x, y, x1, y1, x2, y2. Проверить истинность высказывания: «Точка с координатами (x, y) лежит внутри прямоугольника, левая верхняя...

Найти 15 первых натуральных чисел, делящихся нацело 19 и находящихся в интервале , левая граница которого равна 100. - C++
Найти 15 первых натуральных чисел, делящихся нацело 19 и находящихся в интервале , левая граница которого равна 100. Привет всем вот мой...

4
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.04.2011, 17:34 #2
Условие запутанное, но решается элементарно.
Просто считываешь n раз строчки, если 1й символ строки совпадает с 4м, то увеличиваешь количество левых рекурсий на одну.
Если не получается, вот готовый код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int a,c=0,i;
char s[35];
scanf("%i",&a);
for (i=0; i <a; i++) {
scanf("%s",&s);
if (s[0]==s[3]) c++;
}
printf("%i",c);
return 0;}
2
Temirlan90
132 / 132 / 8
Регистрация: 30.09.2010
Сообщений: 333
24.04.2011, 18:28  [ТС] #3
если 1й символ строки совпадает с 4м, то увеличиваешь количество левых рекурсий на одну.
diagon, глупый вопрос, но как Вы догадались? =)
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.04.2011, 18:46 #4
Цитата Сообщение от Temirlan90 Посмотреть сообщение
Говорят, что правило вывода A –> R содержит непосредственную левую рекурсию, если первым символом строки R является A.
Это и есть решение к задаче!!!
Ну как бы A-первый символ, R начинается с 4го символа...
Если первый символ равен четвертому(A=R), то это левая рекурсия.
0
Temirlan90
132 / 132 / 8
Регистрация: 30.09.2010
Сообщений: 333
24.04.2011, 18:56  [ТС] #5
Ясно...Я думал несколько иначе. Думал что количество 'A' и есть решение. С условием что первый символ 'A' =)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2011, 18:56
Привет! Вот еще темы с ответами:

6.34. Найти 15 первых натуральных чисел, делящихся нацело на 19 и нахо-дящихся в интервале, левая граница которого равна 100 - C++
6.34. Найти 15 первых натуральных чисел, делящихся нацело на 19 и нахо-дящихся в интервале, левая граница которого равна 100

Ошибка при реализации бинарного дерева: error C1075: конец файла обнаружен ранее, чем левая фигурная скобка - C++
Почему выскакивает ошибка? Вроде все правильно. error C1075: конец файла обнаружен ранее, чем левая фигурная скобка &quot;{&quot; в...

Конец файла обнаружен ранее, чем левая фигурная скобка "{" - C++
Помогите,не могу найти ошибку....#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; int word(char a1) {int b=0; char...

конец файла обнаружен ранее, чем левая фигурная скобка "{" - C++
все функции работают нормально так как тестил без последней, эта последняя, и с ней вылазиет ошибка, подскажите как испрвить ...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
24.04.2011, 18:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru