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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Калькулятор, ошибки в коде 
:(
    Опции темы
Гость_Satana
Дата 9.1.2005, 20:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile Так начиналось: мне на сессию надо сделать калькулятор на turbo c++ 3.1, ну вот я в сети нашел что-то похожее и стал переделывать. И тут сталкнулся с проблемами: smile
- логарифм почему-то не находится (sin. cos вроде ищет)
- если сложить 22 и 3 получится 52, а если 22 и 03 тогда 25. Почему ?
- образуется ноль дополнительный (может и несколько!) , т.е. 2 + 2 = 40,0000. smile
- иногда не правильно происходит вичитание
Я в программировании новичок и поэтому сейчас в недоумении. Помогите исправить ошибки, может кто найдет еще. smile

Код

# include <stdio.h>
# include <conio.h>
# include <math.h>
# define MAXOP 10        /* MAX SIZE OF OPERAND OPERATOR */
# define NUMBER '0'      /* SIGNAL NUMBER FOUND */
# define TOOBIG '9'      /* SIGNAL STRING IS TOO BIG */
void main()
{
 int type;
 char s[MAXOP];
 double op2, atof(), pop(), push();
 while (( type = getop(s,MAXOP)) != EOF)
   switch (type)
    {
     case NUMBER :
push(atof(s));
break;
     case '+' :
push(pop() + pop());
break;
     case '*' :
push(pop() * pop());
break;
     case '-' :
op2 = pop();
push(pop() - op2);
break;
     case '/' :
op2 = pop();
if (op2 != 0.0)
  push(pop() / op2);
else
  printf("Error ! \n");
break;
     case 's' :
push(sin(pop()));
break;
     case 'c' :
push(cos(pop()));
break;
     case 'l' :
op2 = pop();
if (op2 > 0.0)
  push(pop() / op2);
else
  printf("Error ! \n");
break;
     case 'e' :
push(exp(pop()));
break;
     case '=' :
printf("%.4f \n",push(pop()));
break;
     case 'o' :
clear();
  break;
     case TOOBIG :
printf("%10s ... is too long \n",s);
break;
     default :
printf("Unknown command %c \n", type);
               break;
   }
}
# define MAXVAL 100     /* MAX DEPTH OF VALUE STACK */
int sp = 0;            /* STACK POINTER */
double val[MAXVAL];    /* VALUES STACK */
double push(f)           /* PUSH f ON TO VALUE STACK */
double f;
{
  if (sp < MAXVAL )
    return (val[sp++] = f);
  else {
    printf(" error : stack full \n ");
    clear();
    return (0);
  }
}
double pop()             /* POP TOP VALUE FROM STACK */
{
  if (sp > 0)
    return(val[--sp]);
  else {
    printf("error : stack empty \n");
    clear();
  return (0);
  }
}
clear ()                 /* CLEAR STACK */
{
  sp = 0;
  return 0;
}
getop(s,lim)             /* GET NEXT OPERATOR OR OPERAND */
char s[];
int lim;
{
  int i , c;
  while (( c = getch()) == ' ' || c == '\t' || c == '\n' )
   ;
  if (c != '.' && (c < '0' || c > '9'))
    return(c);
  s[0] = c;
  for (i = 1; (c = getchar()) >= '0' && c <= '9'; i++)
    if (i < lim)
      s[i] = c;
  if (c == '.') {        /* COLLECT FRACTION */
    if (i < lim)
      s[i] = c;
    for (i++; (c = getchar()) <= '0' && c <= '9'; i++)
      if (i < lim)
 s[i] = c;
  }
  if (i < lim) {         /* NUMBAR IS OK */
    ungetch(c);
    s[i] = '0';
    return (NUMBER);
  }
    else {                 /* ITS TOO BIG SKIP REST OF LINE */
      while (c != '\n' && c != EOF)
 c = getchar();
      s[lim-1] = '0';
      return (TOOBIG);
    }
}
# define BUFSIZE 100
char buf[BUFSIZE];        /* BUFFER FOR ungetch */
int bufp = 0;             /* NEXT FREE POSITION IN BUF */
getch()                    /* GET A POSSIBLY PUSHED BACK CHARACTER */
{
  return ((bufp > 0) ? buf[--bufp] : getchar());
}
ungetch(c)
int c;
{
  if (bufp > BUFSIZE)
    printf("ungetch: too many characters \n");
  else
    buf[bufp++] = c;
  return 0;
}


















  Вверх
Laco
Дата 10.1.2005, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подправленный кусочек кода, изменения поищи сам
Код

# define MAXVAL 100     /* MAX DEPTH OF VALUE STACK */
int sp = 0;            /* STACK POINTER */
double val[MAXVAL];    /* VALUES STACK */
double push(f)           /* PUSH f ON TO VALUE STACK */
double f;
{
 if (sp < MAXVAL )
 {
   val[sp++] = f;
   return f;
 }
 else {
   printf(" error : stack full \n ");
   clear();
   return (0);
 }
}
double pop()             /* POP TOP VALUE FROM STACK */
{
 if (sp > 0)
   return(val[--sp]);
 else {
   printf("error : stack empty \n");
   clear();
 return (0);
 }
}
clear ()                 /* CLEAR STACK */
{
 sp = 0;
 return 0;
}
int getop(s,lim)             /* GET NEXT OPERATOR OR OPERAND */
char s[];
int lim;
{
 int i , c;
 while (( c = getch()) == ' ' || c == '\t' || c == '\n' );
 if (c != '.' && (c < '0' || c > '9'))
   return(c);
 s[0] = c;
 for (i = 1; (c = getchar()) >= '0' && c <= '9'; i++)
   if (i < lim)
       s[i] = c;
 if (c == '.') {        /* COLLECT FRACTION */
   if (i < lim)
     s[i++] = c;
   for (i; (c = getchar()) >= '0' && c <= '9'; i++)
     if (i < lim)
         s[i] = c;
 }
 if (i < lim) {         /* NUMBAR IS OK */
   ungetch(c);
   s[i] = '\0';
   return (NUMBER);
 }
   else {                 /* ITS TOO BIG SKIP REST OF LINE */
     while (c != '\n' && c != EOF)
c = getchar();
     s[lim-1] = '\0';
     return (TOOBIG);
   }
}

PM MAIL   Вверх
Гость_Satana
Дата 10.1.2005, 15:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Большое спасибо испарвлена ошибка гребаного нуля !!! smile
sin, cos, log, exp. выдают не правильные значения.
Сам не могу понять почему. Я по книге делал.
Иеще касячят операции с отрицательными числами, иногда пропадает знак минуса ! smile
  Вверх
Серега
Дата 13.1.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Постепенно исправляю ошибки, но немогу сделать, что бы правильно находил sin, cos, log, exp. Не пойму почему ! smile
PM MAIL   Вверх
Серега
Дата 7.2.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вроде ошибки я почти все иправил, но есть одна проблема: вычисления с отрицательными числами происходят неправильно ! когда пишем допустим - 5 программа пишет, что стек пустой, но вычесляет. Как это исправить? Подскажите! smile
PM MAIL   Вверх
Sleepman
Дата 7.2.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А сессия уже канула в лето....
Человека отчислили, а Серега все бьется над кодом...
Млц.)
smile
PM MAIL   Вверх
Серега
Дата 10.2.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, долг повис на лето! smile
Но я этот калькулятор добью! smile
PM MAIL   Вверх
val
Дата 10.2.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

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



Цитата
sin, cos, log, exp. выдают не правильные значения.


Параметры этих функций задаются в радианах...



--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Серега
Дата 16.2.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, я уже с этим разобрался. сейчас стиит вопрос: операции с отрицательными числами !
Когде пишешь " -5 " программа вsld=ает сообщение, что стек пустой, т.к. перед знаком арифметической аперации должно быть введено как минимум 2 числа. Это же не ручной калькулятор, сдесь нет отдельной кнопки для назначения отрицательного числа. Как исправит это ? smile
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.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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