Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Asp güne göre bedel hesalama

Konu, 'ASP' kısmında sdaricim tarafından paylaşıldı.

  1. sdaricim

    sdaricim Üye

    Kayıt:
    28 Ocak 2017
    Mesajlar:
    41
    Beğenilen Mesajlar:
    1
    Şehir:
    ankara
    Merhabalar, aşağıdaki soru için yardımcı olabilir misiniz. Bir türlü beceremedim bu işi.

    Adsız.jpg
     
  2. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    visual studioyu kapamıştım, cevabı notePad de javascript ile yazdım, az zaman aldı ve test etmesi kolay oldu.
    mantığı kaparsın. Olmadı yarın C# ile tam yazarım.

    HTML:
    <html>
    <body>
    <div id="dvSonuc" style="border: 1px solid gray; padding: 4px; width: 100px;"></div>
    
    <script>
        var sonucTutar = document.getElementById("dvSonuc"); // sonuç bu alana
    
        var arrGun = [3, 7, 6, 6];
        var arrTL = [5, 10, 15, 20];
    
        let toplamGun = 15;  // adam arabayı kaç gün bırakmışsa. değişken rakam gelecek.
        let dilimTutar = 0;
        let carpimGun = 0;
        let sonToplam = 0;
    
        for (i = 0; toplamGun > 0 && i < arrGun.length; i++)
        {
            carpimGun = arrGun[i] >= toplamGun ? toplamGun : arrGun[i];
            dilimTutar = carpimGun * arrTL[i];
            sonToplam += dilimTutar;
            toplamGun = toplamGun - arrGun[i];
      
        }
        sonucTutar.innerText = sonToplam;
    
    </script>
    </body>
    </html>
    Şimdi burada ben kestirmeden gittim. Yukarda arrGun ve arrTL isimli 2 adet integer dizi var array var.
    arrGun dizisinin içine tablodan ID sırası ile okuduğun ilk_gun ile son_gun farkını alıp koyacaksın.
    arrTL içinede karşılığı TL tutarı.
    kalanı matematik.
    dizi kaç elemanlı olursa olsun, yani tablonda ilave rakamlar girsen yada çıkarsan yine hesabını yapar.
    Aslında son satırda adam ya arabayı 300 gün bıraktı ise. Son satırda tabloya ilk_gun 26 son_gun 10000 gibi bir rakam girersen, adam 26 günden sonrasını son satırdaki TL ye göre hesaplar.

    tabi gece vakti detaylı test etmedim, bişeyler ters giderse söylersin.
    kolay gelsin.
     
    Son düzenleme: 13 Ağustos 2017
  3. sdaricim

    sdaricim Üye

    Kayıt:
    28 Ocak 2017
    Mesajlar:
    41
    Beğenilen Mesajlar:
    1
    Şehir:
    ankara
    hocam veritabanındaki veriler sabit değil ayrıca artıp azalabiliyor. bu sorunu nasıl aşacam?
     
  4. sdaricim

    sdaricim Üye

    Kayıt:
    28 Ocak 2017
    Mesajlar:
    41
    Beğenilen Mesajlar:
    1
    Şehir:
    ankara
    veya şöyle yapabilir miyiz. js bilgim az olduğundan her satır kod un nasıl çalıştığını (ne işe yaradığını) yazabilirseniz ben asp ye çevireyim.
     
  5. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    Veritabanında verilerin değişmesi yada artıp azalması yukardaki kodları bozmuyor. Kodlar esenek, veritabanından ne gelirse ona göre hesap yapıyor.

    ASP demişsin, asp yi çoktan unuttum, o sebeple senin istediğin gibi kodların açıklamalarını yazayım ama C# la yazayım. asp den pek farklı olmaması gerekir.

    Tabi önce test edeyim farklı verilerle nasıl davranıyor. Mesela tabloda kayıt yoksa, yada, arabanın beklediği gün sayısı yüksekse, bazen adam ölüyor arabası garajda kalıyor, mirasçıları yıllar sonra gelip alıyor. Ve sınır değerler gireyim. Hiç test yapmadım, html olarak çalıştırdıysan senin bulduğun rakamı buldu.

    Test yapayım sonra son halini C# olarak yapıştırayım.
     
  6. sdaricim

    sdaricim Üye

    Kayıt:
    28 Ocak 2017
    Mesajlar:
    41
    Beğenilen Mesajlar:
    1
    Şehir:
    ankara
    sağolasın hocam,
    yalnız veritabanında ilk id nin ilk günü her zaman sıfır (0)
    son id nin son günü ise her zaman 99999 (vertabanının hepsini almadım kafa karıştırmaması için, veritabanında 5. id yi 99999 olarak düşünebilirsin.)
     
  7. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    Bugün bilgisayarın başına geç oturdum, C# la yazmak gözüme uzun göründü, en iyisi senin istediğin gibi açıklamalı yazayım kod alanını.
    zaten hesabı yapan kısım çok kısa ve basit.

    Hesabı yapan kısım bu.
    HTML:
        let toplamGun = 15;  // adam arabayı kaç gün bırakmışsa. değişken rakam gelecek.
        let dilimTutar = 0;
        let carpimGun = 0;
        let sonToplam = 0;
    
        for (i = 0; toplamGun > 0 && i < arrGun.length; i++)
        {
            carpimGun = arrGun[i] >= toplamGun ? toplamGun : arrGun[i];
            dilimTutar = carpimGun * arrTL[i];
            sonToplam += dilimTutar;
            toplamGun = toplamGun - arrGun[i];
        }
       
    Şimdi tek tek açıklayayım.
     
  8. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    let komutu değişken tanımlıyorum demek.
    let toplamGun = 15;
    Burada toplamGun isimli değişken tanımladım, içinede arabanın kullanıldığı toplam günü koydum.

    Let yerine asp de rakam tanımlamak için kullanılan komutu kullanacaksın. C# da int

    toplamGun rakamını, sen hesaptatıyosun, adamın ilk giriş günü ile çıkış gününü birbirinden çıkarıyosun.
    O rakamı toplamGun alanı içine koymalısın.


    let lerin hepsi rakam değişken tanımlamak için. C# karşılığı int yani integer
     
    Son düzenleme: 14 Ağustos 2017
  9. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    var arrGun = [3, 7, 6, 6];
    var arrTL = [5, 10, 15, 20];

    var kelimesinin karşılığı C# da array a denk geliyor. Rakam dizi Dizi tanımladım.

    arrGun dizisi içindeki rakamlar senin tablodan alınma.
    Tablodan ilk_gun ve son_gunu okuduktan sonra birbirinden çıkarıp

    arrGun tablosu elemanına koyacaksın, aynı tablodaki tutar alanındaki rakamıda arrTL dizisine koyacaksın.
    Bu kısımda karmaşık bişey varmı bilmiyorum. Dizi kullanmayı biliyorsundur.

    Örnek C# kodu ezbere yazayım

    TABLODAN select ediyoruz.
    SELECT (son_gun - ilk_gun) AS farkGun, fiyat FROM gunTablosu ORDER BY id

    int ii = 0;
    while dr.read() {
    arrGun[ii] = dr.getString(0);
    arrTL[ii] = dr.getString(1);
    }

    diziyi doldurduk.
    ilk satırın ilk_gun rakamı 0 olsa sonGun rakamı 3 sonuç ne çıkar. 3 -0=3

    dizileri bu şekilde doldurduk, sonuç şu oldu diyelim. son satırda son_gun 99999 olsun.

    99999 - 26 = 99973

    var arrGun = [3, 7, 6, 6, 99973];
    var arrTL = [5, 10, 15, 20, 25];

    2 dizinin eleman sayıları aynı. SELECT satırındaki order by önemli. id düşükten büyüğe gitmeli ASC miydi DESC miydi aklımda değil şimdi.
     
  10. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    diziler elimizde, tablodan select edip doldurduk.

    var arrGun = [3, 7, 6, 6, 99973];
    var arrTL = [5, 10, 15, 20, 25];

    şimdi hesap kısmına geçelim.

    tabi bu hesaba araba kaç gün kullanılmış oda hazır gelmeli. Senin örnekte 15 idi.
    rakam değişken alan tanımlıyorum araba kullanılan gün için.

    let toplamGun =0; // sıfır ilk değer veriyoruz. C# karşılığı int toplamGun = 0;

    daha sonra kullanacağımız rakam değişkenleride tanımlıyoruz. Hepsi arakam için.

    let toplamGun = 15; // toplam kaç günlük para alınacak. araba garajda kaç gün kalmış.
    let dilimTutar = 0; // tablodaki her satır için hesaplanacak tutar. her seferinde son toplam tutara eklenecek.
    let carpimGun = 0; // tablodaki satırdaki gün farkı. yani arrGun dizisinin her bir elemanı.
    let sonToplam = 0; // Müşteriden alacağımız son toplam. dilimTutar ların toplamı.
     
  11. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    Şimdi hesap kısmına geldik. bir if hariç basit matematik hesabı.

    HTML:
    
    for (i = 0; toplamGun > 0 && i < arrGun.length; i++)
        {
            carpimGun = arrGun[i] >= toplamGun ? toplamGun : arrGun[i];
            dilimTutar = carpimGun * arrTL[i];
            sonToplam += dilimTutar;
            toplamGun = toplamGun - arrGun[i];
    
        }



    for döngüsü bütün dillerde nerdeyse aynı.
    ilk satır.
    for (i = 0; toplamGun > 0 && i < arrGun.length; i++)
    &&
    operatörü VE demek. sanırım VB de AND konuyor.
    & işaretide VE demek. ikisinden birini kullanabilirsin, bu döngüde fark etmiyor.

    ne kontrolu var, birincisi toplamGun > 0 sa demişim.
    tablodaki her satır(dilim) için hesap yaptığımda, dilim gün sayısını toplamGün den düşeceğim.
    Bu sayede son dilimin kaç güne denk geldiğini bulacağım.
    Örneğin tabloda ilk satır gün farkı 3 gün, tutar 5 TL. tablodan 3 ü aldın adamda 5 gün arabayı bırakmış.
    5 den ilk dilim 3 düşünce 2 kalacak toplamGun içinde. Sonraki tablodaki gün farkı 7 gün. 2 den 7 düşünce -5 kalacak.
    eksi olduğu için döngüden çıkacak.
     
    Son düzenleme: 14 Ağustos 2017
  12. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    HTML:
    carpimGun = arrGun[i] >= toplamGun ? toplamGun : arrGun[i];
    bu satır önemli Kilit satır. Son dilimi bulmak için gerekli.

    Bu satır aslında kısaltma. Uzun yazılışı şöyle.

    HTML:
    if (arrGun[i] >= toplamGun)
    {
       carpimGun = toplamGun;
    }
    else
    {
       carpimGun = arrGun[i];
    }

    Bu ne demek.
    diyelimki araba 5 gün bırakıldı. Tablodaki ilk dilim yani ilk satırdaki gün farkı ne 3. İkinci dilim 7.

    Adam 5 gün bırakmış. döngüye ilk girdi, ilk dilim 3 gün, toplamGun değeri ise şu an 5.
    3 büyük veya eşitmi 5 den.? if (arrGun >= toplamGun)
    hayır.
    o zaman carpimGun = arrGun; yani 3 ile tutarı çarpıp bu dilimin ederini alıyoruz.

    toplamGun olan 5 den 3ü çıkardık =2.
    toplamGun = toplamGun - arrGun; toplamGun ikinci dönüşte 2.

    döngüde bir sonraki tur.

    if (arrGun >= toplamGun) yani 7 >= mi 2 den.
    evet.
    carpimGun = toplamGun; yani 2 ile tıutarı çarpıp ederi buluyoruz.

    sonToplam += dilimTutar;
    bunun açılımı
    sonToplam = sonToplam + dilimTutar;
     
    Son düzenleme: 14 Ağustos 2017
  13. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    677
    Beğenilen Mesajlar:
    185
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    hem asp hem js bilen biri bunu 2 dakkada çevirir ya.?
    artık idare edicez.
     
  14. sdaricim

    sdaricim Üye

    Kayıt:
    28 Ocak 2017
    Mesajlar:
    41
    Beğenilen Mesajlar:
    1
    Şehir:
    ankara
    hocam hallettim sayenizde. belki birilerinin işine yarar

    kodlar;
    PHP:
    <%
    bekledigi_gun=13
    Do While bekledigi_gun 0    
    gun_fark 
    detay("son_gun") - detay("ilk_gun")  
    if 
    gun_fark >= bekledigi_gun then
       carpimGun 
    bekledigi_gun
    else
       
    carpimGun gun_fark
    end 
    if
    bekledigi_gun bekledigi_gun gun_fark
    dilimTutar 
    carpimGun cint(detay("fiyat"))
    sonToplam sonToplam dilimTutar
    %>
    <%
    detay.MoveNext:Loop:detay.Close:set detay=nothing%>
    <%=
    sonToplam%><br />
     
    Son düzenleme: 15 Ağustos 2017
    sedirAğacı bunu beğendi.