Ребят!!!!Пожалуйста помогите!!!!
мне нужно сделать программу, условие которой:
Определить, является ли введённая строка символов правильной записью формулы.Но у меня ничего не выходит!!!Объясните как это сделать пожалуйста!!!!Формула имеет следующий вид:
<формула>::=<цифра>|(<форумла><знак><форумла>
<знак>::=+|-|*
<цифра>::=|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++=' ';
}
25 декабря 2008 в 18:00
Код бредовый, честно.
Делается это одной рекурсивной функой
Алгоритм могу подсказать если еще нада
24 декабря 2008 в 16:05
если правильно задать запрос в поисковике то можно много интересного найти…например задание №8 тут:
//guap.ru/dept04/caf46/textbooks/pro/index2.8.htm
или №11 тут:
//dvo.sut.ru/libr/cvti/i097iluh/1.htm
24 декабря 2008 в 16:04
Пару месяцев назад я решал точно такую же задачу.
Преподы, оказывается, тоже не прочь списать друг у друга.
24 декабря 2008 в 0:00
2 Дашулька ~♥~SweeT~♥~PupS~ Маркова:
Приведенный пример делает немного другое: он пытается преобразовывать инфиксную запись в постфиксную. После исправления опечаток он работает, хотя, разумеется, некорректно. То же, что требуют от тебя, гораздо проще: ничего не нужно преобразовывать. Нужно, просканировав входную последовательность, дойти до первой ошибки или же до конца строки, заключив, что ошибок нет.
Метода построения программы такая. Для каждого символа в угловых скобочках делаешь функцию, как это сделано в твоём примере. Ну, например, для <формула> – void formula() … и т. д. Эти символы задают составные понятия.
Что такое составные понятия. Составные понятия – это те, которые "раскрываются" в виде набора альтернатив (или-или), каждая из которых представляет собой последовательность понятий, а те, в свою очередь, так же могут быть составными. Ещё бывают элементарные понятия, неделимые. Например, цифра. Или знак. Всё просто.
Твоя программа берёт входные символы (например, из некоторой строчки), при этомвызываются функции, соответствующие составным понятиям. Внутри себя эти функции перебирают альтернативы для составных понятий, для каждой из альтернатив обрабатывая входящие в неё понятия и так далее, рекурсивно для составных, а если "наткнулись" на элементарный символ, проверяем, подходит ли он нам (в вашем примере это isdigit() и всякие там if ((s=='*') || … )Такова идея метода рекурсивного спуска.
Какие тут проблемы.
Проблема номер 1: бесконечная рекурсия. Ну действительно, если функция formula() первым делом вызовет фунцию formula(), то вот вам она, пожалуйста – бесконечная рекурсия.
Проблема номер 2: как остановиться, когда наткнулись на "неправильный" символ?
Если ты действительно хочешь поразбираться, то ты найдёшь решения этих проблем. Ключевые слова: рекурсивный спуск, БНФ, грамматики, анализаторы, п. 3.1 книжки Страуструпа (где про калькулятор).
Ну а то, что здесь говорят крутые парни про качество кода- это всё правильно они говорят. У программистов вообще заведено так: материться и отрывать друг другу яйца за плохой код. В нашем бизнесе выживают только сама понимаешь кто. Только реально крутые парни. Без вопросов.
Кстати, насчёт пробелов, скобочек, деления на ноль. Даша, этого в голову не бери, этого у тебя в задании нет.
24 декабря 2008 в 0:00
а в C++ вообще много кто разбирается. Я делать за тебя задания не буду, но на конкретные вопросы по алгоритму или C++ с удовольствием отвечу.
23 декабря 2008 в 23:04
Дашулька, прочитайте про BNF (//en.wikipedia.org/wiki/Backus–Naur_Form) и Yacc (//en.wikipedia.org/wiki/Yacc). Возможно даже зачет сдадите.
23 декабря 2008 в 23:03
попробуй посмотреть
//www.delphikingdom.com/asp/viewitem.asp?catalo...
там все подробно расписанно, только примеры на делфи.
23 декабря 2008 в 23:03
а в C++ вообще кто-нибудь разбирается??о_О
23 декабря 2008 в 23:02
приходи ко мне…хотя не..
пригласите её кто-нибудь на НГ
23 декабря 2008 в 23:02
деление на 0 учти
23 декабря 2008 в 23:01
видимо я неодаренный ребенок……и нифига не понимаю……я уже практически смерилась с мыслей что нифига мне зачета не светит…и проведу нг дома в обнимку с подушкой………
23 декабря 2008 в 22:05
Так.. Объясняю.
Подумай, как ты *сама*, глядя на формулу, определяешь, правильная она или нет?
В-нулевых, ты не обращаешь внимания на пробелы между цифрами и знаками.
Во-первых, смотришь, нет ли в ней очевидных глупостей, типа "знак операции, после которого нет цифры".
Во-вторых, смотришь, есть ли у каждой открывающей скобки парная закрывающая.
Мне кажется, что этого достаточно, чтобы написать *проверщик* формул (но не калькулятор). Попробуй это реализовать; а если придумаешь еще какой-то случай неправильных формул, то реализуй и его. (Например, формула не должна быть пустой).
Вопросы?
23 декабря 2008 в 22:03
фигасебе я ниче не понял.
вопрос: кто писал код в котором теперь разбирается Дашулька?
23 декабря 2008 в 22:03
я просто прошу чтобы мне помогли…а не чтобы решили…..мне просто надо чтобы мне объяснили…
23 декабря 2008 в 22:03
препод вроде………хотя точно сказать не могу…
23 декабря 2008 в 22:03
жесть)))
интересно админы это на башорг уже выкинули??
23 декабря 2008 в 22:03
не видать мне зачет……….
23 декабря 2008 в 22:02
Еб твою мать! Не удаляю тему только для того, чтобы люди могли полюбоваться на это чудо (код).
Прямо вспоминаются слова Чарльза Бэббиджа:
I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a code (цитата изменена в соответствии с ситуацией)
Передай человеку, который ЭТО писал, что ему надо оторвать яйца.
И – ни один нормальный препод не поставит за ЭТО зачет.
Разбирайся с С++ и пиши самостоятельно. Ты в универ пришла чтобы чему-то научиться или чтобы обманывать преподавателей, сдавая сделанное другими говно?
На любые *конкретные* вопросы (в противовес самоуничижительной истерике) тебе тут ответят с радостью.
23 декабря 2008 в 22:00
с физиологической точки зрения – это невозможно.
Господи, ну и код О_о
23 декабря 2008 в 22:00
Для меня это не возможно….=((поэтому обратилась за помощью….
23 декабря 2008 в 21:05
ну я прошу просто помочь……у меня мозг кипит……..
23 декабря 2008 в 21:04
почемууууууууууууу?????????=((((((((((((((((((((
23 декабря 2008 в 21:04
программерский кодекс чести! :о)
новичок должен пройти все тяготы самостоятельно )
23 декабря 2008 в 21:03
нет нетнетнет