• 12-07-2017, 11:34:25
    #1
    Merhabalar üstadlar,

    çok sıkıntı çektiğim bir konuyu danışmak istedim. 20 lik ve 40 lık tabir edilen araçlar düşünün. Bu araçlar otoparkda beklediği için bunlardan anlaşmamıza (standart ve toplamalı) göre bekleme bedeli alınıyor. Girdiği ve çıktığı tarih programda hesaplanarak gün farkı elde edilip tarifeye uygun gün aralığı ve araç boyutuna göre fiyatlandırılmalı fakat nasıl yapabileceğimi bulamadım.

    Veritabanı aşağıdadır. Ben bunu asp ile yazacam php bilen daha çok olduğu için buraya sormak istedim mantığı anlatırsanız asp yazmam daha kolay olur. yardımlarınızı beklerim.

  • 12-07-2017, 20:21:18
    #2
    Aslında soru programlamadan çok algoritma sorusu. Algoritmayı oturtursan herhangi bir dilde yazılabilir. Genel olarak bir cevap vermek istiyorum.
    Yazdıklarımı kod olarak değil işleyiş olarak düşün. Anlaşılması için uzun uzun yazdım. Test imkanı olmadığı için hata olursa affola.

    Öncelikle bir form yapılacak.

    1. Takvimden giriş ve çıkış günleri seçilecek. ($giris_tarihi, $cikis_tarihi)
    2. Aracın tipi seçilecek ($arac_tipi) // Databasedeki alan ile eşlemesi için fiyat_20 veya fiyat_40 değerleri almalı
    3. Tarife tipi seçilecek ($tarife_tipi)

    Formdan gelen verileri işleyen sayfa
    $bekledigi_gun = $cikis_tarihi-$giris_tarihi; //Çıkış tarihinden giriş tarihini çıkarıp gün sayısını buluyoruz.
    
    if($tarife_tipi=='1') // Standart tarife 
    {    
        $ucret = $db->query('select $arac_tipi from tarife_detay where tarife_id=1 and ilk_gun <= $bekledigi_gun and son_gun >= $bekledigi_gun');
    
        /*
    	Sorgu Açıklaması: Tarife Detay tablosundan tarife_id si 1 olan, ilk_gun değeri beklediği günden küçük, son_gun değeri beklediği günden büyük değerleri bul
    	Bulunan satırın arac tipine göre (fiyat_20 veya fiyat_40) degerini ver.
       */
    	
        $odenecek_tutar = $ucret*$bekledigi_gun;
        return $odenecek_tutar;		
    }
    else // Toplamalı tarife
    {
    	$birinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 0 and son_gun >= 15');
    	$ikinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 16 and son_gun >= 30');
    	$ucuncu_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 31 and son_gun >= 60');
    
       if($bekledigi_gun <=15)
    	{	  
    	   $odenecek_tutar = $birinci_kademe_fiyat*$bekledigi_gun;
    	   return $odenecek_tutar;			
    	}
        else if($bekledigi_gun >=16 and $bekledigi_gun >=30)
    	{
    	   $ikinci_kademe_gun = $bekledigi_gun-15;
               $odenecek_tutar = $birinci_kademe_fiyat*15 + $ikinci_kademe_fiyat*$ikinci_kademe_gun; 
     	return $odenecek_tutar;		
    	}
    	else {
    	   $ucuncu_kademe_gun = $bekledigi_gun-30;
               $odenecek_tutar = $birinci_kademe_fiyat*15 + $ikinci_kademe_fiyat*15 + $ucuncu_kademe_fiyat*$ucuncu_kademe_gun ;
    	    return $odenecek_tutar;
    	}
    }
  • 13-07-2017, 09:13:36
    #3
    selcukhoca adlı üyeden alıntı: mesajı görüntüle
    Aslında soru programlamadan çok algoritma sorusu. Algoritmayı oturtursan herhangi bir dilde yazılabilir. Genel olarak bir cevap vermek istiyorum.
    Yazdıklarımı kod olarak değil işleyiş olarak düşün. Anlaşılması için uzun uzun yazdım. Test imkanı olmadığı için hata olursa affola.

    Öncelikle bir form yapılacak.

    1. Takvimden giriş ve çıkış günleri seçilecek. ($giris_tarihi, $cikis_tarihi)
    2. Aracın tipi seçilecek ($arac_tipi) // Databasedeki alan ile eşlemesi için fiyat_20 veya fiyat_40 değerleri almalı
    3. Tarife tipi seçilecek ($tarife_tipi)

    Formdan gelen verileri işleyen sayfa
    $bekledigi_gun = $cikis_tarihi-$giris_tarihi; //Çıkış tarihinden giriş tarihini çıkarıp gün sayısını buluyoruz.
    
    if($tarife_tipi=='1') // Standart tarife 
    {    
        $ucret = $db->query('select $arac_tipi from tarife_detay where tarife_id=1 and ilk_gun <= $bekledigi_gun and son_gun >= $bekledigi_gun');
    
        /*
                    Sorgu Açıklaması: Tarife Detay tablosundan tarife_id si 1 olan, ilk_gun değeri beklediği günden küçük, son_gun değeri beklediği günden büyük değerleri bul
                    Bulunan satırın arac tipine göre (fiyat_20 veya fiyat_40) degerini ver.
       */
                    
        $odenecek_tutar = $ucret*$bekledigi_gun;
        return $odenecek_tutar;                        
    }
    else // Toplamalı tarife
    {
                    $birinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 0 and son_gun >= 15');
                    $ikinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 16 and son_gun >= 30');
                    $ucuncu_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 31 and son_gun >= 60');
    
       if($bekledigi_gun <=15)
                    {                
                       $odenecek_tutar = $birinci_kademe_fiyat*$bekledigi_gun;
                       return $odenecek_tutar;                                        
                    }
        else if($bekledigi_gun >=16 and $bekledigi_gun >=30)
                    {
                       $ikinci_kademe_gun = $bekledigi_gun-15;
               $odenecek_tutar = $birinci_kademe_fiyat*15 + $ikinci_kademe_fiyat*$ikinci_kademe_gun; 
                    return $odenecek_tutar;                            
                    }
                    else {
                       $ucuncu_kademe_gun = $bekledigi_gun-30;
               $odenecek_tutar = $birinci_kademe_fiyat*15 + $ikinci_kademe_fiyat*15 + $ucuncu_kademe_fiyat*$ucuncu_kademe_gun ;
                        return $odenecek_tutar;
                    }
    }
    hocam çok detaylı ve anlaşılır yazmışsınız, teşekkür ederim.

    fakat bu tarifeler değişmeli tarifelerdir. toplamalı tarife için konuşursak gün değerleri değiştiği için ;

       $birinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 0 and son_gun >= 15');
       $ikinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 16 and son_gun >= 30');
       $ucuncu_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 31 and son_gun >= 60');
    bu kod işe yaramayacaktır. Bunun yerine nasıl bir çözüm bulabiliriz.
  • 13-07-2017, 09:46:39
    #4
    O zaman ilgili degerleri baslangictaki formdan elle girdireceksin. Sonra ilgili yerde kullamirsin.
  • 13-07-2017, 11:08:09
    #5
    selcukhoca adlı üyeden alıntı: mesajı görüntüle
    O zaman ilgili degerleri baslangictaki formdan elle girdireceksin. Sonra ilgili yerde kullamirsin.
    hocam çok teşekkür ederim,

    bir de şöyle bir sorun var toplamalı kademe örneğinde 3 farklı gün aralığı ve fiyattan oluşmuş. fakat bu gün aralıkları da değişmektedir.
    örneğin ;
    0-5
    6-15
    16-55
    56-88
    gibi değişken olabiliyor. bunu nasıl aşabiliriz.
  • 13-07-2017, 18:13:20
    #6
    Anlatmak istedigini tam anlayamadim. Örnek vererek anlatirsan tekrar bakarim.
  • 13-07-2017, 18:51:45
    #7
    selcukhoca adlı üyeden alıntı: mesajı görüntüle
    Anlatmak istedigini tam anlayamadim. Örnek vererek anlatirsan tekrar bakarim.
    hocam toplamalı tarife için yazıyorum.
    ilk_gun son_gun değerleri artıp azalabiliyor. mesela
    örneğin ;
    0-5
    6-15
    16-55
    56-88

    bu nedenle aşağıdaki sorgu işe yaramıyor.

    $birinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 0 and son_gun >= 15');
    $ikinci_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 16 and son_gun >= 30');
    $ucuncu_kademe_fiyat = $db->query('select $arac_tipi from tarife_detay where tarife_id=2 and ilk_gun <= 31 and son_gun >= 60');

    çünkü birinci_kademe_fiyat, ikinci_kademe_fiyat ve ucuncu_kademe_fiyat şeklinde yazılmış bir müdehale ile gün aralıkları değişbilir ve 4 hatta 5. kaeme bile oluşabilir.
  • 13-07-2017, 20:07:44
    #8
    O zaman ilk önce tarifeleri elde edeceğimiz bir sorgu yazarız

    $tarifeler = $db->query('select * from tarife_detay where tarife_id=2')
    Daha sonra ne kadar tarife varsa döngüye sokarız

    ;
    $odenecek_tutar = 0
    
    foreach ($tarifeler as $tarife) 
    {
    	// Eğer beklediği gün tarifenin ilk gününden küçükse işlem yapma
    if ($bekledigi_gun < $tarife['ilk_gun'])
    	{
    		$odenecek_tutar = $odenecek_tutar +0;
    	}
    	else
    	{    
                   // Eğer beklediği gün tarifenin son gününü aşıyorsa
    		if($bekledigi_gun > $tarife['son_gun'])
    		{
    			$aralik = $tarife['son_gun']-$tarife['ilk_gun'];
    			$odenecek_tutar = $odenecek_tutar +  $aralik * $tarife[$arac_tipi];
    		}
                    // Eğer beklediği gün tarife aralığında ise
    		else 
    		{
    			$artik_gun = $bekledigi_gun-$tarife['ilk_gun'];
    			$odenecek_tutar = $odenecek_tutar + $artik_gun  * $tarife[$arac_tipi];
    		}
    	}	
    }
    
    echo $odenecek_tutar;
    Döngü içerisinde fiyat hesaplanır.