XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Трактир
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
KPOKODIL
В разработке
offline
Опыт: 10,262
Активность:
Строковый калькулятор на С
Начал недавно в инсте изучать С и нас попросили сделать строковый калькулятор, который выполнял бы простейшие арифм. операции (+-/*) и учитывал бы расположение скобок.
Нашел в инете программу, реализованную через стеки.
Можете плз обьяснить поподробней принцип работы стека.

» Код

Код:
#include<stdio.h>
#include<stdlib.h>

struct st                
{
char c;
struct st *next;
};
struct st *push(struct st *, char); 
char DEL(struct st **);
int PRIOR(char);

void main(void)
{
   struct st *OPERS=NULL;                     
  char a[80], outstring[80];
  int k, point;
  do
  { 
     puts("Введите выpажение(в конце '='):");
    fflush(stdin);
    gets(a);                                 
    k=point=0;
    while(a[k]!='\0'&&a[k]!='=')           
    {
      if(a[k]==')')             
                    {                                     
                  while((OPERS->c)!='(')         
                     outstring[point++]=DEL(&OPERS);  
                  DEL(&OPERS);
      }
      if(a[k]>='a'&&a[k]<='z')        
                      outstring[point++]=a[k];        
                     if(a[k]=='(')                         
                      OPERS=push(OPERS, '(');           
      if(a[k]=='+'||a[k]=='-'||a[k]=='/'||a[k]=='*')
          {                             
        if(OPERS==NULL)                     
            OPERS=push(OPERS, a[k]);        
        else                                 
        if(PRIOR(OPERS->c)<PRIOR(a[k]))      
            OPERS=push(OPERS, a[k]);      
        else                              
        {
          while((OPERS!=NULL)&&(PRIOR(OPERS->c)>=PRIOR(a[k])))
              outstring[point++]=DEL(&OPERS); 
          OPERS=push(OPERS, a[k]);           
        } 
      }
      k++;                                    
    }
    while(OPERS!=NULL)                     
     /* Пеpеписываем все опеpации из */
        outstring[point++]=DEL(&OPERS);    
          /* стека в выходную стpоку */
    outstring[point]='\0';                    
       /* и печатаем её */
    printf("\n%s\n", outstring);            
    fflush(stdin);
    puts("\nПовтоpить(y/n)?");
  } while(getchar()!='n');
}
struct st *push(struct st *HEAD, char a)
{
  struct st *PTR;
  /* Выделение памяти */
  if((PTR=malloc(sizeof(struct st)))==NULL) 
  {
    puts("ет памяти");exit(-1);             
  }
  PTR->c=a;                                
  PTR->next=HEAD;           
  return PTR;                               
}

char DEL(struct st **HEAD)
{
  struct st *PTR;
  char a;
  if(*HEAD==NULL) return '\0'; 
  PTR=*HEAD;                   
  a=PTR->c;
  *HEAD=PTR->next;         
  free(PTR);   
  
  return a;                   
}

int PRIOR(char a)
{
  switch(a)
  {
    case '*':
    case '/':
         return 3;

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

    case '(':
         return 1;
  }
}


И еще компилятор ругается на строку:
if((PTR=malloc(sizeof(struct st)))==NULL)
Старый 27.11.2010, 06:58
spellwerk

offline
Опыт: 4,869
Активность:
Цитата:
Сообщение от KPOKODIL
И еще компилятор ругается на строку:
if((PTR=malloc(sizeof(struct st)))==NULL)

компилировал с помощью MinGW, ни на что не ругался. в принципе ты можешь удалить эту строку, она проверяет наличие доступной памяти

стек работает по принципу первый вошел последний вышел. помещая значения в стек, ты будешь извлекать их в обратном порядке.

Отредактировано Spy_, 27.11.2010 в 11:32.
Старый 27.11.2010, 11:22
ScorpioT1000
Работаем
offline
Опыт: отключен
стек работает по принципу первый вошел последний вышел.
стек работает как колода карт - кладешь сверху, берешь сверху.
"чтобы взять вторую сверху, нужно снять верхнюю"
ты как-то смутно описал это )
Старый 27.11.2010, 12:38
lentinant
Скучно
offline
Опыт: 42,216
Активность:
Строковый калькулятор - это типа с синтаксическим анализатором? Нас такое учили делать через бинарное дерево и рекурсию, правда, это было на Дэлфи, и я тогда делал вместо этого длинную арифметику (это типа был второй вариант), но алгоритм, если нужно, рассказать могу
Старый 27.11.2010, 13:31
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 23:52.