• C Dili ile İntegral Hesabı ve Grafiksel Yorumu

    Okulda Programlaya Giriş dersinde yaptığımız ödevi paylaşmak istedim. İntegral Nedir? Bir fonksiyon eğrisinin altında kalan alan diyebiliriz ancak şöyle bi sıkıntımız var ki eğrinin alanını nasıl bulabiliriz? Aslında bu sorunu matematikçiler şöyle çözmeye çalışmış: Eğriyi birçok küçük parçaya bölerek alanlarını almışlar (farklı yöntemlerle). lecture18 Gelelim Kodumuza geçelim. DENEMEK İSTEYENLER İÇİN #include <stdio.h> #include <stdlib.h> #include…

C Dili ile İntegral Hesabı ve Grafiksel Yorumu

Okulda Programlaya Giriş dersinde yaptığımız ödevi paylaşmak istedim.

İntegral Nedir?

Bir fonksiyon eğrisinin altında kalan alan diyebiliriz ancak şöyle bi sıkıntımız var ki eğrinin alanını nasıl bulabiliriz? Aslında bu sorunu matematikçiler şöyle çözmeye çalışmış:

Eğriyi birçok küçük parçaya bölerek alanlarını almışlar (farklı yöntemlerle).

lecture18

Gelelim Kodumuza geçelim.

DENEMEK İSTEYENLER İÇİN

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

int main(int argc,char **argv)
{
    char fonksiyon[50];
    int a,i,b,katsayi,sabitsayi,kss,uss,sonuc,toplam;
    int katsayilar[10];
    int usler[10];
    float birincisayi,ikincisayi,bolmesayisi;
    char yontem[50];
    
    printf("Fonksiyonu Giriniz. (3x^4+2x+5 gibi)\n");
    scanf("%s",fonksiyon);
    printf("Aralığın Başlangıç Noktasını Giriniz.\n");
    scanf("%f",&birincisayi);
    printf("Aralığın Son Noktasını Giriniz.\n");
    scanf("%f",&ikincisayi);
    printf("Fonksiyonun Bölünme Sayısını Giriniz.\n");
    scanf("%f",&bolmesayisi);
    printf("Yöntemi Giriniz.(Midpoint,Rectangle,Simpsons,Trapezoid)\n");
    scanf("%s",yontem);

    i=0;
    b=0;
    kss=0;
    uss=0;
    katsayi=1;

    a=strlen(fonksiyon);//Fonksiyonun uzunluğunu for içinde
                       //kaç kez döndürüleceğini hesaplamak
    while(i<a)        //için fonksiyonun uzunluğunu hesapladım.
    {
        if(fonksiyon[i]=='+')
        {//fonksiyonda +'yı yakaladığında + ile x arasındaki
        // değerleri usler'e atıyor.
            usler[uss]=katsayi;
            uss=uss+1;
            b=0;//katsayı değişkenin değerini sıfırlıyor
            katsayi=1;
        }

        if(fonksiyon[i]=='x')
        {//x değerini yakaladığında x'den öncekiler katsayı
        //olacağından dolayı katsayilar'a atıyor.
            katsayilar[kss]=katsayi;
            kss=kss+1;
            b=0;
            katsayi=1;
        }

        if(fonksiyon[i]=='-')
        {//- değerini bulduğunda bir sorgu yapıyor.
            if(fonksiyon[i-1]=='^')
            {//-'den önceki değer üs ise ve polinom fonksiyonda
            //öyle bir değer olamayacağı için program hata veriyor.
                printf("HATA! Geçerli bir fonksiyon giriniz.\n");
                return 0;
            }
            else
            {//eğer başka bir değerse katsayının eksisi olacağı için
            //katsayıyı -1 ile çarpıyor.
                katsayi=katsayi*(-1);
            }
        }


        if(fonksiyon[i]=='0'||fonksiyon[i]=='1'||fonksiyon[i]=='2'||
        fonksiyon[i]=='3'||fonksiyon[i]=='4'||fonksiyon[i]=='5'||
        fonksiyon[i]=='6'||fonksiyon[i]=='7'||fonksiyon[i]=='8'||fonksiyon[i]=='9')
        {//fonksiyonda sorgulanan değer sayı ise sayıyı
        //katsayi değişkenine atıyor
            b = b+1;

            if (b>1)
            {//eğer birden fazla basamaklı bir değer ise
            //bunu tespit etmek için b değişkeni atadım.
            //varolan katsayıyı 10 ile çarpıp ekliyor.
                katsayi = katsayi*10;
                katsayi = katsayi+(fonksiyon [i]-'0');
                //yukarıdaki işlem char'ı integer'e çeviriyor.

            }
            else
            {//b sayısı 0 ise direk olarak atıyor.
                katsayi = katsayi*(fonksiyon[i]-'0');

            }
            if ((i+1)==a)
            {//eğer fonksiyondaki son değerde isek
            //sabit sayımızı bulmuş oluyoruz.
                if(fonksiyon[i-1]!='^')//önceki değer üs işareti ise
                {sabitsayi=katsayi;//sabit sayı 0 olur.
                }
                else
                {
                sabitsayi=0;
                usler[uss]=katsayi;
                uss=uss+1;
                b=0;//katsayı değişkenin değerini sıfırlıyor
                katsayi=1;
                }
            }
        }

        i=i+1;
    }

    for(int y=0;y<uss;y++){
    printf("%d.değerin katsayısı=%d üssü=%d \n",y+1,katsayilar[y],usler[y]);
    }//Burada değerlerin özelliklerini yazdırdım.
    printf("Sabit sayı=%d\n",sabitsayi);
    //sabit sayıyı da yazdırdım.

    //fonksiyon parçalama işini halletikten sonra
   //fonksiyonda yerine yazma kısmına geldik.

    float u_toplam=0;
    float u_toplam2=0;
    float k_sonuc=0;
    float sayi=0;
    float h,p;

    h=(ikincisayi-birincisayi)/bolmesayisi;
    //h değişkeni farkı bulup bölme sayısına bölüyor
    //böylece her defasında eklenecek değeri buluyoruz.
    p=birincisayi+h;
    //p sonraki değerimiz oluyor.
    switch (yontem[0]){

        case 'M'://burada case değeri int bir değere
        case 'm'://eşit olması nedeniyle ilk harfe bakıyor.
            for(int l=1;l<bolmesayisi;l++){
            //bu döngü bölme sayısı kadar dönüyor.
                for(int j=0;j<uss;j++){
                //bu döngü her x kadar dönüyor.
                //midpointe göre ikisinin ort değerini bulup
                //fonksiyonda yerine yazmak lazım
                    sayi=(p+birincisayi)/2;
                    //ortalamayı buluyor
                    sayi=pow(sayi,usler[j]);
                    //önceden kendi yazdığım üs alma fonksiyonunu
                    //burada çalıştıramadığım için pow kullanmak
                    //zorunda kaldım.
                    sayi=sayi*katsayilar[j];
                    //her x katsayısını aldım.

                    u_toplam=sayi+u_toplam;
                    //hepsini u_toplam değerine aktardım.
                }
            u_toplam+=sabitsayi;
            //en son olarak sabit sayıyı topladım.
            u_toplam*=(p-birincisayi);
            //midpointe göre ikisinin farkı ile çarptım.
            k_sonuc += u_toplam;
            //her değeri karışmaması için k_sonuc'a aktardım.
            u_toplam=0;
            birincisayi = birincisayi + h;
            //yukarıda h kadar ilk sayımızı arttırıyoruz.
            p = p + h;//p de aynı şekilde artıyor.
            }
        break;


        case 'R'://Rectangle kuralına göre soldaki
        case 'r'://değeri ile aradaki farkı çarpmamızı istiyor.
            for(int l=1;l<bolmesayisi;l++){
                for(int j=0;j<uss;j++){
                    sayi=birincisayi;//ortalama bulmaya gerek kalmıyor.
                    sayi=pow(sayi,usler[j]);
                    sayi=sayi*katsayilar[j];
                    u_toplam=sayi+u_toplam;
                }//diğer işlem midpointteki gibi oluyor.
                u_toplam+=sabitsayi;
                u_toplam*=(p-birincisayi);
                k_sonuc += u_toplam;
                u_toplam=0;
                birincisayi = birincisayi + h;
                p = p + h;
            }
        break;

        case 'T':
        case 't':
            for(int l=1;l<bolmesayisi;l++){
                for(int j=0;j<uss;j++){//f(a) kısmını bulduk
                    sayi=birincisayi;
                    sayi=pow(sayi,usler[j]);
                    sayi=sayi*katsayilar[j];
                    u_toplam=sayi+u_toplam;
                }
                u_toplam+=sabitsayi;
                for(int j=0;j<uss;j++){//f(b) kısmını da bulduk
                    sayi=p;
                    sayi=pow(sayi,usler[j]);
                    sayi=sayi*katsayilar[j];
                    u_toplam=sayi+u_toplam;
                }
                u_toplam+=sabitsayi;
                u_toplam = u_toplam / 2;//Trapezoid kuralını
                u_toplam*=(p-birincisayi);//uyguladım
                k_sonuc += u_toplam;
                u_toplam=0;
                birincisayi = birincisayi + h;
                p = p + h;
        }
        break;


        case'S':
        case's':
        for(int l=1;l<bolmesayisi;l++){
            for(int j=0;j<uss;j++){//f(a) kısmı
                sayi=birincisayi;
                sayi=pow(sayi,usler[j]);
                sayi=sayi*katsayilar[j];
                u_toplam=sayi+u_toplam;
            }
            u_toplam+=sabitsayi;
            for(int j=0;j<uss;j++){//f(b) kısmı
                sayi=p;
                sayi=pow(sayi,usler[j]);
                sayi=sayi*katsayilar[j];
                u_toplam=sayi+u_toplam;
            }
            u_toplam+=sabitsayi;

            for(int j=0;j<uss;j++){//simpsons kuralındaki
                sayi=(p+birincisayi)/2;//ara değerin bulunması.
                sayi=pow(sayi,usler[j]);
                sayi=sayi*katsayilar[j];
                u_toplam2=sayi+u_toplam2;
            }//f((a+b)/2) kısmını karışmaması için u_toplam2'ye atadım.
            u_toplam2+=sabitsayi;
            u_toplam = u_toplam + 4*u_toplam2;//kuralın uygulanması
            u_toplam*=(p-birincisayi)/6;
            k_sonuc += u_toplam;
            u_toplam2=0;
            u_toplam=0;
            birincisayi = birincisayi + h;
            p = p + h;
        }
        break;
    }


    printf("%s Fonksiyonuna göre sonuç = |%f| \n",fonksiyon,k_sonuc);
    //Sonucumuzu yazdırıyoruz

    return 0;
}

 


Yorumlar

“C Dili ile İntegral Hesabı ve Grafiksel Yorumu” için 2 yanıt

  1. Alperen Arslan avatarı
    Alperen Arslan

    Merhabalar. Kodun 199. satırında,Trapezoid kuralının uygulandığı kısımda, u_toplam değişkenine direk atama yapmışsınız. Bu durumda f(a) dan gelen u_toplam değeri kaybolmaz mı? Yani,u_toplam değeri f(a) + f(b) değeri yerine sadece f(b) değeri olmaz mı? Cevaplarsanız sevinirim.

  2. muzafferkadir avatarı
    muzafferkadir

    Değişkeni sonradan kendisiyle topladık yani sayıyı kaybetmedik. u_toplam=sayi+u_toplam;

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir