Pomoc dla początkującego (funkcje do której są przekazywane liczby)

0

Mam napisać program który ma obliczyć wyrażenia matematyczne z polecenia. Kod który napisałem wygląda następująco, jednak cały czas mi wyskakują errory, czy ktoś mi mógłby podpowiedzieć jakieś zmiany, by działało jak należy, z góry dziękuje. Oto kod:

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

#pragma warning (disable : 4996) //zezwala na użycie scanf i printf

int fun_scan(double* a, double* b, double* c, double* d)
{
    printf("Podaj 4 liczby:\n ");
    return 4 == scanf("%lf %lf %lf %lf", a, b, c, d);
}

double f1(double* a, double* b, double* c, double* d)
{
    double k = double(((a + b) / (c - d)) - ((c + d)/a) + b);
    return k;
}

double f2(double* a, double* b, double* c, double* d)
{
    double k = double(a - sin(b / c + d));
    return k;
}

double f3(double* a, double* b, double* c, double* d)
{
    double k = double(log(a / (b - c)) + d);
    return k;
}
void fun_print(double f1, double f2, double f3)
{
    printf("%lf %lf %lf\n",f1, f2, f3);
}


int main()
{
    double a, b, c, d;
    fun_scan(&a, &b, &c, &d);
    f1(&a, &b, &c, &d);
    f2(&a, &b, &c, &d);
    f3(&a, &b, &c, &d);
    fun_print(f1, f2, f3);
    return 0;
}
0

Ja np nie wiem

0

Jakie errory, w których linijkach?

Wydaje mi się, że tak się nie rzutuje w C++: double(...).
Poza tym, jak wszędzie używasz double i log też zwraca double, to nie musisz tam rzutować...

0

Poprawiłem kod:

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

#pragma warning (disable : 4996) //zezwala na użycie scanf i printf

int fun_scan(double* a, double* b, double* c, double* d)
{
    printf("Podaj 4 liczby:\n ");
    return 4 == scanf("%lf %lf %lf %lf", a, b, c, d);
}

double f1(double* a, double* b, double* c, double* d)
{
    double k = ((a + b) / (c - d)) - ((c + d)/a) + b;
    return k;
}

double f2(double* a, double* b, double* c, double* d)
{
    double k = a - sin(b / c + d);
    return k;
}

double f3(double* a, double* b, double* c, double* d)
{
    double k = log(a / (b - c) + d);
    return k;
}
void fun_print(double f1, double f2, double f3)
{
    printf("%lf %lf %lf\n",f1, f2, f3);
}


int main()
{
    double a, b, c, d;
    fun_scan(&a, &b, &c, &d);
    f1(&a, &b, &c, &d);
    f2(&a, &b, &c, &d);
    f3(&a, &b, &c, &d);
    fun_print(f1, f2, f3);
    return 0;
}

A errory które wyskakują to:

Error C2110 '+': cannot add two pointers Zad3lab2 C:\Users\fixu2\source\repos\Zad3lab2\Zad3lab2\Zad3lab2.cpp 16
Error C2296 '/': illegal, left operand has type 'double *' Zad3lab2 C:\Users\fixu2\source\repos\Zad3lab2\Zad3lab2\Zad3lab2.cpp 22
Error (active) E2138 expression must have arithmetic or unscoped enum type Zad3lab2 C:\Users\fixu2\source\repos\Zad3lab2\Zad3lab2\Zad3lab2.cpp 28
errorów jest 15, ale wszystkie składają się z tych 3.

3

Przeczytałeś te błędy? Przecież one bardzo jasno mówią co nie działa i jak należy poprawić. Próbujesz dodawać (i dzielić) do siebie wskaźniki. Najpierw wykonaj ich dereferencję. Albo jeszcze lepiej, nie przekazuj liczb przez wskaźniki.

5

Do tych funkcji, które wykonują działania przekazujesz wskaźniki na double, więc operacje, które wykonujesz, robisz na wskaźnikach. Aby działać na wartościach zmień to po prostu na:
na przykładze f1, reszta analogicznie

double f1(double* a, double* b, double* c, double* d)
{
    double k = ((*a + *b) / (*c - *d)) - ((*c + *d)/*a) + *b;
    return k;
}

A najlepiej, jeśli nie musisz przekazywać wskaźników, to:

double f1(double a, double b, double c, double d)
{
    double k = ((a + b) / (c - d)) - ((c + d)/a) + b;
    return k;
}

Różnica jest taka, że w pierwszej wersji przekazujesz adres zmiennej double, czyli działasz na tym samym obszarze pamięci co poza tą funkcją - możesz wartość tej zmiennej edytować w środku funkcji. W drugiej wersji przekazujesz kopie zmiennej double, więc nie możesz edytować jej w środku. W tym przypadku, gdy są to typy proste i nie edytujesz ich w środku funkcji, jest to wskazane.

EDIT:
Tak jak napisał @Spine Przeoczyłem to, że wtedy inaczej wygląda wywołanie funkcji. czyli w sytuacji gdy przekazujesz kopie nie musisz wyciągać adresu przy pomocy &:

    f1(a, b, c, d);

Do tego jeszcze jedna rzecz, nie możesz printować w ten sposób wyniku funkcji fun_print(f1, f2, f3);, zapisz to sobie do jakiejś lokalnej zmiennej i wtedy printuj:

double f1_result = f1(a, b, c, d)
...
fun_print(f1_result, f2_result, f3_result);
3

@Trisolaris: Tylko przydałoby się wspomnieć, że wywołanie funkcji f1 będzie z argumentami bez &.

@Mariusz Gamrat: to co zwraca fun_scan jest niepotrzebne, bo nigdzie tego nie używasz, poza tym typ zwracany bardziej pasuje do bool, a nie int.

0

Kod poprawiony, wszystko działa, bardzo dziękuje za wszystkie sugestie, już wiem że muszę jeszcze dużo przeczytać o tym jak używać wskaźników.

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

#pragma warning (disable : 4996) //zezwala na użycie scanf i printf

void fun_scan(double* a, double* b, double* c, double* d)
{
    printf("Podaj 4 liczby:\n ");
    scanf("%lf %lf %lf %lf", a, b, c, d);
}

double f1(double a, double b, double c, double d)
{
    double k = ((a + b) / (c - d)) - ((c + d)/a) + b;
    return k;
}

double f2(double a, double b, double c, double d)
{
    double k = a - sin(b / c + d);
    return k;
}

double f3(double a, double b, double c, double d)
{
    double k = log(a / (b - c) + d);
    return k;
}
void fun_print(double f1, double f2, double f3)
{
    printf("%lf %lf %lf\n",f1, f2, f3);
}


int main()
{
    double a, b, c, d;
    fun_scan(&a, &b, &c, &d);
   double f1_result = f1(a, b, c, d); 
   double f2_result = f2(a, b, c, d);
   double f3_result = f3(a, b, c, d); 
   fun_print(f1_result, f2_result, f3_result);
    return 0;
}
2

Da się zapisać bez dodatkowej zmiennej:

double f3(double a, double b, double c, double d) { return  log(a / (b - c) + d); }
2
Mariusz Gamrat napisał(a):

Mam napisać program który ma obliczyć wyrażenia matematyczne z polecenia. Kod który napisałem wygląda następująco, jednak cały czas mi wyskakują errory, czy ktoś mi mógłby podpowiedzieć jakieś zmiany, by działało jak należy, z góry dziękuje. Oto kod:

Dziwne, że nikt nie upomina się jak wyglądają te wyrażenia matematyczne z polecenia.
Nie zdziwiłbym się, gdyby polecanie swoje, a ten kod swoje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1