Книга: Программирование для Linux. Профессиональный подход

Листинг А.3. (calculator.c) Основная часть программы-калькулятора

Листинг А.3. (calculator.c) Основная часть программы-калькулятора

/* Вычисления в унарном формате. */
/* На вход программы подаются однострочные выражения
   в обратной польской (постфиксной) записи, например:
   602 7 5 - 3 * +
   Вводимые числа должны быть неотрицательными
   десятичными числами. Поддерживаются операторы
   "+", "-" и "*". Унарные операторы "even" и "odd"
   возвращают значение 1 в том случае, когда операнд
   является четным или нечетным соответственно.
   Лексемы разделяются пробелами. Отрицательные числа
   не поддерживаются. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "definitions.h"
/* Эта функция выполняет указанную бинарную операцию над
   операндами, извлекаемыми из стека, помещая результат
   обратно в стек, в случае успеха возвращается
   ненулевое значение. */
int apply_binary_function(number (*function)(number, number),
 Stack* stack) {
 number operand1, operand2;
 if (empty_stack(*stack))
  return 0;
 operand2 = pop_stack(stack);
 if (empty_stack(*stack))
  return 0;
 operand1 = pop_stack(stack);
 push_stack(stack, (*function)(operand1, operand2));
 destroy_number(operand1);
 destroy_number(operand2);
 return 1;
}
/* Эта функция выполняет указанную унарную операцию над
   операндом, извлекаемым из стека, помещая результат
   обратно в стек. В случае успеха возвращается
   ненулевое значение. */
int apply_unary_function(number (*function)(number), Stack* stack) {
 number operand;
 if (empty_stack(*stack))
  return 0;
 operand = pop_stack(stack);
 push_stack(stack, (*function)(operand));
 destroy_number(operand);
 return 1;
}
int main() {
 char command_line[1000];
 char* command_to_parse;
 char* token;
 Stack number_stack = create_stack();
 while (1) {
  printf("Please enter a postfix expression:n");
  command_to_parse =
   fgets(command_line, sizeof (command_line), stdin);
  if (command_to_parse = NULL)
   return 0;
  token = strtok(command_to_parse, " tn");
  command_to_parse = 0;
  while (token != 0) {
   if (isdigit(token[0]))
    push_stack(&number_stack, string_to_number(token));
   else if (((strcmp(token, "+ ") == 0) &&
    !apply_binary_function(&add, &number_stack)) ||
    ((strcmp(token, "-") == 0) &&
    !apply_binary_function(&subtract, &number_stack)) ||
    ((strcmp(token, "*") == 0) &&
    !apply_binary_function(&product, &number_stack)) ||
    ((strcmp(token, "even") == 0) &&
    !apply_unary_function(&even, &number_stack)) ||
    ((strcmp(token, "odd") == 0) &&
    !apply_unary_function(&odd, &number_stack)))
    return 1;
   token = strtok(command_to_parse, " tn");
  }
  if (empty_stack(number_stack))
   return 1;
  else {
   number answer = pop_stack(number_stack);
   printf("%un", number_to_unsigned_int(answer));
   destroy_number(answer);
   clear_stack(&number_stack);
  }
 }
 return 0;
}

Функции, приведенные в листинге А.4 выполняют операции над унарными числами, представленными в виде связных списков.

Оглавление книги


Генерация: 1.265. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз