singlepost

Определить, является ли введённая строка символов правильной записью формулы << На главную или назад  

Ребят!!!!Пожалуйста помогите!!!!
мне нужно сделать программу, условие которой:
Определить, является ли введённая строка символов правильной записью формулы.Но у меня ничего не выходит!!!Объясните как это сделать пожалуйста!!!!Формула имеет следующий вид:
<формула>::=<цифра>|(<форумла><знак><форумла>
<знак>::=+|-|*
<цифра>::=|0|1|2|3|4|5|6|7|8|9

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

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

#if 0
<F>::=<T><PMT>
<PMT>::=<PM><T><PMT>|e
<T>::=<E><UDE>
<UDE>::=<UD><E><UDE>|e
<PM>::=+|-
<UD>::=*|/
<E>::=<PE>^<E>|<PE>
<PE>::=-<PE>|<OPE>
<OPE>::<F>|<N>
<N>::=<D><N>|<D>
<D>::|1|2|3|4|5|6|7|8|9
#endif

char *infix,*postfix;

void error() {
throw 0;
}

void F(); void T(); void PMT(); void UDE(); void E(); void PE(); void OPE(); void N();

void Add(char c) {
*postfix++=c;
*postfix++=' ';
}

void main() {
infix="(1-2-3-3*4/5)^-6";
printf("%s\n",infi;
char buf[1024];
postfix=buf;
try {
F();
if (*infi error();
}
catch(…) { printf("error\n"; getch(); return; }
*postfix;
printf("%s\n",buf);
getch();
}

void F() {
T();
PMT();
}

void PMT() {
char s=*infix;
if (s=='+'||s=='-') {
infix++;
T();
Add(s);
PMT();
}
}

void T() {
E();
UDE();
}

void UDE() {
char s=*infix;
if (s=='*'||s=='/') {
infix++;
E();
Add(s);
UDE();
}
}

void E() {
PE();
char s=*infix;
if (s=='^') {
infix++;
E();
Add(s);
}
}

void PE() {
char s=*infix;
if (s=='-') {
infix++;
PE();
Add('~');
}
else OPE();
}

void OPE() {
if (*infix=='(') {
infix++;
F();
if (*infix!=')') error();
infix++;
}
else N();
}

void N() {
if (!isdigit(*infi) error();
*postfix++=*infix++;
while(isdigit(*infi) *postfix++=*infix++;
*postfix++=' ';
}

24 ответов в теме “Определить, является ли введённая строка символов правильной записью формулы”

  1. 24
    Михаил Воробьев ответил:

    Код бредовый, честно.
    Делается это одной рекурсивной функой
    Алгоритм могу подсказать если еще нада

  2. 23
    Андрей Кадацкий ответил:

    если правильно задать запрос в поисковике то можно много интересного найти…например задание №8 тут:
    //guap.ru/dept04/caf46/textbooks/pro/index2.8.htm
    или №11 тут:
    //dvo.sut.ru/libr/cvti/i097iluh/1.htm

  3. 22
    Артём Шалхаков ответил:

    Пару месяцев назад я решал точно такую же задачу.

    Преподы, оказывается, тоже не прочь списать друг у друга. :)

  4. 21
    Дмитрий Гайдамович ответил:

    2 Дашулька ~♥~SweeT~♥~PupS~ Маркова:

    Приведенный пример делает немного другое: он пытается преобразовывать инфиксную запись в постфиксную. После исправления опечаток он работает, хотя, разумеется, некорректно. То же, что требуют от тебя, гораздо проще: ничего не нужно преобразовывать. Нужно, просканировав входную последовательность, дойти до первой ошибки или же до конца строки, заключив, что ошибок нет.

    Метода построения программы такая. Для каждого символа в угловых скобочках делаешь функцию, как это сделано в твоём примере. Ну, например, для <формула> – void formula() … и т. д. Эти символы задают составные понятия.

    Что такое составные понятия. Составные понятия – это те, которые "раскрываются" в виде набора альтернатив (или-или), каждая из которых представляет собой последовательность понятий, а те, в свою очередь, так же могут быть составными. Ещё бывают элементарные понятия, неделимые. Например, цифра. Или знак. Всё просто.

    Твоя программа берёт входные символы (например, из некоторой строчки), при этомвызываются функции, соответствующие составным понятиям. Внутри себя эти функции перебирают альтернативы для составных понятий, для каждой из альтернатив обрабатывая входящие в неё понятия и так далее, рекурсивно для составных, а если "наткнулись" на элементарный символ, проверяем, подходит ли он нам (в вашем примере это isdigit() и всякие там if ((s=='*') || … )Такова идея метода рекурсивного спуска.

    Какие тут проблемы.

    Проблема номер 1: бесконечная рекурсия. Ну действительно, если функция formula() первым делом вызовет фунцию formula(), то вот вам она, пожалуйста – бесконечная рекурсия.

    Проблема номер 2: как остановиться, когда наткнулись на "неправильный" символ?

    Если ты действительно хочешь поразбираться, то ты найдёшь решения этих проблем. Ключевые слова: рекурсивный спуск, БНФ, грамматики, анализаторы, п. 3.1 книжки Страуструпа (где про калькулятор).

    Ну а то, что здесь говорят крутые парни про качество кода- это всё правильно они говорят. У программистов вообще заведено так: материться и отрывать друг другу яйца за плохой код. В нашем бизнесе выживают только сама понимаешь кто. Только реально крутые парни. Без вопросов.

    Кстати, насчёт пробелов, скобочек, деления на ноль. Даша, этого в голову не бери, этого у тебя в задании нет.

  5. 20
    Андрей Кадацкий ответил:

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

  6. 19
    Леонид Максимов ответил:

    Дашулька, прочитайте про BNF (//en.wikipedia.org/wiki/Backus–Naur_Form) и Yacc (//en.wikipedia.org/wiki/Yacc). Возможно даже зачет сдадите.

  7. 18
    Андрей Кадацкий ответил:

    попробуй посмотреть
    //www.delphikingdom.com/asp/viewitem.asp?catalo...
    там все подробно расписанно, только примеры на делфи.

  8. 17
    Дарья Маркова ответил:

    а в C++ вообще кто-нибудь разбирается??о_О

  9. 16
    Вовчик Беликов ответил:

    приходи ко мне…хотя не..
    пригласите её кто-нибудь на НГ

  10. 15
    Вовчик Беликов ответил:

    деление на 0 учти

  11. 14
    Дарья Маркова ответил:

    видимо я неодаренный ребенок……и нифига не понимаю……я уже практически смерилась с мыслей что нифига мне зачета не светит…и проведу нг дома в обнимку с подушкой………

  12. 13
    Жека Кирпичев ответил:

    Так.. Объясняю.

    Подумай, как ты *сама*, глядя на формулу, определяешь, правильная она или нет?
    В-нулевых, ты не обращаешь внимания на пробелы между цифрами и знаками.
    Во-первых, смотришь, нет ли в ней очевидных глупостей, типа "знак операции, после которого нет цифры".
    Во-вторых, смотришь, есть ли у каждой открывающей скобки парная закрывающая.

    Мне кажется, что этого достаточно, чтобы написать *проверщик* формул (но не калькулятор). Попробуй это реализовать; а если придумаешь еще какой-то случай неправильных формул, то реализуй и его. (Например, формула не должна быть пустой).

    Вопросы?

  13. 12
    Антон Кононов ответил:

    фигасебе я ниче не понял.
    вопрос: кто писал код в котором теперь разбирается Дашулька?

  14. 11
    Дарья Маркова ответил:

    я просто прошу чтобы мне помогли…а не чтобы решили…..мне просто надо чтобы мне объяснили…

  15. 10
    Дарья Маркова ответил:

    препод вроде………хотя точно сказать не могу…

  16. 9
    Вовчик Беликов ответил:

    жесть)))
    интересно админы это на башорг уже выкинули??

  17. 8
    Дарья Маркова ответил:

    не видать мне зачет……….

  18. 7
    Жека Кирпичев ответил:

    Еб твою мать! Не удаляю тему только для того, чтобы люди могли полюбоваться на это чудо (код).
    Прямо вспоминаются слова Чарльза Бэббиджа:
    I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a code (цитата изменена в соответствии с ситуацией)

    Передай человеку, который ЭТО писал, что ему надо оторвать яйца.
    И – ни один нормальный препод не поставит за ЭТО зачет.
    Разбирайся с С++ и пиши самостоятельно. Ты в универ пришла чтобы чему-то научиться или чтобы обманывать преподавателей, сдавая сделанное другими говно?
    На любые *конкретные* вопросы (в противовес самоуничижительной истерике) тебе тут ответят с радостью.

  19. 6
    Vlad Ламбар ответил:

    с физиологической точки зрения – это невозможно.

    Господи, ну и код О_о

  20. 5
    Дарья Маркова ответил:

    Для меня это не возможно….=((поэтому обратилась за помощью….

  21. 4
    Дарья Маркова ответил:

    ну я прошу просто помочь……у меня мозг кипит……..

  22. 3
    Дарья Маркова ответил:

    почемууууууууууууу?????????=((((((((((((((((((((

  23. 2
    Георгий Ульянов ответил:

    программерский кодекс чести! :о)
    новичок должен пройти все тяготы самостоятельно :) )

  24. 1
    Георгий Ульянов ответил:

    нет :) нетнетнет

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.