Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
#1

Не запускается прога из Керниган и Ритчи - C (СИ)

01.06.2013, 18:12. Просмотров 702. Ответов 1
Метки нет (Все метки)

программа-калькулятор
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <conio.h>
#include <math.h>
#include <stdio.h>
 
#define MAXOP   20  /* MAX SIZE OF OPERAND, OPERГЂTOR */
#define NUMBER '0'  /* SIGNAL THAT NUMBER FOUND */
#define TOOBIG '9'
 
main()  /* REVERSE POLISH DESK CALCULATOR */
   {
   
    int tupe;
    char s[MAXOP];
    double op2,atof(),pop(),push();
 
    while ((tupe=getop(s,MAXOP)) != EOF);
      switch(tupe) {
      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("ZERO DIVISOR POPPED");
           break;
      case '=':
           printf("%f",push(pop()));
           break;
      case 'C':
           clear();
           break;
      case TOOBIG:
           printf("%.20s ... IS TOO LONG",s);
           break;
           }
           getch();
}
   #define MAXVAL 100 /* MAXIMUM DEPTH OF VAL STACK */
 
 
 
   int sp = 0;        /* STACK POINTER */
   double val[MAXVAL]; /*VALUE STACK */
   double push(f)    /* PUSH F ONTO VALUE STACK */
   double f;
   {
    if (sp < MAXVAL)
            return(val[sp++] =f);
    else    {
            printf("ERROR: STACK FULL");
            clear();
            return(0);
}
}
 
   double pop()   /* POP TOP VALUE FROM STEACK */
   {
    if (sp > 0)
            return(val[--sp]);
    else    {
            printf( "ERROR: STACK EMPTY");
            clear();
            return(0);
}
}
 
  clear()       /* CLEAR STACK */
   {
     sp=0;
}
проблема в getop.
Что это не знаю, Керниган пишет: Функция GETOP
считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока
последовательность не прерывается.
А что за функция, она не стандартная?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2013, 18:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не запускается прога из Керниган и Ритчи (C (СИ)):

Ритчи и Керниган - C (СИ)
В этом учебники в некоторых примерах прототип функции объявляется внутри другой функции. Доля того, чтобы вызывающая фукцния знала какое...

Указатели, Керниган и Ритчи 5.4 - C (СИ)
Здравствуйте, нужна помощь начинающему. Читаю Керниган и Ритчи и не могу понять следующую вещь: зачем нам allocbuf в условии : ...

Компилятор С(Керниган ,Ритчи) - C (СИ)
Здравствуйте! Открыл книгу Брайана Кернигана и Денниса Ритчи. Первое задание MAIN() PRINTF(&quot;HELLO, WORLD\N&quot;); Не могу понять как...

Керниган, Ритчи, указатели и упражнение 5.3 - C (СИ)
Добрый день! &quot;Напишите свою версию функции strcat, ... с применением указателей.&quot; void strcat1(char *s, char *t) { while (*s++) ...

Керниган и Ритчи подсчет строк - C (СИ)
после запуска вместо результата просто переходит на следущую строчку #include &lt;stdio.h&gt; /* подсчет строк во входном потоке */ ...

Керниган и Ритчи подсчет строк - C (СИ)
после запуска вместо результата просто переходит на следущую строчку #include &lt;stdio.h&gt; /* подсчет строк во входном потоке */ ...

1
Revolver_45
18 / 18 / 6
Регистрация: 17.05.2013
Сообщений: 31
01.06.2013, 19:19 #2
Эта функция описана дальше, пролистай одну-две страницы вперёд.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* getop: извлекает следующий операнд или знак операции */
int getop(char s[]) {
  int i, c;
  while ((s[0] = c = getch()) == ' ' || c == '\t')
      ;
  s[1] = '\0';
  if (!isdigit(c) && c != '.') return c; /* Не число */
  i = 0;
  if (isdigit(c)) /* Накопление целой части */
    while (isdigit(s[++i] = c = getch()))
      ;
  if (c == '.') /* Накопление дробной части */
    while (isdigit(s[++i] = c = getch()))
      ;
  s[i] = '\0';
  if (c != EOF) ungetch(c);
  return NUMBER;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2013, 19:19
Привет! Вот еще темы с ответами:

Двоичный поиск (Керниган-Ритчи, упр. 3.1) - C (СИ)
Добрый день. Что-то я подвисла немного... Задание: В нашем двоичном поиске каждый цикл содержит две проверки, тогда как достаточно...

Керниган Ритчи Глава 1.9 символьные массивы - C (СИ)
В главе 1.9 символьные массивы Керниган Ричи не понятно для чего нужны и как работают выделенные строки. Сама программа находит самую...

Найти ошибку в коде из учебника Керниган и Ритчи - C (СИ)
В тексте книги написан такой код #include &lt;stdio.h&gt; #define MAXLINE 1000 /* максимальный размер вводимой строки */ int getline(char...

Не получается воссоздать пример из книги Б.Керниган Д.Ритчи - C (СИ)
Не могу разобраться, почему код приведённый из книги в примере выполняется бесконечно и при этом не выводит printf. &quot;А теперь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru