• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

liczenie całki przybliżonej C

42 Warsaw Coding Academy
0 głosów
993 wizyt
pytanie zadane 8 czerwca 2016 w C i C++ przez Filius Gaduła (4,120 p.)

męczę się z napisaniem prostego programu do liczenia całek metodą prostokątów

może ktoś znajdzie błąd

​
#include <stdio.h>
#include<stdlib.h>
#include <math.h>
#define L_PRZEDZIALOW 1000


double calka(double f(double x), double a, double b, double delta);

int main()
{
    double a, b;
    puts("Podaj a i b:");
    scanf("%d%d", &a, &b);
    double delta = (double) abs(b-a)/ (double)L_PRZEDZIALOW;

    double wynik = calka(sin(a), a, b, delta);

    printf("Wynik calki: %lf", wynik);

    return 0;
}

double calka(double f(double x), double a, double b, double delta)
{
    double suma=0;
    for(int i=0;  i < L_PRZEDZIALOW; i++)
    {
        suma += f((double)a+i*delta)*delta;
    }
    return suma;
}

1 odpowiedź

0 głosów
odpowiedź 8 czerwca 2016 przez draghan VIP (106,230 p.)
wybrane 8 czerwca 2016 przez Filius
 
Najlepsza
  1. Zamiarujesz wczytać double, w łańcuchu formatującym oczekujesz typów całkowitych.
  2. Masz błąd w wywołaniu funkcji calka() - chciałbyś przekazać do tej funkcji adres funkcji sin(), zaś Ty wywołujesz funkcję sin() z parametrem a.
komentarz 8 czerwca 2016 przez Filius Gaduła (4,120 p.)

ok 1 błąd to zmieniałem typ zmiennych zapomniałem zmienić w scanf

ad 2 to mam funkcję calka()

przerobić na  double calka(double *f(double x), double a, double b, double delta);

tylko co podać jako argument funkcji sin() ?

komentarz 8 czerwca 2016 przez draghan VIP (106,230 p.)

Co do 2. Możesz przerobić, chociaż to i tak (przynajmniej w GCC) działa.
Zauważ, że Ty nie chcesz podawać w wywołaniu funkcji calka() argumentu do sin(), bo to spowoduje po prostu wywołanie sin().

Powinieneś podać po prostu adres funkcji sin(), bez żadnego argumentu. Możesz to zrobić dwojako.

double wynik = calka(&sin, a, b, delta); // za pomocą operatora referencji - zauważ brak nawiasów dla argumentów
double wynik = calka(sin, a, b, delta); // lub po prostu przy pomocy nazwy funkcji - brak nawiasów dla argumentów jest dla kompilatora wystarczającą wskazówką

 

Podobne pytania

0 głosów
0 odpowiedzi 325 wizyt
pytanie zadane 22 marca 2021 w C# przez Avernis Nałogowiec (27,400 p.)
0 głosów
1 odpowiedź 529 wizyt
0 głosów
1 odpowiedź 869 wizyt
pytanie zadane 12 września 2019 w Matematyka, fizyka, logika przez adam11 Użytkownik (570 p.)

93,379 zapytań

142,380 odpowiedzi

322,533 komentarzy

62,734 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...