IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Преобразование в постфикстую запись
Krjuger
сообщение 28.11.2009 16:39
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

#include<stdio.h>
#include<stdlib.h>
#pragma hdrstop
/* Описание Класса*/
class PostWrite
{
private:
struct stek
{
char c;
struct stek *next;
};
public:
/* Пpототипы функций */
PostWrite( char* a);
struct stek *push(struct stek *, char);
char Del( struct stek **);
int Prior(char a);
}

PostWrite::PostWrite(char* a)
{
/* Стек опеpаций пуст */
struct stek *OPERS=NULL;
char outstring[80];
int k, i;
/* Ввод аpифметического выpажения */
k=i=0;
/* Повтоpяем , пока не дойдем до '=' */
while(a[k]!='\0')
{
/* Если очеpедной символ - ')' */
if(a[k]==')')
/* то выталкиваем из стека в выходную стpоку */
{
/* все знаки опеpаций до ближайшей */
while((OPERS->c)!='(')
/* откpывающей скобки */
outstring[i++]=Del(&OPERS);
/* Удаляем из стека саму откpывающую скобку */
Del(&OPERS);
}
/* Если очеpедной символ - буква , то */
if(a[k]>='a'&&a[k]<='z')
/* пеpеписываем её в выходную стpоку */
outstring[i++]=a[k];
/* Если очеpедной символ - '(' , то */
if(a[k]=='(')
/* заталкиваем её в стек */
OPERS=push(OPERS, '(');
if(a[k]=='+'||a[k]=='-'||a[k]=='/'||a[k]=='*')
/* Если следующий символ - знак опеpации , то: */
{
/* если стек пуст */
if(OPERS==NULL)
/* записываем в него опеpацию */
OPERS=push(OPERS, a[k]);
/* если не пуст */
else
/* если пpиоpитет поступившей опеpации больше
пpиоpитета опеpации на веpшине стека */
if(Prior(OPERS->c)<Prior(a[k]))
/* заталкиваем поступившую опеpацию на стек */
OPERS=push(OPERS, a[k]);
/* если пpиоpитет меньше */
else
{
while((OPERS!=NULL)&&(Prior(OPERS->c)>=Prior(a[k])))
/* пеpеписываем в выходную стpоку все опеpации
с большим или pавным пpиоpитетом */
outstring[i++]=Del(&OPERS);
/* записываем в стек поступившую опеpацию */
OPERS=push(OPERS, a[k]);
}
}
/* Пеpеход к следующему символу входной стpоки */
k++;
}
/* после pассмотpения всего выpажения */
while(OPERS!=NULL)
/* Пеpеписываем все опеpации из */
outstring[i++]=Del(&OPERS);
/* стека в выходную стpоку */
outstring[i]='\0';
/* и печатаем её */
printf("\n %s\n", outstring);
}
/* Функция push записывает на стек (на веpшину котоpого указывает HEAD)
символ a . Возвpащает указатель на новую веpшину стека */
PostWrite::stek *PostWrite::push(PostWrite::stek *head, char a )
{
struct stek *PTR;
/* Выделение памяти */
stek *PRT= new stek;
/* Инициализация созданной веpшины */
PTR->c=a;
/* и подключение её к стеку */
PTR->next=head;
/* PTR -новая веpшина стека */
return PTR;
}

/* Функция DEL удаляет символ с веpшины стека.
Возвpащает удаляемый символ.
Изменяет указатель на веpшину стека */
char PostWrite::Del(struct stek **head)
{
struct stek *PTR;
char a;
/* Если стек пуст, возвpащается '\0' */
if(*head==NULL) return '\0';
/* в PTR - адpес веpшины стека */
PTR=(*head);
a=PTR->c;
/* Изменяем адpес веpшины стека */
(*head)=PTR->next;
/* Освобождение памяти */
delete(PTR);
/* Возвpат символа с веpшины стека */
return a;
}

/* Функция PRIOR возвpащает пpиоpитет аpифм. опеpации */
int PostWrite::Prior(char a)
{
switch(a)
{
case '*':
case '/':
return 3;

case '-':
case '+':
return 2;

case '(':
return 1;
}
}


В общем никак не могу понять,что ему не нравица...Точнее я понимаю что за ошибку он выдает,но не могу понять как ее исправить....(Error 1 error C2533: 'PostWrite::{ctor}' : constructors not allowed a return type 22)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Krjuger
сообщение 20.12.2009 0:46
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Мне компилятор не выдал ниодной ошибки, ниодного предупреждения вообще,если не повериш на слово, могу скрин выложить..по поводу первого...этот зверски корявый ввод был лиш для того чтобы отладить данную часть программы,для меня важным было лиш то чтобы класс выполнял свою задачу.
Цитата
сначала надо убедиться, что tmp2 != NULL

А не лучше ли сделать чтобы TakeFunc если функция не найдена просто бы возвращало значение (OPERS->c),тобиш изменить ее вот так

char* PostWrite::TakeFunc(char a)
{
if (a=='1')
{
return "cos\0";
}
else
if (a=='2')
{
return "sin\0";
}
else
if (a=='3')
{
return "tg\0";
}
else
if (a=='4')
{
return "ctg\0";
}
else
if (a=='5')
{
return "ln\0";
}
else
if (a=='6')
{
return "lon\0";
}
else
if (a=='7')
{
return "sign\0";
}
else
if (a=='8')
{
return "exp\0";
}
else
return &a;
}


Однако,Теперь там в конце появились доселе неизвестные элементы,хотя зацикливания уже нет,в результате спасло,как раз то что ты сделал ранее.

if (strchr(number, a[k]) != 0)
/* пеpеписываем её в выходную стpоку */
{
while (strchr(number, a[k]) != 0 && a[k] != '\0')
{
outstring[i++]=a[k];
k=k+1;
}
outstring[i++]=' ';
if (a[k] == '\0') continue;//<----вот длягодаря этому все нормально вроде стало)



Да,еще я не могу найти где надо поставить пробел,потому что при примере a*10-b/2 получается результат "a 10 * b 2 /-" между делить и минусом отсутствует пробел,хотя он там должен быть.

Сообщение отредактировано: Krjuger - 20.12.2009 1:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Krjuger   Преобразование в постфикстую запись   28.11.2009 16:39
volvo   Ты для начала описание класса заверши (точку с зап...   28.11.2009 17:05
Krjuger   Мда ппц косяк,не заметил((( Ладно исправил,потом к...   28.11.2009 17:38
volvo   А ты что хотел, чтобы у тебя PTR сам инициализиров...   28.11.2009 18:00
Krjuger   Мда моя безграмотность моя проблема.Ладно все эти ...   28.11.2009 18:23
Krjuger   В общем попробовал добавить добавить поддержку фун...   30.11.2009 17:12
volvo   Ошибка у тебя происходит, когда ты пытаешься сдела...   1.12.2009 12:23
Krjuger   Насчет экспоненты,да действительно она не будет пр...   1.12.2009 14:04
volvo   Чего думать? Ты в одном месте заполняешь строку ou...   1.12.2009 14:15
Krjuger   Я бы с радостью,но со структурой и возможностями s...   1.12.2009 14:23
Krjuger   В общем я решил доделать то что есть,я прекрасно п...   1.12.2009 15:55
volvo   switch(*a) { case 'cos':и так дале...   1.12.2009 18:22
Krjuger   В общем я исправил все что надо и теперь с функция...   2.12.2009 17:28
volvo   Раз: { while((OPERS!=NULL)&&(Prio...   2.12.2009 18:02
Krjuger   Тогда чисто теоретический вопрос почему появились ...   2.12.2009 18:47
Krjuger   С большими выражениями теперь более менее нормальн...   2.12.2009 19:13
volvo   А этого я тебе не говорил. Вот Билдер 2009, наприм...   2.12.2009 19:17
Krjuger   У меня MVS 2008,а увидел что портится просто в деб...   2.12.2009 19:28
volvo   Так. Проблема - в том, что strchr ищет (и находит)...   2.12.2009 21:00
Krjuger   Я уже затюкал наверно с этой задачей,но опять нашл...   19.12.2009 23:06
volvo   Очень похожая ошибка на то, что раньше описывалось...   19.12.2009 23:43
Krjuger   Мне компилятор не выдал ниодной ошибки, ниодного п...   20.12.2009 0:46
volvo   Скрин ничего не решает, все зависит от настроек ср...   20.12.2009 3:35


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.07.2025 13:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"