Задание на работу с указателями

Рейтинг: -2Ответов: 1Опубликовано: 06.02.2023

Задание:

  1. Напишите функции (сумма и разность), выполняющие арифметические операции с двумя числами. На вход - два числа одного типа (int, например), возвращаемое значение аналогично.
  2. Создайте в main описание указателя на функцию, соотв. созданным функциям
  3. Вызовите с помощью указателя первую и вторую ф-ии с одинаковыми значениями переменных, выведите результаты
  4. Выведите значения аргументов, с которыми вызывали ф-ии
  5. Измените функции, чтобы они принимали адреса переменных. Пусть вторая из функций обменивает значения переменных.
  6. Вызовите новые ф-ии с теми же значениями. Результаты работы функций не должны отличаться)
  7. Выведите в конце и переменные, значения дб. изменены

Код:

#include <stdio.h>
#pragma warning(disable:4996)
 
int sum(int a, int b) {
    return a + b;
}
 
int diff(int a, int b) {
    return a - b;
}
 
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
 
int main() {
    int (*pf1)(int, int) = sum;
    int (*pf2)(int, int) = diff;
    int a = 10, b = 20;
 
    int result1 = (*pf1)(a, b);
    int result2 = (*pf2)(a, b);
 
    printf("Result 1: %d\n", result1);
    printf("Result 2: %d\n", result2);
 
    pf1 = diff;
    pf2 = swap;
 
    (*pf1)(&a, &b);
    (*pf2)(&a, &b);
 
    printf("a: %d\n", a);
    printf("b: %d\n", b);
 
    return 0;
}

Что не так и как исправить?

Ответы

▲ 1Принят

Ваши ошибки:

  • "Измените функции, чтобы они принимали адреса переменных. Пусть вторая из функций обменивает значения переменных." -- Вы поменяли вызов функции, но не сами функции, отсюда и ошибки. pf2 = swap -- несостыковка типов, (*pf1)(&a, &b); -- функция принимает интовые значения, а вы ей -- указатели. Соответственно функции из 1 и 5 заданий должны быть разными.
  • Мне кажется, что в задании имелось в виду не заменить одну из функций на функцию обмена значений, а добавить обмен значений в существующую. Это было бы логичней в контексте задания.
  • Вы пропустили 4 и 6 задания.

Итоговая программа должна выглядеть примерно так:

#include <stdio.h>
#pragma warning(disable:4996)
 
int sum(int a, int b) {
    return a + b;
}
 
int diff(int a, int b) {
    return a - b;
}

int sum_modified(int *a, int *b) {
    return *a + *b;
}

int diff_modified(int *a, int *b) {
    int res = *a - *b;
    int temp = *a;
    *a = *b;
    *b = temp;
    return res;
}

int main() {
    int (*pf1)(int, int) = sum;
    int (*pf2)(int, int) = diff;
    int a = 10, b = 20;
 
    int result1 = (*pf1)(a, b);
    int result2 = (*pf2)(a, b);
 
    printf("Result 1: %d\n", result1);
    printf("Result 2: %d\n", result2);
    
    printf("a: %d\n", a); // Задание 4
    printf("b: %d\n\n", b);
 
    int (*pf_mod1)(int *, int *) = sum_modified;
    int (*pf_mod2)(int *, int *) = diff_modified;

    int result_mod1 = (*pf_mod1)(&a, &b);
    int result_mod2 = (*pf_mod2)(&a, &b);
 
    printf("Result 1: %d\n", result_mod1); // Задание 6
    printf("Result 2: %d\n", result_mod2);
    
    printf("a: %d\n", a);
    printf("b: %d\n", b);
 
    return 0;
}