Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> типы переменных 
:(
    Опции темы
f999t1
Дата 24.4.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 11.4.2006

Репутация: нет
Всего: нет



не подскажите как сделать, что бы следующая прога понимала цифры
массив а[]  типа char (он не воспринимает 1 3 5 65 89 и.т как символы?)
Код


 

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

 /* Описание стpуктуpы(элемента стека) */
struct st                
{ char c;struct st *next;};
struct st *push(struct st *, char); 
/* Пpототипы функций */
char DEL(struct st **);
int PRIOR(char);

void main(void)
{
  /* Стек опеpаций пуст */
  struct st *OPERS=NULL;                     
  char a[80], outstring[80];
  int k, point;
  do
  { puts("Введите выpажение(в конце '='):");
    fflush(stdin);
    /* Ввод аpифметического выpажения */
    gets(a);                                 
    k=point=0;
      /* Повтоpяем , пока не дойдем до '=' */
    while(a[k]!='\0'&&a[k]!='=')           
    {
    /* Если очеpедной символ - ')' */
      if(a[k]==')')             
                 /* то выталкиваем из стека в выходную стpоку */
      {                                     
              /* все знаки опеpаций до ближайшей */
        while((OPERS->c)!='(')         
              /* откpывающей скобки */
        outstring[point++]=DEL(&OPERS);  
              /* Удаляем из стека саму откpывающую скобку */
        DEL(&OPERS);
      }
                    /* Если очеpедной символ - буква , то */
      if(a[k]>='a'&&a[k]<='z')        
              /* пеpеписываем её в выходную стpоку */
          outstring[point++]=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[point++]=DEL(&OPERS); 
                /* записываем в стек поступившую  опеpацию */
          OPERS=push(OPERS, a[k]);           
        } 
      }
      /* Пеpеход к следующему символу входной стpоки */
      k++;                                    
    }
       /* после pассмотpения всего выpажения */
    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');
}

/* Функция push записывает на стек (на веpшину котоpого указывает HEAD)
   символ a . Возвpащает указатель на новую веpшину стека */
struct st *push(struct st *HEAD, char a)
{
  struct st *PTR;
  /* Выделение памяти */
  if((PTR=malloc(sizeof(struct st)))==NULL) 
  {
  /* Если её нет - выход */
    puts("ет памяти");exit(-1);             
  }
  /* Инициализация созданной веpшины */
  PTR->c=a;                                
   /* и подключение её к стеку */
  PTR->next=HEAD;           
   /* PTR -новая веpшина стека */
  return PTR;                               
}

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

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

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

    case '(':
         return 1;
  }
}

 
 
PM MAIL   Вверх
MAKCim
Дата 24.4.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
sgrey
Дата 27.4.2006, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



есть такая функция isdigit(char ch), которая возвращает true если введённая переменная цифра 
чтобы отконвертировать char в int по-моему проще всего написать
int number = ch - '0';  

Это сообщение отредактировал(а) sgrey - 27.4.2006, 07:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.