Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Калькулятор


Автор: Гость_Satana 9.1.2005, 20:40
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
Подправленный кусочек кода, изменения поищи сам
Код

# 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);
   }
}

Автор: Гость_Satana 10.1.2005, 15:05
Большое спасибо испарвлена ошибка гребаного нуля !!! smile
sin, cos, log, exp. выдают не правильные значения.
Сам не могу понять почему. Я по книге делал.
Иеще касячят операции с отрицательными числами, иногда пропадает знак минуса ! smile

Автор: Серега 13.1.2005, 18:36
Постепенно исправляю ошибки, но немогу сделать, что бы правильно находил sin, cos, log, exp. Не пойму почему ! smile

Автор: Серега 7.2.2005, 15:13
Вроде ошибки я почти все иправил, но есть одна проблема: вычисления с отрицательными числами происходят неправильно ! когда пишем допустим - 5 программа пишет, что стек пустой, но вычесляет. Как это исправить? Подскажите! smile

Автор: Sleepman 7.2.2005, 21:57
А сессия уже канула в лето....
Человека отчислили, а Серега все бьется над кодом...
Млц.)
smile

Автор: Серега 10.2.2005, 16:35
Да, долг повис на лето! smile
Но я этот калькулятор добью! smile

Автор: val 10.2.2005, 16:50
Цитата
sin, cos, log, exp. выдают не правильные значения.


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

Автор: Серега 16.2.2005, 17:46
Да, я уже с этим разобрался. сейчас стиит вопрос: операции с отрицательными числами !
Когде пишешь " -5 " программа вsld=ает сообщение, что стек пустой, т.к. перед знаком арифметической аперации должно быть введено как минимум 2 числа. Это же не ручной калькулятор, сдесь нет отдельной кнопки для назначения отрицательного числа. Как исправит это ? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)