#include #include #include #include typedef int (*delegate_func)(int, int); typedef struct { delegate_func* funcs; int count; } Delegate; int summ(int a, int b) { return a + b; } int diff(int a, int b) { return a - b; } void zadanie1() //задание 1 { int (*FS)(int,int); FS = summ; printf("Результат функции summ %d\n", FS(10,5)); int(*FArr[2])(int, int); FArr[0] = summ; FArr[1] = diff; for (int i = 0; i < 2; i++) { printf("Результат функции %d = %d\n", i+1, FArr[i](10,3)); } } void add_function_to_delegate(Delegate* d, delegate_func func) //задание 2 { d->count++; d->funcs = (delegate_func*)realloc(d->funcs, d->count * sizeof(delegate_func)); d->funcs[d->count - 1] = func; } void invoke_delegate(Delegate* d, int a, int b) //задание 4 { for (int i = 0; i < d->count; i++) { printf("Результат функции %d: %d\n", i + 1, d->funcs[i](a, b)); } } void remove_delegate(Delegate d) { free(d.funcs); d.count = 0; } void removeFunction(Delegate* delegate, delegate_func func); void zadanie2() //задание 2 { Delegate d = { .count = 0 }; printf("Добавление функций\n"); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, diff); invoke_delegate(&d, 5, 3); printf("Добавление функций\n"); removeFunction(&d, summ); removeFunction(&d, diff); add_function_to_delegate(&d, diff); invoke_delegate(&d, 5, 3); } void removeFunction(Delegate* delegate, delegate_func func) //задание 3 { for (int i = 0; i < delegate->count; i++) { if (delegate->funcs[i] == func) { for (int j = i; j < delegate->count - 1; j++) { delegate->funcs[j] = delegate->funcs[j + 1]; } delegate->count--; delegate->funcs = (delegate_func*)realloc(delegate->funcs, delegate->count * sizeof(delegate_func)); break; } } } void zadanie3()//задание 3 { Delegate d = { .count = 0 }; printf("Добавление функций\n"); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, diff); invoke_delegate(&d, 5, 3); printf("После удаление функции diff(2)\n"); removeFunction(&d, diff); invoke_delegate(&d, 5, 3); } void remove_duplicate_functions(Delegate* delegate) { for (int i = 0; i < delegate->count; i++) { for (int j = i + 1; j < delegate->count; j++) { if (delegate->funcs[i] == delegate->funcs[j]) { removeFunction(delegate, delegate->funcs[j]); j--; } } } } void zadanie4() { Delegate d = { .count = 0 }; printf("Добавление функций\n"); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, diff); invoke_delegate(&d, 5, 3); printf("Добавление дублирующих функций\n"); add_function_to_delegate(&d, diff); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, diff); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, diff); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, diff); add_function_to_delegate(&d, diff); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, summ); add_function_to_delegate(&d, summ); invoke_delegate(&d, 5, 3); printf("После удаление дублирующих функций\n"); remove_duplicate_functions(&d, diff); remove_duplicate_functions(&d, summ); invoke_delegate(&d, 5, 3); remove_delegate(d); } int main(void) { system("chcp 1251>nul"); printf("1. Определить указатель на функцию и массив указателей на функцию как новый тип данных\n"); printf("2. Реализовать функцию добавления функций в делегат\n"); printf("3. Реализовать функцию удаления функций из делегата\n"); printf("4. Реализовать функцию по удалению всех повторяющихся функций в делегате\n"); int n, zadanie = 0; while (zadanie == 0) { printf("\nВыберите номер задания (1-4): "); if (scanf_s("%d", &n)!=1) { printf("Ошибка ввода, необходимо ввести число\n"); zadanie = 1; } switch (n) { case 1: zadanie1(); break; case 2: zadanie2(); break; case 3: zadanie3(); break; case 4: zadanie4(); break; default: printf("Такого задания нет"); break; } int c = -1; printf("\n\nВы хотите выбрать другое задание? 0 - нет, 1 - да\n"); scanf_s("%d", &c); if (c == 0) zadanie = 1; } return 0; }