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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ static_cast http://www.cyberforum.ru/cpp-beginners/thread282506.html
В чем ошибка. ругается на < и ( в строке newpound=static_cast<int>(newpound); #include <iostream.h> #include <conio.h> int main() { clrscr(); float newpound=3.51; newpound=static_cast<int>(newpound); cout<<newpound<<endl; return 0;
C++ Графы. Поиск в ширину. вот поиск в ширину (выводит кратчайший путь из вершины first в вершину last) : #include <iostream> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <time.h> using namespace std; http://www.cyberforum.ru/cpp-beginners/thread282502.html
C++ Строки на С
Дан текстовый файл. Удалить из него первую и последнюю строку. Program A1; Uses crt; Var s:array of integer; I,j,k,l,n:integer; f,g: text; begin clrscr; assign (g,’RSP.txt’); reset (f);
C++ Определитель квадратной матрицы
Вычислить определитель квадратной целочисленной матрицы.
C++ 22. Распечатать строки, в которых имеются одинаковые соседние элементы. http://www.cyberforum.ru/cpp-beginners/thread282477.html
Вводится текст с клавиатуры.Распечатать строки, в которых имеются одинаковые соседние элементы.
C++ Строки Даны целые число написать их в обратном порядке Program 1 Var l, i, j, k, n:integer; s, s1:string; begin write(‘s=’); readln(s); for i:=1 to length(s) do подробнее

Показать сообщение отдельно
Temirlan90
 Аватар для Temirlan90
131 / 131 / 8
Регистрация: 30.09.2010
Сообщений: 333
24.04.2011, 16:07     Левая рекурсия.
Левая рекурсия
(Время: 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-й тест такой же как и в примере.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 07:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru