Итоги: Диспетчеризация калькулятора
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 37 из 61.
Задание
ЛегкоСоздайте калькулятор с помощью таблицы dispatch. Вы создадите массив указателей на функции, который сопоставляет коды операций с соответствующими функциями, а затем используете его для выполнения вычислений.
Напишите программу, которая:
- Создаёт
typedefс именемOperationдля указателя на функцию, которая принимает два параметраintи возвращаетint - Определяет четыре арифметические функции:
add: возвращает a + bsub: возвращает a - bmul: возвращает a * bdivide: возвращает a / b (целочисленное деление)
- В
mainсоздаёт таблицу dispatch: массив из 4 указателей на функцииOperation, где индекс 0 — это add, индекс 1 — это sub, индекс 2 — это mul, а индекс 3 — это divide - Считывает три входных значения: два целых числа и код операции (0-3)
- Использует код операции для обращения по индексу к таблице dispatch и вызова соответствующей функции
- Выводит результат
Вы получите три входных значения: первое число, второе число и код операции (0 для add, 1 для sub, 2 для mul, 3 для divide).
Ваша программа должна вывести одно целое число: результат операции:
7В этом примере с входными значениями 10, 3, 1 код операции 1 выбирает sub из таблицы dispatch, поэтому мы вычисляем 10 - 3 = 7.
Главная идея заключается в использовании индексации массива для выбора функции: операторы if или switch не нужны. Ваша таблица dispatch должна выглядеть так:
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;
}Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик7Указатели на функции
Объявление указателей на функцииВызов указателей на функцииTypedef для указателей на функцииПередача функций в качестве аргументовИтоги: Диспетчеризация калькулятора2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C