|
Функции и структура программПеревести эту схему в код достаточно легко. Если, мы будем считать пока, что наша программа находится в одном файле, она будет иметь примерно следующий вид: # Include (включаемые файлы) # Define (определение) объявления функций для main main () {... } внешние переменные для проталкивания (push) и выталкивание (pop) void push (double f) {... } double pop (void) {... } int getop (char s []) {... } функции, вызванные getop Позже мы рассмотрим, как это можно разбить на два или более выходных файла. Функция main состоять из цикла, содержать большой переключатель (switch) типа оператора или операнда; это - типичнее использования switch чем то, что мы видели ранее. # Include # Include # Define MAXOP 100 / * максимальный размер операнда или оператора * / # Define NUMBER '0 '/ * сигнализировать, что номер найдено * / int getop (char []); void push (double); double pop (void); / * Калькулятор с обратной польской нотацией * / main () { int type; double op2; char s [MAXOP]; while ((type = getop (s))! = 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: zero divisor \ n"); break; case '\ n': printf ("\ t% .8 g \ n", pop ()); break; default: printf ("error: unknown command% s \ n", s); break; } } return 0; } Поскольку + и * это переставные (коммутативные) операторы, последовательность в которой вытолкнуты операнды сочетаются не имеет значения, но в случае - и /, правый и левый операнд должны различаться. Например, в push (pop () - pop ()); / * НЕПРАВИЛЬНО * / последовательность, в которой два вызова pop вычислено, не определено. Чтобы обеспечить правильную последовательность, нужно вытолкнуть первое значение во временную переменную, как мы это сделали в main: # Define MAXVAL 100 / * максимальная глубина стека * / int sp = 0; / * следующая свободная позиция в стеке * / double val [MAXVAL]; / * стек значений * / / * Push: проталкивания в стек значений * / void push (double f) { if (sp else printf ("error: stack full, can't push% g \ n", f); } / * Pop: вытолкнуть и вернуть верхне значение из стека * / double pop (void) { if (sp> 0) return val [- sp]; else { printf ("error: stack empty \ n"); return 0.0; } } Переменная считается внешней, если ее обозначили вне любой функции. Таким образом, стек и индекс стека, совместно использоваться push и pop, определены снаружи этих функций. Но сама main не обращается в стеке или положение в стеке, поэтому представление может быть скрытым. Продолжение статьи: ч.1 Продолжение статьи: ч.2 Продолжение статьи: ч.3 Продолжение статьи: ч.4 Продолжение статьи: ч.5 Продолжение статьи: ч.6 Продолжение статьи: ч.7 Продолжение статьи: ч.8 Продолжение статьи: ч.9 Продолжение статьи: ч.10 Продолжение статьи: ч.11 Продолжение статьи: ч.12 Продолжение статьи: ч.13 Продолжение статьи: ч.14 Продолжение статьи: ч.15 Продолжение статьи: ч.16 Продолжение статьи: ч.17 Продолжение статьи: ч.18 Продолжение статьи: ч.19 Продолжение статьи: ч.20 Продолжение статьи: ч.21 Другие статьи по теме: - Внешние переменные и область действия- Типы, операторы и выражения - Символьные массивы - Функции и структура программ - Введение в c++ |
|
2006-2024 © SMTI.RU Главная страница | Связаться с нами |