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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

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


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

 





- Текстовая версия 19.05.2024 1:56
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name