Итоги: Диспетчеризация калькулятора
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 37 из 61.
Задание
ЛегкоСоздайте калькулятор, используя таблицу переходов (dispatch table). Вы создадите массив указателей на функции, который сопоставляет коды операций с соответствующими функциями, а затем используете его для выполнения вычислений.
Напишите программу, которая:
- Создает
typedefс именемOperationдля указателя на функцию, которая принимает два параметра типаintи возвращаетint - Определяет четыре арифметические функции:
add— возвращает a + bsub— возвращает a - bmul— возвращает a * bdivide— возвращает a / b (целочисленное деление)
- В функции
mainсоздает таблицу переходов: массив из 4 указателей на функции типаOperation, где индекс 0 — это add, индекс 1 — sub, индекс 2 — mul, а индекс 3 — divide - Считывает три входных значения: два целых числа и код операции (0-3)
- Использует код операции для индексации в таблице переходов и вызова соответствующей функции
- Выводит результат
Вы получите три входных значения: первое число, второе число и код операции (0 для add, 1 для sub, 2 для mul, 3 для divide).
Ваш вывод должен представлять собой одно целое число — результат операции:
7В этом примере с входными данными 10, 3, 1: код операции 1 выбирает sub из таблицы переходов, поэтому мы вычисляем 10 - 3 = 7.
Ключевым моментом здесь является использование индексации массива для выбора функции — операторы if или switch не требуются. Ваша таблица переходов должна выглядеть так:
Operation ops[4] = {add, sub, mul, divide};Затем вызовите функцию, используя: ops[code](a, b)
Попробуйте сами
#include <stdio.h>
// TODO: Создайте typedef с именем 'Operation' для указателя на функцию,
// которая принимает два параметра типа int и возвращает int
// TODO: Определите четыре арифметические функции: add, sub, mul, divide
int main() {
// Чтение входных данных
int a, b, code;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &code);
// TODO: Создайте таблицу переходов (массив из 4 указателей на функции Operation)
// Operation ops[4] = { ... };
// TODO: Используйте код операции для вызова соответствующей функции
// и сохраните результат
int result;
// Вывод результата
printf("%d\n", result);
return 0;
}Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик7Указатели на функции
Объявление указателей на функцииВызов указателей на функцииTypedef для указателей на функцииПередача функций в качестве аргументовИтоги: Диспетчеризация калькулятора2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга