|  | 
	                
  
    | 
	 
        รบกวนผู้รู้ช่วยผมด้วยครับคือต้องการเขียน function php คำนวณสูตรทางคณิตศาสตร์อ่ะครับ ว่ามีแนวทางแบบไหน     |  
    |  |  
 
              
  
    | 
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ยังไงครับ แทนที่ค่าตัวแปร หรือว่าอะไรครับ  
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 12:49:35 | By :
                            mr.win |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ในตัวอย่างที่คุณให้มา มีค่าคงที่กี่ตัว 1+2*9-2/2*(9/3)+(7*(5+3)) <<<<-----
 
 คือคุณต้องวิเคราะห์ก่อนว่าโปรแกรมที่จะเขียนทำงานยังไง ต้องรับค่าอะไรบ้าง และรับมากี่ตัว
 
 เช่น ผมต้องการหาพื้นที่สี่เหลี่ยมมุมฉาก ซึ่งหาได้ตามสูตร กว้าง x ยาว
 เพราะฉะนั้นโปรแกรมของผมต้องรับค่าตัวแปรทั้งหมด 2 ตัว พอจะเขียน function ได้ดังนี้
 
 Code (PHP)
 
 function rectangle($w,$h){
    $result = $w*$h;
    return $result;
}
echo rectangle(5,4);
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 14:26:52 | By :
                            arm8957 |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | คือ ให้รับ ค่ามาแบบนี้ 1+2*9-2/2*(9/3)+(7*(5+3)) จากการกรอกของผู้ใช้จากนั้น ก็ให้เรามาหาค่าที่เขากรอกมาครับ สมมติ เราจะแยก คำนวณยังไง เพราะมันมี operator มาเยอะและวงเล็บซ้อนลงเว็บอีกครับ
 พอจะเข้าใจผมไหมครับ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 15:29:25 | By :
                            ่่่่Jack_Dev |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | อ่านเรื่อง ลำดับความสำคัญของ operator ครับ แล้วคุณจะเข้าใจหลักการการทำงานของ operator ว่า operator ทำงานก่อนหลัง 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 15:34:20 | By :
                            arm8957 |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ตรรกะ ทางคณิตศาสตร์ มันทำให้เองครับ แค่เอาตัวแปรที่เค้าใส่ มา ให้ถูกพอ 
 เช่น
 $input = 1+2*9-2/2*(9/3)+(7*(5+3));
 echo input;
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 15:37:00 | By :
                            teez1232002 |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | พอจะมีตัวอย่างโปรแกรม ที่สำเร็จ เห็นภาพไหมครับ ขอบคุณอย่างสูง 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 15:44:36 | By :
                            ่่่่Jack_Dev |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | Code (PHP) 
 function test($n1,$n2,$n3,$n4,$n5,$n6,$n7,$n8,$n9,$n10){
    $result = $n1+$n2*$n3-$n4/$n5*($n6/$n7)+($n8*($n9+$n10));
    return $result;
}
echo test(1,2,9,2,2,9,3,7,5,3);
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 15:52:09 | By :
                            arm8957 |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | วิธีที่ 1 -ทำเป็นประโยคให้คอมพิวเตอร์รู้จัก (ถ้าเคยศึกษาเกี่ยวกับ Data Structure and Algorithm จะรู้ ผมก็จำชื่อวิธีการไม่ได้ละ)
 -คำนวณ (มันจะใช้ Strack ช่วยคำนวณ)
 สรุปว่า มันวุ่นวายเกินไป อย่าทำมันเลยถ้าไม่มีประสบการณ์
 
 วิธีที่ 2
 -ต้องเขียนฟังก์ชันเป็น
 -เอาง่ายๆ วนลูป for เช็ค String เอา หรือวิธีอะไรก็แล้วแต่
 -จับคู่ ค่าตัวเลข แล้วคำนวณ
 เช่น
 1+2+(3+4)
 เอา 1+2 ก่อน
 จะได้ 3+(3+4)
 พอเจอวงเล็บ ก็ให้ทำ
 3+4
 จะได้ 3+7
 มันยากตรงที่เราต้องจัดการกับ String
 แต่ถ้าเขียนเป็นแบบ recersive น่าจะง่ายขึ้น
 
 ผมให้ได้แค่หลักการ ไม่เขียนให้ดูนะครับ
 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 16:11:46 | By :
                            RootElement@KMUTNB |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ถ้าต้องการแค่ + - * / ตามโจทย์ข้างบน สามารถทำได้ด้วย eval() ครับ โดยใช้ return ในโค้ดที่ eval() 
 แนวทางคือ
 ตัดตัวอักษรอื่นที่ไม่ใช่ช่องว่าง 0 - 9 และเครื่องหมาย + - * / รวมถึงวงเล็บทิ้ง
 และ eval() มันครับ โดยต้องใช้ @ operator ดัก error ไว้ ไม่งั้นถ้า syntax ผิด โปรแกรมจะจบการทำงาน
 เมื่อดัก error แล้ว หากโค้ดที่มาจากผู้ใช้ไม่มี syntax error จะได้ค่ากลับมาเป็นตัวเลข นอกนั้น false ครับ
 
 Code (PHP)
 
 <?php
$expr = '1+2*9-2/2*(9/3)+(7*(5+3))';
$expr = preg_replace('/[^\s0-9\(\)\+\-\*\/]/u', '', $expr);
$result = @eval("return $expr;");
if ($result !== false) {
	echo $result;
} else {
	echo 'ERROR!';
}
 |  
              | 
 ประวัติการแก้ไข
 2013-07-03 19:56:09
 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-03 19:55:20 | By :
                            cookiephp |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  
 
        
          |  |  |  |  |  
          |  |  | 
            
              | ขอบคุณทุกท่านที่มาให้ความรู้ครับ 
 |  
              | 
                
                  |  |  |  |  
                  |  | 
                      
                        | Date :
                            2013-07-04 09:22:47 | By :
                            Jack_Dev |  |  |  
                  |  |  |  |  |  |  |  
          |  |  |  |  |  |  |