1

Тема: Обчислення функції

Добрий вечір! Виникли проблеми щодо використання покажчика. Створила відповідну функцію для вичислення y, але не розумію помилку, чому результат не виводиться. От відчуваю, що сліпа і відповідь на поверхні

#include <stdio.h>
#include <math.h>
#include <locale.h>

int main ()
{
    int a, *p;
    p = &a; //adress of a
    float b, *pp; // 12/10 or 6/5
    pp = &b; //adress of b
    double y, *py; 
    py = &y;
    
    *p = 3;
    printf("a = %d \n", a);
    *pp = 1.2;
    printf("b = %f \n", b); // output on display data
    calc(py, a, b);
    printf("Solution result: %lf \n", y);
}
void calc (double *y) //function for calculation y
{
    int a;
    double b, tan(b);
    *y = (5/a*a)+tan(b*b); //formula 
}

2

Re: Обчислення функції

Локальні змінні в різних функціях - це РІЗНІ змінні. int a в main і int a в calc можуть мати різні значення. В calc ви їх ніяк не ініціалізуєте, відповідно і значення виходить неадекватним. Вам треба не проголошувати нові змінні в calc, а передавати a та b параметрами.
А ще 5/a*a для цілих дає, швидше за все, зовсім не той результат, на який ви розраховуєте, але оскільки ви вирішили не показувати нам умову, то я не можу вам нічого порадити.

Подякували: leofun011

3

Re: Обчислення функції

koala написав:

Локальні змінні в різних функціях - це РІЗНІ змінні. int a в main і int a в calc можуть мати різні значення. В calc ви їх ніяк не ініціалізуєте, відповідно і значення виходить неадекватним. Вам треба не проголошувати нові змінні в calc, а передавати a та b параметрами.
А ще 5/a*a для цілих дає, швидше за все, зовсім не той результат, на який ви розраховуєте, але оскільки ви вирішили не показувати нам умову, то я не можу вам нічого порадити.

Мені треба було написати програму, яка обчислює арифметичний вираз, при тому, що використовуються покажчики на значення змінних.
Сама функція: y = 5/a^2 + tg(b^2), a та b відомі. a = 3, b = 1.2

4

Re: Обчислення функції

MaxPluto написав:

Сама функція: y = 5/a^2 + tg(b^2), a та b відомі. a = 3, b = 1.2

... використовуються покажчики на значення змінних.

Яких ? (там багато варіантів)

#include <math.h>
#include <stdio.h>

float function_simple(float const, float const);
float function_args_ptr(float const *const, float const *const);
void function_result_ptr(float const, float const, float *const);
void function_all_ptr(float const *const, float const *const, float *const);

int main(int argc, char const *const *argv) {
    float a = 3.f, b = 1.2f, y = 0.f,
        *a_ptr = &a,
        *b_ptr = &b,
        *y_ptr = &y;
    {
        float (*f)(float const, float const)
            = function_simple;
        y = f(a, b);           // or
        y = f(*a_ptr, *b_ptr); // or
        *y_ptr = f(a, b);      // or
        *y_ptr = f(*a_ptr, *b_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    } {
        float (*f)(float const *const, float const *const)
            = function_args_ptr;
        y = f(&a, &b);         // or
        y = f(a_ptr, b_ptr);   // or
        *y_ptr = f(&a, &b);    // or
        *y_ptr = f(a_ptr, b_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    } {
        void (*f)(float const, float const, float *const)
            = function_result_ptr;
        f(a, b, &y);           // or
        f(*a_ptr, *b_ptr, &y); // or
        f(a, b, y_ptr);        // or
        f(*a_ptr, *b_ptr, y_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    } {
        void (*f)(float const *const, float const *const, float *const)
            = function_all_ptr;
        f(&a, &b, &y);         // or
        f(a_ptr, b_ptr, &y);   // or
        f(&a, &b, y_ptr);      // or
        f(a_ptr, b_ptr, y_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    }
    return 0;
}
float function_simple(float const a, float const b) {
    return 5.f / (a * a) + tan(b * b);
}
float function_args_ptr(float const *const a, float const *const b) {
    return function_simple(*a, *b);
}
void function_result_ptr(float const a, float const b, float *const result) {
    *result = function_simple(a, b); // or
    // *result = function_args_ptr(&a, &b);
}
void function_all_ptr(float const *const a, float const *const b, float *const result) {
    *result = function_simple(*a, *b); // or
    // *result = function_args_ptr(a, b); // or
    // function_result_ptr(*a, *b, result);
}

5

Re: Обчислення функції

leofun01 написав:
MaxPluto написав:

Сама функція: y = 5/a^2 + tg(b^2), a та b відомі. a = 3, b = 1.2

... використовуються покажчики на значення змінних.

Яких ? (там багато варіантів)

#include <math.h>
#include <stdio.h>

float function_simple(float const, float const);
float function_args_ptr(float const *const, float const *const);
void function_result_ptr(float const, float const, float *const);
void function_all_ptr(float const *const, float const *const, float *const);

int main(int argc, char const *const *argv) {
    float a = 3.f, b = 1.2f, y = 0.f,
        *a_ptr = &a,
        *b_ptr = &b,
        *y_ptr = &y;
    {
        float (*f)(float const, float const)
            = function_simple;
        y = f(a, b);           // or
        y = f(*a_ptr, *b_ptr); // or
        *y_ptr = f(a, b);      // or
        *y_ptr = f(*a_ptr, *b_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    } {
        float (*f)(float const *const, float const *const)
            = function_args_ptr;
        y = f(&a, &b);         // or
        y = f(a_ptr, b_ptr);   // or
        *y_ptr = f(&a, &b);    // or
        *y_ptr = f(a_ptr, b_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    } {
        void (*f)(float const, float const, float *const)
            = function_result_ptr;
        f(a, b, &y);           // or
        f(*a_ptr, *b_ptr, &y); // or
        f(a, b, y_ptr);        // or
        f(*a_ptr, *b_ptr, y_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    } {
        void (*f)(float const *const, float const *const, float *const)
            = function_all_ptr;
        f(&a, &b, &y);         // or
        f(a_ptr, b_ptr, &y);   // or
        f(&a, &b, y_ptr);      // or
        f(a_ptr, b_ptr, y_ptr);
        printf_s("y : %f,\t f addr : %p\r\n", y, f);
    }
    return 0;
}
float function_simple(float const a, float const b) {
    return 5.f / (a * a) + tan(b * b);
}
float function_args_ptr(float const *const a, float const *const b) {
    return function_simple(*a, *b);
}
void function_result_ptr(float const a, float const b, float *const result) {
    *result = function_simple(a, b); // or
    // *result = function_args_ptr(&a, &b);
}
void function_all_ptr(float const *const a, float const *const b, float *const result) {
    *result = function_simple(*a, *b); // or
    // *result = function_args_ptr(a, b); // or
    // function_result_ptr(*a, *b, result);
}

Щиро Вам дякую за такий приклад! :) На жаль, в мене самої недостатньо інформації з приводу завдання, викладач без потрібного контексту надсилає умови, тому дію як сліпе кошеня.

6

Re: Обчислення функції

Викладач довіряє вам самостійно обирати варіант.
Думаю, малося на увазі, що функція має бути проголошена, як function_args_ptr, але не викликати іншу функцію, а обчислювати всередині з вказівниками.

Подякували: MaxPluto1

7

Re: Обчислення функції

koala написав:

Викладач довіряє вам самостійно обирати варіант.
Думаю, малося на увазі, що функція має бути проголошена, як function_args_ptr, але не викликати іншу функцію, а обчислювати всередині з вказівниками.

Дійсно, мабуть так і потрібно зробити. Дякую!